STM32 PA6引脚输出低电平不正常的问题

使用环境(蓝色粗体字为特别注意内容)

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初始化屏蔽掉即可,具体原因有空再去了解吧~~~~。

猜你喜欢

转载自blog.csdn.net/pang9998/article/details/85460017
今日推荐