用外部中断来检测外部按键有没有被按下是比较高效的一种方法,不像轮询那样始终占用MCU资源,所以我还是选择用中断的方式。
STM32的外部中断很灵活,外部中断0~外部中断15分别可以对应任意组GPIO
来看一下外部中断13(对应GPIOA_Pin13)的配置代码
首先强调的是使用外部中断需要打开AFIO时钟(配置之前先打开时钟,要不然配置没用)
选择是上升沿触发还是下降沿触发就要看你硬件电路是下拉电阻还是上拉电阻,这个要注意。
中断的开关应该是有两个,一个外部中断线自身的开关,还有一个NVIC控制的上一级开关,这两个都要打开。
抢占优先级和响应优先级很有意思,大家可以自行了解。
相信看过两次库函数开发的例子就会了解里面的套路,就是先定义初始化结构体参数,这个结构体里面其实就是要设置的寄存器值的变量类型,然后把结构体变量赋值给各寄存器,后面你可能会遇到结构体中自己的赋值都对,最后初始化后功能不正常,问题会在哪里呢?我之前有一次就碰到一次,查了好久,最后我大概知道问题出在哪里了!
有时一个初始化结构体类型里面的元素可能有5个,如果你把5个都正确赋值设置正确了,那基本上不会出问题,假如这个结构体类型里面元素有5个,而你使用的功能可能用4个就正确运行(前提是第5个值为默认值),你只配置了4个,这就会出现BUG,因为你在定义结构体变量的时候里面的默认值是随机的,你配置了其中的4个,还有一个是随机值,这就可能会导致程序运行出问题。
所以我的建议是遇到这种情况,你最好在定义完结构体变量后先初始化一下这个变量的默认值,比如:
继续说按键程序吧,对于使用中断来检测按键的程序,我认为仍然有必要在中断函数中进行"消抖"和"松键检测"这两种处理,要不然会出现按键不灵敏或者乱操作的BUG,体验不好。具体这样实现:
可能看着比较啰嗦,不过只是我自己的想法,等我慢慢提高。