LVGL按键与编码器驱动:从一次诡异的界面卡死说起去年做一款智能家居面板,硬件用的是ESP32-S3加一个旋转编码器,屏幕是480x320的RGB屏。调试到凌晨三点,发现一个诡异现象:旋转编码器转得快的时候,界面偶尔会卡住,触摸还能用,但编码器完全失效。用逻辑分析仪抓编码器波形,A相B相时序完全正常,中断响应也及时。折腾了两天,最后发现是LVGL的输入设备处理队列被撑爆了——编码器事件产生速度超过了LVGL的消化速度,而我的中断服务函数里居然调用了lv_indev_read()。这个坑让我意识到,LVGL的按键和编码器驱动,远不是接几根线、配几个GPIO那么简单。今天这篇笔记,就把编码器驱动里那些容易翻车的地方掰开揉碎讲清楚。硬件连接与去抖:别信芯片内部上拉编码器通常有5个引脚:CLK(A相)、DT(B相)、SW(按键)、VCC、GND。很多人图省事直接用芯片内部上拉,结果在工业现场频繁误触发。我的经验是:外部上拉电阻必须加,4.7kΩ到10kΩ,且必须靠近编码器引脚放置。内部上拉电阻通常在30kΩ到50kΩ,对于机械编码器来说,接触电阻变化会导致电平不稳定。去抖电路方面,简单应用可以用RC滤波加施密特触发器,比如SN74HC14。如果板子空间紧张,至少要在软件里做去抖。但注意:不要在中断服务函数里做软件去抖延时,那会阻塞其他中断。正确做法是记录上次触发时间,在中断里只做时间戳标记,由主循环或定时器轮询判断。编码器状态机:别用简单的上升沿触发