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中看到变量作为循环的条件为假了,但依旧跳不出循环。这段参考的是,昵称为果子哥哥的博主。

你可能感兴趣的:(STM32L0系列之按键中断所遇问题)