any_014 发表于 2015-7-20 17:25:14

STM32单片机IO口控制出错。

本帖最后由 any_014 于 2015-7-20 17:34 编辑

STM32io口串电阻再接LED灯到3.3V,然后把IO口设置成开漏模式,程序里把IO口设置成ON(输出低电平),结果灯亮了,用示波器观测IO口电压,发现是个PWM波。
把IO口设置成OFF(输出截止),结果灯都灭了,IO口波形是有个下拉尖峰的高电压波形。

void GPIO_Config(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
      
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
      GPIO_Init(GPIOD, &GPIO_InitStructure);
}


int main(void)
{
      u8 value;
      GPIO_Config();
      POW(ON);
      RUN(ON);
      ERR(ON);
//          USART1_Config();
//      SPI_Config();
      while(1)
      {
//                ADT7310Delay(10000);
//                value = ReadFromADT7310ViaSPI(0x01);
//                ADT7310Delay(10000);
//                USART_SendData(USART1, value);
//                USART_SendData(USART1, 0x55);
//                GPIOA -> ODR ^= GPIO_Pin_1;
//                GPIOB -> ODR ^= GPIO_Pin_3;
      }
}

#ifndef __GPIO_H
#define __GPIO_H

#include "stm32f10x.h"

#define ON 0
#define OFF 1

#define ERR(a)if(a)\
                                        GPIO_SetBits(GPIOA, GPIO_Pin_0);\
                              else\
                                        GPIO_ResetBits(GPIOA, GPIO_Pin_0)

#define RUN(a)if(a)\
                                        GPIO_SetBits(GPIOA, GPIO_Pin_1);\
                              else\
                                        GPIO_ResetBits(GPIOA, GPIO_Pin_1)

#define POW(a)if(a)\
                                        GPIO_SetBits(GPIOA, GPIO_Pin_2);\
                              else\
                                        GPIO_ResetBits(GPIOA, GPIO_Pin_2)

#define ADT7310_CS(a)          if(a)\
                                                      GPIO_SetBits(GPIOD, GPIO_Pin_0);\
                                                else\
                                                      GPIO_ResetBits(GPIOD, GPIO_Pin_0)

#define AD7193_CS(a)          if(a)\
                                                      GPIO_SetBits(GPIOD, GPIO_Pin_1);\
                                                else\
                                                      GPIO_ResetBits(GPIOD, GPIO_Pin_1)

#define ADG738_CS(a)          if(a)\
                                                      GPIO_SetBits(GPIOD, GPIO_Pin_2);\
                                                else\
                                                      GPIO_ResetBits(GPIOD, GPIO_Pin_2)

#define SPI_SCL(a)          if(a)\
                                                      GPIO_SetBits(GPIOB, GPIO_Pin_3);\
                                                else\
                                                      GPIO_ResetBits(GPIOB, GPIO_Pin_3)

#define SPI_MOSI(a)          if(a)\
                                                      GPIO_SetBits(GPIOB, GPIO_Pin_5);\
                                                else\
                                                      GPIO_ResetBits(GPIOB, GPIO_Pin_5)

#define SPI_MISO()                GPIO_ReadInputDataBit(GPIOB, 4)

void GPIO_Config(void);

#endif

any_014 发表于 2015-7-20 17:39:02

好象是焊接的问题,STM32在不停的复位。:L

数码小叶 发表于 2015-7-20 21:09:08

楼主自己找到原因了,:D

你好我好大家好! 发表于 2015-7-21 10:07:29

数码小叶 发表于 2015-7-20 21:09
楼主自己找到原因了,

那就好                           

any_014 发表于 2015-7-21 10:11:55

数码小叶 发表于 2015-7-20 21:09
楼主自己找到原因了,

还没解决...
发现配置IO口的时候,屏蔽掉PD0,PD1,PD2的配置,就正常了。
如果加上,则单片机不停的复位。
看上去像是复位芯片引起的,但测量了下复位芯片的VCC,还算正常。
怀疑是PD0,PD1,PD2外围电路不正常,PD配置后可能吧VCC拉低了,但我用示波器观测不到VCC变化。
void GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
}

any_014 发表于 2015-7-21 10:51:20

就是外围电路设计不合理的原因,IO口没有接限流电阻直接下拉光耦。
一个两个的话没事,多了的话就不停复位了。
应该是复位芯片引发的复位,但示波器观测不到VCC变化,也许太快了?100Mz的示波器应该能采样到吧?
修改了电路后现在正常。
页: [1]
查看完整版本: STM32单片机IO口控制出错。