跳到主要内容

按键与中断

补充内容,配合主课阅读。

按住按键不等于按下一次。先把电平、边沿和按键事件分开,程序就不容易乱。

先确认电平​

按键接3.3 V并下拉时,松开是0,按下是1;接GND并上拉时正好相反。开漏写1只是释放引脚,高电平还要靠上拉。

先把松开、按下的读数记下来,再写判断。不要凭模块指示灯猜有效电平。

抖动怎么处理​

触点刚接触时可能连续跳几次。检测到变化后,记下时间;经过一小段稳定时间,再读一次,确认状态才更新。去抖时间按实际按键调整,10~20 ms可以作为起点。

主循环只对“稳定的松开变为按下”产生一次事件。长按再单独比较保持时间,别在中断里延时等松手。矩阵键盘也是先逐行扫描,再对读到的按键状态去抖。

回调没进,沿路查​

GPIO边沿 → EXTI挂起 → NVIC → IRQHandler → HAL处理 → 用户回调。

GPIO来源、触发边沿、NVIC使能都要对。EXTI的PR对应位写1清除;使用HAL时先看处理函数已经做了什么。共享IRQ入口还要区分具体引脚。

中断里做多少事​

先取走必要数据、记录事件,再交给主循环处理。打印长字符串、刷新屏幕、等待外设,都可能拖住后面的中断。

volatile让编译器按要求读写变量,但不能把多步操作变成原子操作。一个flag也只能表示“发生过”,不能记住发生了几次。需要保留每次事件时,用计数或队列,并处理满的情况。

主循环可以按“等待、处理、发送”分状态,每轮只推进能做的一步,不要卡在一个while里等外设。