STM32L0系列之按键中断所遇问题

前两天在使用stm32实现按键切换各种模式的过程中,遇到的一个小问题,仅此记录一下。

在按键中断的回调函数中,用一个自定义的状态标志keyTriFlag来获得当前按键端口的电平。然后在另一个功能函数里面有一个while循环,一直在判断按键是否还在按下状态,如果按键松开,跳出循环。
即 while(keyTriFlag == KEY_ON);

当我只是普通定义这个状态标志位的时候:uint8_t keyTriFlag = KEY_OFF; 按键时会出现的情况:
在仿真条件下,watch里面即使keyTriFlag 已经是KEY_OFF了,但依旧会在while循环里面跳不出来。搜索这个问题答案应该都会找到,我也是看了别人的讲解才知道原来,对于这种可能在多个任务中访问该变量的,应该把此变量设置为易变变量,即设置为volatile uint8_t keyTriFlag = KEY_OFF;这样,对于这种被不断修改的变量,就不会在中断函数和主函数中造成读写差异。

这个差异就是,在循环中变量是读取寄存器里面的值,进入到中断时,中断会从内存加载变量到寄存器,修改完之后又存到内存里,退出中断,回到循环,但此时循环里面所使用的变量并没有重新加载变量,所以即使在watch中看到变量作为循环的条件为假了,但依旧跳不出循环。这段参考的是,昵称为果子哥哥的博主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值