1 什麼是中斷

中斷是單片機正在執行程序時,由於內部或外部事件的觸發,打斷當前程序,轉而去處理這一事件,當處理結束後再回到原來被打斷的地方繼續執行原程序的過程。

STM32中斷設置以及中斷優先級設置三步曲_回調函數

要深入理解上面該中斷圖,比如

systick模擬多線程實驗時,為什麼兩個小燈不同頻率閃爍的代碼寫在中斷服務函數裏,就能實現功能呢?

答:SysTick 通常配置為每 1ms 產生一次中斷

每次中斷時,這個函數自動被調用,執行完中斷軟件再回到斷點

函數內部維護兩個任務的計時器,完成:

  • 任務1:每秒執行一次(1000ms)
  • 任務2:每0.5秒執行一次(500ms)

在main函數的HAL_Init()函數中默認設置的是每過1ms調用一下中斷函數systick_isr(),相當於每過1ms都會檢測task1和task2的cnt計數情況。就是每過1ms調用一次中斷函數systick_isr(),這1ms後就實現systick_isr()中1000ms的led1和500ms的led2閃爍

2 為什麼要中斷

2.1 中斷的意義

中斷的主導意義在於提高CPU的效率,而不會一直佔用CPU,實現對突發事件的實時處理,以及實現應用的並行化和嵌入式系統進程之間的切換。相較於輪詢方式(即按照一定的頻率和週期不斷地檢測某些事件的發生),中斷在處理一些偶然發生的事情時效率更高。

  • 在鏈接1中,當振動傳感器感受到振動時,PA4收到低電平,用HAL_GPIO_ReadPin讀PA4,若是是低電平0(GPIO_PIN_RESET),則標誌位為1,此代碼在中斷回調函數中實現
  • 在鏈接2中,通過中斷建立紅外傳感器功能,即倘若PB4是低電平,則為檢測到有人,此代碼也在中斷回調函數中實現

通過鏈接1可能初識了中斷,這兩個案例中還出現了中斷服務函數,其實不只這些,中斷其實很豐富的,都有什麼呢

2.2 中斷執行流程

當中斷髮生時,STM32的執行流程如下:首先,由外設發出中斷請求;然後,處理器暫停當前執行的任務,保護現場(如將當前位置的PC地址壓棧);接着,腳本跳轉到對應的中斷服務程序(ISR)並執行;中斷服務程序執行完畢後,恢復現場(如將棧頂的值送回PC);最後,處理器返回到被中斷的位置,繼續執行下一個指令。

鏈接1電動車報警體系中,振動傳感器一感受到振動PB4就輸出低電平給STM32開發板,相當於PB4發出中斷請求,程序跳到中斷服務程序並執行,它執行完處理器返回到被中斷的位置執行下一個指令

3 STM32中斷

3.1 函數名詞解釋

HAL_NVIC_SetPriority

設置中斷線的優先級

HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);

// 設置EXTI15_10中斷線的優先級

HAL_NVIC_EnableIRQ

使能中斷

HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);   // 使能中斷

HAL_GPIO_EXTI_IRQHandler

處理中斷請求

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);

HAL_GPIO_EXTI_Callback

EXTI線路檢測回調

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

中斷服務函數HAL_GPIO_EXTI_IRQHandler會自動調用中斷回調函數HAL_GPIO_EXTI_Callback,

STM32中斷設置以及中斷優先級設置三步曲_服務程序_02

看鏈接1的一部分代碼

void EXTI15_10_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}

對於上面代碼,結合HAL庫定義,意思是先檢查指定的EXTI中斷線是否被聲明,即是否拿到12號中斷線,如果它不為0,清除12號中斷線,調用關於12引腳的中斷回調函數

常用的函數有這幾種,不要慌,下面將會講到它們之間的關係,和什麼時候調用~

3.2 STM32中斷框圖

3.2.1 NVIC


是STM32中的中斷控制器。它負責管理和協調處理器的中斷請求,是STM32中處理異步事件的要緊機制。

當一箇中斷請求到達時,NVIC會確定其優先級決定是否應該中斷當前執行的應用,以便及時響應和處理該中斷請求。

STM32中斷設置以及中斷優先級設置三步曲_回調函數_03

NVIC配置方法

設置中斷分組 → 設置中斷優先級 → 使能中斷

設置中斷分組一般在 HAL_Init 函數中進行。

STM32中斷設置以及中斷優先級設置三步曲_回調函數_04

3.2.2 EXTI

EXTI 是External Interrupt的縮寫,表示外部中斷事件控制器。

滿足條件,會中斷CPU的主程序,使 CPU 轉而執行 EXTI 對應的就是EXTI 行監測指定 GPIO 口的電平信號變化,並在檢測到指定條件時,向內核的中斷控制器NVIC 發出中斷申請。NVIC 在裁決後,若中斷服務程序

STM32中斷設置以及中斷優先級設置三步曲_中斷請求_05

a AFIO

AFIO 是Alternate Function Input/Output的縮寫,表示複用作用 IO,主要用於實現 I/O 端口的複用能力以及外部中斷的控制。

STM32上有很多 I/ O口以及內置外設(如I2C、ADC、ISP、USART等)。為了節省引出管腳的數量,這些內置外設通常與 I/O口共用管腳,即 I/O 管腳具有複用功能。例如,一個 GPIO 管腳除了可以作為普通的I/O端口外,還可以被複用為某個內置外設的功能引腳。

STM32中斷設置以及中斷優先級設置三步曲_中斷請求_06

3.3 中斷配置流程

STM32中斷設置以及中斷優先級設置三步曲_服務程序_07