基于STM32中斷講解
一、NVIC講解
簡介:當一個中斷請求到達時,NVIC會確定其優先級并決定是否應該中斷當前執行的程序,以便及時響應和處理該中斷請求。這種設計有助于提高系統的響應速度和可靠性,特別是在需要處理大量中斷請求的實時應用程序中。
NVIC 支持:256個中斷(16內核+240外部),支持:256個優先級,允許裁剪。
從上圖中可以看出主要運用的寄存器有**中斷使能寄存器(ISER)、中斷失能寄存器(ICER)、應用程序中斷及復位控制寄存器(AIRCR)、中斷優先級寄存器(IPR)**只用對上述寄存器進行配置就行。
中斷優先級幾種類型:
1、搶占優先級
如果一個中斷的搶占優先級高于當前正在執行的中斷,那么它可以打斷當前中斷,優先得到執行。數值越小,優先級越高。
2、響應優先級
如果兩個中斷同時到達,且它們的搶占優先級相同,那么響應優先級高的中斷將首先得到響應。數值越小,優先級越高。
3、自然優先級
自然優先級是由硬件固定并預先設定的,用戶無法更改。當搶占優先級和響應優先級都相同時,自然優先級將決定哪個中斷先得到處理。
優先級執行順序
當多個中斷同時發生時,執行順序首先由搶占優先級決定。如果搶占優先級相同,則進一步由響應優先級決定。如果響應優先級也相同,則最終由自然優先級決定。
在中斷嵌套的情況下,高搶占優先級的中斷可以打斷低搶占優先級的中斷,但高響應優先級的中斷不能打斷低響應優先級的中斷(當它們具有相同的搶占優先級時)。
優先級分組
優先級寄存器 IPR 有 8 位,但實際只使用到高 4 位,用于決定搶占優先級、響應優先級的等級。一般分為兩組。
二、EXTI講解
簡介:EXTI 是 External Interrupt 的縮寫,表示外部中斷事件控制器。EXTI 可以監測指定 GPIO 口的電平信號變化,并在檢測到指定條件時,向內核的中斷控制器 NVIC 發出中斷申請。NVIC 在裁決后,如果滿足條件,會中斷CPU的主程序,使 CPU 轉而執行 EXTI 對應的中斷服務程序。
EXTI 支持的觸發方式:上升沿、下降沿、雙邊沿或軟件觸發。
EXTI 支持所有的 GPIO 口,但需要注意的是,**相同的 Pin 不能同時觸發中斷。**例如,PA0 和 PB0 不能同時被配置為中斷源。
EXTI 提供了 16 個 GPIO_Pin 的中斷線,以及額外的中斷線如 PVD 輸出、RTC 鬧鐘、USB 喚醒和以太網喚醒。
中斷/事件區分
中斷會打斷CPU當前正在執行的程序,轉而去執行中斷服務程序,待中斷服務程序執行完畢后,CPU會返回到原來的程序執行點繼續執行。
事件只是簡單地表示某個動作或狀態的變化,而不會打斷CPU當前正在執行的程序。當事件發生時,它會根據配置來決定是否觸發相應的中斷。如果開放了對應的中斷屏蔽位(輸入0為屏蔽中斷,輸入1為打開中斷),事件就可以觸發相應的中斷,否則事件只會作為一個信號存在,不會被CPU處理。
中斷屏蔽位作用圖
前三行位中斷觸發,后三行位事件觸發
EXTI結構
配置中斷結構圖
三、AFIO講解
簡介:AFIO 是 Alternate Function Input/Output 的縮寫,表示復用功能 IO,主要用于實現 I/O 端口的復用功能以及外部中斷的控制。
為了優化64腳或100腳封裝的外設數量,有時需要將一些復用功能重新映射到其他引腳上。這時,就可以使用AFIO的復用重映射功能。通過設置復用重映射和調試I/O配置寄存器(AFIO_MAPR),可以實現引腳的重新映射,使得復用功能不再映射到它們的原始分配上。
此外,AFIO 還用于控制外部中斷,用來配置 EXTI 中斷線 0~15 對應哪個具體 IO 口。
AFIO簡化圖
四、配置原理
配置圖:
配置代碼:以按鍵電燈為例
void exit_init(void)
{
GPIO_InitTypeDef gpio_initstruct;//設結構體//打開GPIO的時鐘__HAL_RCC_GPIOA_CLK_ENABLE();gpio_initstruct.Pin = GPIO_PIN_0;gpio_initstruct.Mode = GPIO_MODE_IT_FALLING;//中斷按鍵為下降沿模式觸發gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速gpio_initstruct.Pull = GPIO_PULLUP; //上拉HAL_GPIO_Init(GPIOA,&gpio_initstruct);HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);//GPIOA/B..00系列HAL_NVIC_EnableIRQ(EXTI0_IRQn); //NVIC中斷使能函數
}
void EXTI0_IRQHandler(void) //配置中斷服務函數
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_pin) //回調函數 回調函數_week類型返回uint16_t傳參,可寫相應的執行功能
{//delay_ms(20);/*if(GPIO_pin == GPIO_PIN_0)//檢測按鍵是否是pin0腳{if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){led_toggle();}}*/
}
其中優先級分組一般為兩組,只需配置一次即可,在HAL_Init()里面進行配置。