上一节已经实现了按键的非阻塞检测和长按短按,接下来实现外部中断。
        外部中断:检测对应引脚的上升沿或下降沿或者双边沿触发,如果有则产生对应的中断或者事件。
        外部中断的作用:
                 1.检测GPIO口引脚电平是否有上升沿或下降沿或者双边沿的跳变。
                  2.可以当做开关
       下面我来通过按键的例子来实现外部中断,同样先在工程中添加exti.c和exti.h两个文件,并添加到自己的工程中。
       首先我们先通过GD32的参考手册查看有几个外部中断,GD32一共有23个外部中,如下图所示
接着查看哪些GPIO口对应的哪条外部中断线,如下图所示
        一般我们用到前16个外部中断线即EXTI0-EXTI15,在低功耗场景有时会用到EXTI17  RTC闹钟唤醒事件。今天使用的GPIO口引脚是PA0,用到的外部中断线是EXTI0。
        接下来通过配置外部中断来实现对应的功能,由于我使用的按键是直接接地的,GPIO口引脚配置成上拉输入,边沿检测使用的是上升沿(即判断松手时的状态)。
        
        在前面LED灯驱动的章节的基础上新增了LED灯翻转的功能。
        通过在主函数调用延时来验证按键是否按下即灯是否翻转
        实现现象
按键每按下一次,灯进行翻转一次。
        第一次按下,灯会进行点亮
        再按一下,灯就会熄灭。
        至此,外部中断你已经学会。
        上面是没有消抖的功能,在这个基础上可根据上一章所说的内容实现外部中断+按键的消抖+长按和短按。
        下面我来实现外部中断+按键的消抖+长按短按
        首先将Key_period的变量类型改为16位的,8位的已经不能满足我们的需求了
        其次将外部中断的模式改为双边沿检测
        最后在中断服务函数中进行对Key_period的值进行判断区分长按还是短按
        实验现象
        按键短按,蓝色LED灯点亮
        按键长按,蓝色LED灯熄灭
        至此,你已经掌握了通过外部中断来实现按键的消抖、区分长按和短按。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐