找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2799

积分

1

好友

388

主题
发表于 前天 05:06 | 查看: 7| 回复: 0

按键检测是嵌入式设备中再常见不过的功能了。最开始,我采用状态机的方式实现消抖和状态判断。后来,了解到一个名为 multi-button 的开源小组件,它支持单击、双击、长按等多种事件检测,非常好用,我便一直沿用下来。

在开发中,我们确实要尽量避免“重复造轮子”。但这次,我想尝试用AI来实现一个类似的功能,看看效果究竟如何。

硬件与工程准备

我手头有一块自制的STM32开发板,其PA3和PA4引脚外接了按键。硬件连接如下图所示:

STM32F103C8Tx微控制器引脚图

接着,我在STM32CubeMX中配置了这两个GPIO为上拉输入模式,并开启了USART1串口用于打印调试信息。同时,配置了一个定时器,使其每20ms产生一次中断,用于后续的定时按键扫描。工程模板中还预先做好了串口重定向(printf)的设置。

向AI清晰描述需求

准备就绪后,我打开了AI助手,开始清晰地描述我的需求。我的习惯是,不会一上来就让AI直接写代码,而是先让它理解场景和方案。

我向AI说明:当前工程已配置好GPIO(KEY_STA_Pin, KEY_SEL_Pin)、定时器2(20ms中断)和USART1。现在需要实现一个放置在key文件夹下的按键扫描函数,利用定时器中断每20ms检测一次按键状态,实现单击、双击和长按的检测功能,并包含打印信息与按键消抖处理。

向AI描述STM32按键检测需求

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

AI确认实现方案并准备开始工作

代码生成与测试

得到我的肯定答复后,AI开始编写代码。而我,则利用这段时间去活动了一下。

大约三分钟后,代码编写完成。我将生成的key.hkey.c文件集成到工程中,初次编译遇到了一些小错误(主要是头文件包含路径问题),稍作修改后便编译成功。下载程序到板子,打开串口调试助手,效果令人满意!

串口调试助手显示的按键检测结果

从打印信息可以看到,KEY_STAKEY_SEL两个按键的单击、双击、长按事件都被准确地检测并打印出来,一次成功!

与开源组件的对比分析

出于好奇,我将著名的开源按键库 multi-button 的源码加入工程,并让AI对比它自己编写的代码与这个开源库的实现有何异同。

AI给出了非常系统的分析总结:

AI对自实现与multi-button库的对比分析总结

总结下来,multi-button 是一个功能丰富、设计完善的通用按键处理库,采用链表管理,支持动态扩展按键、8种事件类型以及组合按键、连按等高级功能,适合复杂的交互场景。

而AI本次实现的代码则更加简单直接,采用状态机轮询方式,代码紧凑易懂,学习成本低,非常适合固定按键数量、需求明确(如只需单击、双击、长按)的快速开发场景。这次实践也证明了,在 C语言 和嵌入式编程领域,AI已经能够很好地理解需求并生成可用的、独立的解决方案。

思考:AI时代如何“造轮子”

回到最初的观点:开发中应尽量避免重复造轮子。但在AI工具普及的今天,当我们面对一些基础但略显繁琐的功能时,心态似乎发生了变化。我们不再急于去寻找一个现有的“轮子”,而是可以轻松地让AI“造”一个恰好符合当前车型的轮子。

这意味着,大量简单、标准的“轮子”可能会被重复创造。但同时,这也迫使那些通用的、开源的“轮子”必须提供更高的价值上限——更丰富的功能、更优异的性能或更极致的效率——才能体现出不可替代性。毕竟,如果AI能快速生成一个满足需求的简洁实现,谁还会花费时间去寻找、学习和集成一个功能大而全的库呢?

这种变化,对于开发者社区而言,既是挑战也是机遇。它鼓励我们更多地进行高阶思考和创新,而将基础实现的负担交给工具。想了解更多类似的嵌入式开发技巧或开源项目实战,欢迎来 云栈社区 交流讨论。




上一篇:教育行业SRC漏洞挖掘实战指南:从信息收集到常见漏洞利用
下一篇:C++20协程在高并发系统中的应用:从原理到实战,彻底告别回调地狱
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-24 01:38 , Processed in 0.395808 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表