一開始的外部中斷是透過這個宏函式來關閉的和開啟
#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沒有測試過)。