按键与中断
补充内容,配合主课阅读。
按住按键不等于按下一次。先把电平、边沿和按键事件分开,程序就不容易乱。
先确认电平
按键接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里等外设。