按键按下,LED 点亮,但是,理论和现象不符

通过 Debug ,解决了一个 Bug,很开心😄,记录下

想实现的效果:按下 PB12 上的按钮,PA7 上的 LED 点亮;松开,LED 熄灭

单片机型号:STM32F103C8T6

PB12 为上拉电阻:断开高电平,闭合低电平;因此,按键按下时,PB12 为低电平

c 复制代码
// PB12 为上拉电阻:断开高电平,闭合低电平;因此,按键按下时,PB12 为低电平
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {
    // LED 的点亮方式,取决于 LED 的电路连接方式
    // 因为,LED_GREEN,正极接 VCC,负极接 PA7
    // 因此,当 PA7 为负极的时候,有 3.3 V -> 0 的电压差,LED 点亮
    HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
} else {
    HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
}

结果:按键按下,没有反应

因为 PB12 默认有上拉电阻,我就设置成了如下 👇

c 复制代码
GPIO_InitStruct.Pin = KEY1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;  // <--------

怎么没反应??

于是,改成 GPIO_NOPULL,👇

c 复制代码
GPIO_InitStruct.Pin = KEY1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;  // <--------

此时,LED 绿灯,是亮的;也就是说,按键断开,是低电平,走的是 HAL_GPIO_WritePin - GPIO_PIN_RESET

所以,我尝试将代码,改成如下

c 复制代码
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_SET) {  // <--- RESET 改成了 SET
    HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
} else {
    HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
}

结果现象:灯是亮的

但是,按下按钮之后,灯,更亮了

不清楚应该如何排查

不知道为什么,好难受,突然不自信了,我学的东西难道都是错的?🫨 好像心里被什么东西抓了一下,很不舒服 😧


突然冒出的思路:打个断点看看

按键,在【浮空输入】的情况下:打个断点,debug 发现:每次 while 循环,【按键电平,不确定】(一会高、一会低)

每次 while 循环,GPIOA -> IDR 的值,可能会发生变化(在 0x0000FFDB、0x0000EFDB 之间变化)

因此得出结论:PB12,浮空输入,按键松开时,电平不确定

将PB12 输入模式,改成【上拉】

按键,在上拉情况下,PB12,按键松开时,【电平确定】,IDR 为 0x0000FFDB

因此,发现问题:PB12 要设置为上拉输入

并且,导致当前的问题的原因,是:按键输入,无效

按键为什么会无效呢?

后来,查看原理图,发现,PB12 是接地的,而我之前,接的是正极

相关推荐
创界工坊工作室1 小时前
35-基于AT89C51单片机的罐头生产线传送系统设计
stm32·单片机·嵌入式硬件·51单片机·proteus·生产线
qq_401700411 小时前
MCU串口接收不定长数据的三种方案,哪种最稳?
stm32·单片机·嵌入式硬件
inrichtt2 小时前
第七课时:STM32时钟系统揭秘:从零理解时钟树
c语言·数据结构·stm32·单片机·嵌入式硬件
硅基手札2 小时前
【Linux 内核专栏 17】进程间通信 IPC(上)— 管道·信号·System V IPC·mmap·文件锁
linux·运维·服务器·stm32·单片机·mcu
Zw-awa3 小时前
PID 用顺了,然后呢:增强手术与前馈
stm32
zcmodeltech3 小时前
沙盘模型控制系统STM32和PLC方案对比:选型逻辑与代码实现
stm32·嵌入式硬件·自动化
Lxx_Zw5 小时前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
c语言·stm32·单片机·嵌入式硬件
WD1372980155719 小时前
WD5030L,为充电桩、工业设备、5G 基站、车载系统、消费电子提供电源,7-30V 的宽压输入
stm32·单片机·嵌入式硬件·5g·车载系统·51单片机
创界工坊工作室21 小时前
30-基于STM32的小麦烘干塔温度控制系统设计
stm32·单片机·嵌入式硬件·proteus
单片机仿真设计1 天前
【proteus仿真设计】基于 STM32 的开荒机器人遥控控制系统设计(仿真图+程序)
stm32·嵌入式硬件·机器人·proteus