heimaojingzhang 发表于 2021-6-4 19:43

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

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

1、软件环境:Keil uv5.15

2、硬件环境:STM32F103C8T6 最小系统

在一个项目中需要用到STM32 的PA6引脚,发现工作异常。由于是自己做的最小系统,所以检查了芯片引脚,并没有发现虚焊、或者跟其他引脚连在一起的情况,初步判断是单片机或者程序的问题,硬件电路应该没有问题,硬件电路如下所示。



手工做的板子,电路还在调试,还没来得及清洁,所以有点脏。拿出示波器观察波形输出




heimaojingzhang 发表于 2021-6-4 19:44

从示波器可以看出,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);
        }
}


heimaojingzhang 发表于 2021-6-4 19:45

整个过程没有发现什么异常的地方,突然想到之前有个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);
}


heimaojingzhang 发表于 2021-6-4 19:45

输出波形如下:

heimaojingzhang 发表于 2021-6-4 19:46

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


页: [1]
查看完整版本: STM32 PA6引脚输出低电平不正常的问题