按键检测是嵌入式设备中再常见不过的功能了。最开始,我采用状态机的方式实现消抖和状态判断。后来,了解到一个名为 multi-button 的开源小组件,它支持单击、双击、长按等多种事件检测,非常好用,我便一直沿用下来。
在开发中,我们确实要尽量避免“重复造轮子”。但这次,我想尝试用AI来实现一个类似的功能,看看效果究竟如何。
硬件与工程准备
我手头有一块自制的STM32开发板,其PA3和PA4引脚外接了按键。硬件连接如下图所示:

接着,我在STM32CubeMX中配置了这两个GPIO为上拉输入模式,并开启了USART1串口用于打印调试信息。同时,配置了一个定时器,使其每20ms产生一次中断,用于后续的定时按键扫描。工程模板中还预先做好了串口重定向(printf)的设置。
向AI清晰描述需求
准备就绪后,我打开了AI助手,开始清晰地描述我的需求。我的习惯是,不会一上来就让AI直接写代码,而是先让它理解场景和方案。
我向AI说明:当前工程已配置好GPIO(KEY_STA_Pin, KEY_SEL_Pin)、定时器2(20ms中断)和USART1。现在需要实现一个放置在key文件夹下的按键扫描函数,利用定时器中断每20ms检测一次按键状态,实现单击、双击和长按的检测功能,并包含打印信息与按键消抖处理。

经过几轮关于实现细节(如状态定义、消抖逻辑、双击间隔判断等)的确认后,AI给出了实现方案,并询问是否可以开始编码。

代码生成与测试
得到我的肯定答复后,AI开始编写代码。而我,则利用这段时间去活动了一下。
大约三分钟后,代码编写完成。我将生成的key.h和key.c文件集成到工程中,初次编译遇到了一些小错误(主要是头文件包含路径问题),稍作修改后便编译成功。下载程序到板子,打开串口调试助手,效果令人满意!

从打印信息可以看到,KEY_STA和KEY_SEL两个按键的单击、双击、长按事件都被准确地检测并打印出来,一次成功!
与开源组件的对比分析
出于好奇,我将著名的开源按键库 multi-button 的源码加入工程,并让AI对比它自己编写的代码与这个开源库的实现有何异同。
AI给出了非常系统的分析总结:

总结下来,multi-button 是一个功能丰富、设计完善的通用按键处理库,采用链表管理,支持动态扩展按键、8种事件类型以及组合按键、连按等高级功能,适合复杂的交互场景。
而AI本次实现的代码则更加简单直接,采用状态机轮询方式,代码紧凑易懂,学习成本低,非常适合固定按键数量、需求明确(如只需单击、双击、长按)的快速开发场景。这次实践也证明了,在 C语言 和嵌入式编程领域,AI已经能够很好地理解需求并生成可用的、独立的解决方案。
思考:AI时代如何“造轮子”
回到最初的观点:开发中应尽量避免重复造轮子。但在AI工具普及的今天,当我们面对一些基础但略显繁琐的功能时,心态似乎发生了变化。我们不再急于去寻找一个现有的“轮子”,而是可以轻松地让AI“造”一个恰好符合当前车型的轮子。
这意味着,大量简单、标准的“轮子”可能会被重复创造。但同时,这也迫使那些通用的、开源的“轮子”必须提供更高的价值上限——更丰富的功能、更优异的性能或更极致的效率——才能体现出不可替代性。毕竟,如果AI能快速生成一个满足需求的简洁实现,谁还会花费时间去寻找、学习和集成一个功能大而全的库呢?
这种变化,对于开发者社区而言,既是挑战也是机遇。它鼓励我们更多地进行高阶思考和创新,而将基础实现的负担交给工具。想了解更多类似的嵌入式开发技巧或开源项目实战,欢迎来 云栈社区 交流讨论。