一、什么是中斷
首先介紹一下什么是中斷。在實際開發過程中,中斷是很有必要的。比如需要針對某種特殊情況進行快速響應,單純的使用一個while輪詢似乎并不能滿足。中斷的概念非常好理解,舉個經典例子。比如你在家里看電視,忽然有人敲門,你臨時把電視暫停了,轉去開門。開完門之后再次回來繼續看電視。
中斷也就是這種流程。看電視的行為就類似于程序中main函數的while,輪詢執行業務。忽然有人敲門,對應程序運行過程中忽然產生了一個中斷請求。此時暫停電視,對應于此時程序中斷當前的業務,轉而去處理中斷業務(開門)。最后,中斷業務處理完成后,再繼續執行main函數while輪詢中的業務。簡單用一個圖來表示一下
中斷概念示意圖
根據中文參考手冊的介紹,STM32F103ZET6除了一些特殊的中斷外,常用的中斷有60個,這些中斷是通過中斷控制器來有條不紊地分配執行的。
二、中斷的相關概念
2.1 中斷優先級
從字面意思來講,優先級用來區分中斷的響應順序。當同時接收到多個中斷請求時,中斷控制器會根據中斷優先級來決定中斷處理的順序,優先級高的會先被處理。如果在處理某個中斷請求時又來了一個中斷,這時會根據兩個中斷的中斷優先級來確定處理方式。
如果新來的中斷優先級比當前中斷的優先級高,則會停止對當前中斷的處理,轉而處理新的中斷。反之,如果新來的中斷優先級比當前中斷的優先級低,則需要等到當前中斷處理完成后,再去處理新來的中斷。
中斷優先級有兩種,一種是搶占優先級,一種是響應優先級。響應優先級通常又被稱為“亞優先級”或者“副優先級”。當兩個中斷的搶占優先級相同時,用相應優先級來決定中斷的處理順序。
如果兩個中斷的搶占優先級和相應優先級相同,則根據芯片手冊中的中斷向量號來決定中斷的處理順序。比如同時來了兩個中斷請求,在搶占優先級和響應優先級均相同時,中斷向量號為41的中斷會比中斷向量號為42的中斷先被處理。
STM32提供了16個可編程的優先等級(使用了4位中斷優先級),優先級分組可以使用庫函數提供的NVIC_PriorityGroupConfig()
設置。
2.2 中斷嵌套
一些低優先級的中斷可以被高優先級中斷打斷,這種情況叫做中斷嵌套。
2.3 中斷服務函數
中斷服務函數就是在進入中斷后需要執行的內容。
中斷服務函數有特定的函數名,可以在下圖文件中搜索“IRQ”找到。
中斷服務函數名
2.4 中斷標志位
不同的中斷會有對應的中斷標志位,通常標志位默認值為0。當產生中斷請求時,標志位被置1。比如設置一個串口接收完成中斷,串口接收完成標志位初始值為0。當串口接收完成后對應的串口接收完成標志位會被置1。
在中斷服務函數中檢測該標志位的值,來確定是否是串口接收完成中斷產生了。每次中斷服務函數執行結束后,需要清除一下對應的中斷標志位。
三、外部中斷EXIT
STM32F103ZET6有一個外部中斷控制器(EXIT),可以支持20個軟件的中斷/事件請求,其中外部中斷的EXIT0~EXIT15同坐IO中斷。
外部中斷IO對應
其他詳細的介紹這里就不再說明。
四、中斷程序配置
這里以配置PA0(按鍵WK UP)的外部中斷為例,展示一下庫函數開發時,外部中斷的配置流程。關于其他中斷的配置,后續使用其他外設時會單獨介紹。
想要實現的效果是,利用外部中斷實現按下WK UP,LED1點亮。
4.1 設置中斷分組并使能中斷
這里使用外部中斷,需要開啟AFIO時鐘,設置IO與外部中斷線的映射關系。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); // 開啟AFIO時鐘
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //選擇GPIO管腳用作外部中斷線路
設置中斷分組并使能中斷時,庫函數提供了一個結構體,我們直接配置這個結構體就可以了。
//EXTI0 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //EXTI0中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //搶占優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器
需要注意的是,配置優先級時,數值越大,優先級越低。
4.2 初始化EXIT
初始化EXIT時,庫函數也提供了一個結構體,其中包括中斷線,EXIT模式,觸發方式以及EXIT使能或者失能。由按鍵檢測一節了解到,WK UP按下時,會產生一個上升沿。因此觸發方式我們選擇上升沿觸發。
EXTI_InitStructure.EXTI_Line=EXTI_Line0; // EXIT0
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; // 中斷
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; // 上升沿觸發
EXTI_InitStructure.EXTI_LineCmd=ENABLE; // 使能
EXTI_Init(&EXTI_InitStructure);
整體配置函數如下
/*
*==============================================================================
*函數名稱:Exit_Init
*函數功能:初始化外部中斷
*輸入參數:無
*返回值:無
*備 注:無
*==============================================================================
*/
void Exit_Init (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); // 開啟AFIO時鐘
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //選擇GPIO管腳用作外部中斷線路
//EXTI0 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //EXTI0中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //搶占優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器
EXTI_InitStructure.EXTI_Line=EXTI_Line0; // EXIT0
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; // 中斷
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; // 上升沿觸發
EXTI_InitStructure.EXTI_LineCmd=ENABLE; // 使能
EXTI_Init(&EXTI_InitStructure);
}
4.3 編寫中斷服務函數
上面介紹了如何找中斷服務函數的函數名,這里直接開始寫中斷服務函數。這里的中斷服務函數比較簡單,直接點亮LED1即可。
/*
*==============================================================================
*函數名稱:EXTI0_IRQHandler
*函數功能:外部中斷0中斷服務函數
*輸入參數:無
*返回值:無
*備 注:無
*==============================================================================
*/
void EXTI0_IRQHandler(void)
{
// 如果EXIT0中斷標志位被置1
if(EXTI_GetITStatus (EXTI_Line0)==1)
{
Med_Led_StateCtrl (LED1,LED_ON); // 點亮LED1
}
EXTI_ClearITPendingBit (EXTI_Line0); // 清除中斷標志位
}
至此,按下WK UP后,LED1會點亮。這種方法與之前的按鍵點亮LED有什么區別?之前的按鍵點亮LED是在main函數的while中實現的,而利用外部中斷的方法,是在外部中斷的中斷服務函數中實現的。即使main函數的while輪詢業務中沒有按鍵業務,按鍵依舊可以起作用。
五、注意事項
- ? 中斷服務函數無需在.h文件中聲明
- ? 中斷服務函數中不要有過長的業務
- ? 中斷服務函數最后需要清除中斷標志位
-
GPIO
+關注
關注
16文章
1271瀏覽量
53570 -
中斷控制器
+關注
關注
0文章
61瀏覽量
9633 -
串口中斷
+關注
關注
0文章
67瀏覽量
14239 -
STM32F103ZET6
+關注
關注
9文章
67瀏覽量
21598 -
AFIO
+關注
關注
0文章
6瀏覽量
3113
發布評論請先 登錄
STM32各模塊學習筆記
stm32之中斷與外部中斷

STM32F103學習筆記-中斷與中斷的控制

STM32學習筆記(4)——NVIC中斷優先級管理和外部中斷EXTI

STM32核心筆記

STM32自學筆記(二)中斷

評論