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
好象是焊接的问题,STM32在不停的复位。:L 楼主自己找到原因了,:D 数码小叶 发表于 2015-7-20 21:09
楼主自己找到原因了,
那就好 数码小叶 发表于 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);
} 就是外围电路设计不合理的原因,IO口没有接限流电阻直接下拉光耦。
一个两个的话没事,多了的话就不停复位了。
应该是复位芯片引发的复位,但示波器观测不到VCC变化,也许太快了?100Mz的示波器应该能采样到吧?
修改了电路后现在正常。
页:
[1]