1.中斷觸發過程
對主程序壓棧——把中斷服務函數的地址寫入到程序計數器(PC)——執行中斷服務函數
2.中斷向量表
中斷服務函數的地址在STM32的手冊上的中斷向量表中(如下是一部分):
如上表所示,EXTI0中斷服務函數的地址是0x00000058。意思就是如果觸發了外部中斷那么就從0x00000058地址開始執行,這個地址的函數可以在HAL庫的啟動文件中找到。
很明顯,EXTI0的中斷服務函數的函數名是:EXTI0_IRQHandler
EXTI0~EXTI4是獨立的,9~5共用中斷源,15~10共用中斷源,9~5和15~10的中斷需要在中斷函數中判斷是哪個中斷引腳。
3.HAL庫中的中斷服務函數。
這里我們要用PD10引腳觸發外部中斷,根據向量表,EXTI10的中斷服務函數是:EXTI15_10_IRQHandler。
HAL庫中代碼是這樣執行的:
(1)首先是中斷服務函數
PD10外部中斷觸發之后程序計數器被寫入0x000000E0(EXTI15_10_IRQHandler函數的地址)
然后程序開始執行EXTI15_10_IRQHandler函數:
EXTI15_10_IRQHandler函數只是調用了另一個函數HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
在這個函數中清楚中斷標志位然后又調用了一個HAL_GPIO_EXTI_Callback(GPIO_Pin)函數。
根據函數名Callback也能看出來這里才是真正執行具體功能的函數,該函數需要用戶在mian.c文件中重寫:
4.NVIC中斷控制器
步驟1-3說明了一個最基本的中斷過程。然而還有一個重要的概念沒有講到,NVIC中斷控制器。
STM32支持中斷嵌套,為了更好的更強大的實現中斷嵌套,ST給出了一個NVIC中斷控制器來專門管理中斷。我們都知道高優先級的中斷能打斷低優先級的中斷優先執行,等高優先級中斷執行完之后在返回去執行被打斷的中斷,這就是中斷嵌套。那么如果同時有兩個同樣優先級的中斷出現呢?
於是STM32所有中斷都有兩個優先級:搶占優先級和副優先級。(英文是 preempition priority和sub priority)
判斷中斷的優先級,先看搶占優先級,搶占優先級高的中斷優先級別高。搶占優先級相同的情況下,先執行副優先高的的。搶占優先級和響應優先級相同的情況下,根據中斷向量表確定。
在Cube中配置NVIC如下圖
上圖所示,使能EXIT line[15:10]中斷,搶占優先級是0,副優先級也是0。
那么,共有多少個搶占優先級多少個副優先級呢?
這就要涉及到另一個概念優先級分組了:
上圖中的“4.優先級分組”中顯示的是2bit for preemption priority,什么意思呢?
STM32以4個比特位表示中斷的搶占優先級和副優先級
在這里可以為搶占優先級分配幾個bit位。
怎么用呢?舉個栗子就很明白了:
假如我設置 3 bit for preemption priority,那么搶占優先級就有2的3次方(8)個優先級,於是副優先級就有2的1(4-3)次方(2)個。如下兩個圖