使用环境(蓝色粗体字为特别注意内容)
1、软件环境:Keil uv5.15
2、硬件环境:STM32F103C8T6 最小系统
在一个项目中需要用到STM32 的PA6引脚,发现工作异常。由于是自己做的最小系统,所以检查了芯片引脚,并没有发现虚焊、或者跟其他引脚连在一起的情况,初步判断是单片机或者程序的问题,硬件电路应该没有问题,硬件电路如下所示。
手工做的板子,电路还在调试,还没来得及清洁,所以有点脏。拿出示波器观察波形输出
从示波器可以看出,PA6引脚输出低电平无法到0v,而是2.1v左右。查看引脚初始化代码如下
void gpioInit()
{
GPIO_InitTypeDef g;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
g.GPIO_Pin = GPIO_Pin_6;
g.GPIO_Speed = GPIO_Speed_50MHz;
g.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOA, &g);
}
main函数如下
void main()
{
(省略一些初始化工作)
while(1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_6);
delay_ms(200);
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
delay_ms(200);
}
}
整个过程没有发现什么异常的地方,突然想到之前有个demo是正常的,经排查,发现初始化代码写成如下的形式(即将GPIO_Pin_6改为GPIO_Pin_All)就能够正常输出
void gpioInit()
{
GPIO_InitTypeDef g;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
g.GPIO_Pin = GPIO_Pin_All;
g.GPIO_Speed = GPIO_Speed_50MHz;
g.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOA, &g);
}
输出波形如下:
很纳闷,为什么将GPIOA引脚初始化为GPIO_Pin_6工作异常,而初始化为GPIO_Pin_All就正常呢?继续排查,发现问题竟然是出现在SPI初始化函数中!将标红的语句注释掉即可
SPI_InitStructure.SPI_CPOL =SPI_CPOL_High ; //始终悬空高 // SPI_CPOL_Low//始终悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第2个时钟沿捕获 //SPI_CPHA_1Edge第1个时钟沿捕获
// SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //硬件控制NSS信号(ss) 置成软件时,NSS脚可以他用
查看数据手册可以发现PA6引脚跟SPI通信相关,可能是操作PA6引脚的时候跟SPI冲突所致,正好项目中没有用到SPI通信,所以将SPI初始化屏蔽掉即可,具体原因有空再去了解吧~~~~。