暂时关闭EXTI外部中断的一个坑 HK32(stm32没有测试过)
一开始的外部中断是通过这个宏函数来关闭的和开启
#define DisableEXTI_Key() (EXTI->IMR &=~((1<<KEY1_Pin)+(1<<KEY2_Pin)+(1<<KEY3_Pin))) //PA0、PC2、3
#define EnableEXTI_Key() (EXTI->IMR |= ((1<<KEY1_Pin)+(1<<KEY2_Pin)+(1<<KEY3_Pin))) //PA0、PC2、3
这样会导致一个问题(在HK32芯片中,stm32芯片我就不知道咯),在IMR(Interrupt Mask Register)寄存器被清除的期间,如果有外部中断信号发生,这个状态会被保存,直到IMR被设置的同时 PR(Pend Register)寄存器也同步被设置。
我们一般在关闭外部中断的时候不希望对外部中断的状态进行保存,而上面代码的设置方法会对外部中断的状态进行暂存(存在哪我也不知道),在外部中断打开的时候立刻去响应。可能不符合一些业务逻辑,在刻薄的业务下有可能导致程序的崩溃。
所以我在想能不能关闭触发方式来达到关外部中断的功能,代码如下
#define DisableEXTI_Key() (EXTI->FTSR &=~((1<<KEY1_Pin)+(1<<KEY2_Pin)+(1<<KEY3_Pin))) //PA0、PC2、3
#define EnableEXTI_Key() (EXTI->FTSR |= ((1<<KEY1_Pin)+(1<<KEY2_Pin)+(1<<KEY3_Pin))) //PA0、PC2、3
我们的代码中只有下降沿触发,故只需要对下降沿进行开启和关闭。改完之后一跑,符合在关闭外部中断的时候不希望对外部中断的状态进行保存的逻辑。
开发中遇到的问题,特此记录。注意芯片为HK32(stm32没有测试过)。