STM32 外部中斷的原理與應用分析

2022-05-27     大方老師單片機

原標題:STM32 外部中斷的原理與應用分析

STM32外部中斷的原理與應用分析

1、搶占優先級和響應優先級

在了解中斷之前,先了解一下它們之間的優先級別STM32的中斷源具有兩種優先級:一種為搶占優先級;另一種為響應優先級(亞優先級,其屬性編號越小,表明它的優先級別越高。搶占是指打斷其他中斷的屬性,即低搶占優先級的中A可以被高搶占優先級的中B打斷,執行完中斷服務函B後,再返回繼續執行中斷服務函A,由此會出現中斷嵌套。響應屬性則應用在搶占屬性相同的情況下,即當兩個中斷源的搶占優先級相同時,分以下幾種情況處理:

(1)如果兩個中斷同時到達,則中斷控制器會先處理響應優先級高的中斷。

(2)當一個中斷到來後,如果正在處理另一個中斷,則這個後到的中斷就要等到前一個中斷處理完之後才能被處理(高響應優先級的中斷不可以打斷低響應優先級的中斷)。

(3)如果它們的搶占式優先級和響應優先級都相等,則根據它們在中斷表中的排位順序決定先處理哪一個。

舉個例子,現在3個中斷向量,如下圖,若內核正在執C的中斷服務函數,則它能被搶占優先級更高的中A打斷,由BC的搶占優先級相同,所C不能B打斷。但如BC中斷是同時到達的,內核就會首先執行響應優先級別更高B中斷。如BC中有一個先到,不管誰的響應優先級高,都不能打斷,只能等待。

2NVIC的優先級組

STM32使用4個中斷優先級的寄存器位,只可以配16種優先級,即搶占優先級和響應優先級的數量由一4位的數字來決定,把這4位數字的位數分配成搶占優先級部分和響應優先級部分。有以5種分配方式:

0種:所4位用於指定響應優先級,NVIC配置24次方16種中斷向量都是只有響應屬性,沒有搶占屬性。

1種:最1位用來配置搶占優先級,3位用來配置響應優先級,表示2種級別的搶占優先級01,23次方8種響應優先級,即16種中斷向量之中,8種中斷的搶占優先級都0級,而它們的響應優先級分別0~ 7,8種中斷的搶占優先級則都1級,響應優先級別分別0~7

22位用來配置搶占優先級2位用來配置響應優先,22次方4種搶占優先級22次方4種響應優先級。

3種:3位用來配置搶占優先級,最1位用來配置響應優先級,即8種搶占優先級2種響應優先級。

4種:所4位用來指定搶占優先級,16種中斷具有不相同的搶占優先級。

可以通過調STM32固件庫中的函NVIC_PriorityGroupConfig()選擇使用哪種優先級分組,這個函數5個參數:

#define NVIC_PriorityGroup_0 ((uint32_t)0x700) //選擇0 #define NVIC_PriorityGroup_1 ((uint32_t)0x600) //選擇1 #define NVIC_PriorityGroup_2 ((uint32_t)0x500) //選擇2#define NVIC_PriorityGroup_3 ((uint32_t)0x400) //選擇3 #define NVIC_PriorityGroup_4 ((uint32_t)0x300) //選擇4

這裡我說一下為什麼要設置分組和優先級?首先中斷需要有優先級,事件有重要和次要之分,CPU接到更重要的中斷請求時,應當先去處理重要的事情。設計優先級分組是一個更靈活的選擇STM32使用4個中斷優先級的寄存器位,這就意味著可以設16種優先級,比如說我做的項目會突發很多種情況,這時就可以設置為3種,8種搶占(先後)級別2種響應級別;如果中斷的情況不多,可以設置為2種,那就會4種搶占(先後)4種響應,這樣的設計就可以靈活對付很多複雜的情況。注意:

一般情況下,系統代碼執行過程中,只設置一次中斷優先級分組,比如分3,設置好分組之後一般不會再改變分組。隨意改變分組會導致中斷管理混亂,程序出現意想不到的執行結果。

3、中斷線的概念

STM32的每IO都可以作為外部中斷輸入。

STM32的中斷控制器支19個外部中/事件請求:

0~15:對應外IO口的輸入中斷。

16:連接PVD輸出。

17:連接RTC鬧鐘事件。

18:連接USB喚醒事件。

每個外部中斷線可以獨立的配置觸發方式(上升沿,下降沿或者雙邊沿觸發),觸/屏蔽,專用的狀態位STM32IO使用的中斷線只16個,但STM32F10x系列IO口多達上百個,那麼中斷線怎麼io口對應呢?其實啊,一IO口對應一根中斷線,每IO口都可以使用這跟中斷線,但是在同一時刻,只能響應一個埠的事件觸發,不能同時響應所GPIO埠的事件,也就是分時復用。

4、中斷服務函數

STM32分配16根中斷線,但是中斷服務函數隻分配7個,毋庸置疑,肯定有幾個也是要大家共享的了。

·中斷0 ~ 4各對應一個中斷函數(下圖少了一個外部中0

·中斷5 ~ 9共用中斷函EXTI9_5_IRQHandler

·中斷10 ~ 15共用中斷函EXTI15_10_IRQHandler

中斷效勞函數列表:

EXTI0_IRQHandler EXTI1_IRQHandlerEXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler

在編寫中斷效勞函數的時候會經常使用到兩個函數實現下面的功能:

(1)判斷某個中斷線上的中斷是否發生(標誌位是否置位,一般使用在中斷效勞函數的開頭,判斷中斷是否發生:

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

(2)革除某個中斷線上的中斷標誌位,這個函數一般應用在中斷效勞函數完畢之前,革除中斷標誌位:

void EXTI_ClearITPendingBit(uint32_t EXTI_Line)

中斷效勞函數的格式能夠說是一個套路的,常用的中斷效勞函數格式為:

void EXTI9_5_IRQHandler(void){

if(EXTI_GetITStatus(EXTI_Line8)!=RESET)//判斷8上的中斷是否發

{

?中斷邏

EXTI_ClearITPendingBit(EXTI_Line8);//LINE上的中斷標誌

}

}

另外,固件庫還提供了兩個函數用來判斷外部中斷狀態和革除外部狀態標誌位,EXTI_GetFlagStatus()EXTI_ClearFlag(),其作用和前面兩個函數的作用類似,只是EXTI_GetITStatus()中會先判斷這種中斷是否使能,使能了才去判斷中斷標誌位,EXTI_GetFlagStatus()直接用來判斷狀態標誌位。

5、外部中斷的一般配置步驟:

初始IO口為輸寫。

GPIO_Init();

IO口復用時鐘。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

【文章福利】:小編整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件裡面,有需要的可以自行添加哦!~點擊綠色通訊軟體搜airuimcu加入。

IO口與中斷線的映射關係。

void GPIO_EXTILineConfig();例如GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

初始化線上中斷,設置觸發條件等。

EXTI_Init();例如 EXTI_InitStructure.EXTI_Line=EXTI_Line2;//指定中斷線EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //模式:事件或者中斷EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//觸發方式下降沿EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能 EXTI_Init(&EXTI_InitStructure);

配置中斷分組NVIC),並使能中斷。

NVIC_Init();例如 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//1中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//搶占優先級1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子優先級2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據上面指定的參數初始NVIC寄存器

編寫中斷服務函數。

EXTIx_IRQHandler();

清除中斷標誌位

EXTI_ClearITPendingBit();

文章來源: https://twgreatdaily.com/zh-cn/8939d776b380327d9fe8fdb684795c12.html