打印
[应用相关]

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

[复制链接]
761|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用环境(蓝色粗体字为特别注意内容)

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 | 只看该作者

输出波形如下:


使用特权

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


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

4102

帖子

4

粉丝