STM32的中斷系統
1.中斷介紹:
1.1 中斷概念
CPU執行程式時,由于發生了某種随機的事件(外部或内部),引起CPU暫 時中斷正在運作的程式,轉去執行一段特殊的服務程式(中斷服務子程式 或中斷處理程
序),以處理該事件,該事件處理完後又傳回被中斷的程式 繼續執行,這一過程稱為中斷。引發中斷的稱為中斷源。比如:看電視 時突然門鈴響,那麼門鈴響就相當于中
斷源。有些中斷還能夠被其他高 優先級的中斷所中斷,那麼這種情況又叫做中斷的嵌套。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iZzIzMlZTNkRTZ2UTYzcTMiBjYmZmMmNTOmNTN1UWZl9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
STM32F10x晶片有84個中斷通道,包括 16 個核心中斷和 68 個可屏蔽中 斷,這些中斷通道已按照不同優先級順序固定配置設定給相應的外部裝置。 (參考《STM32F10x中文參考手冊》-9 中斷和事件章節)
1.2 NVIC介紹
NVIC英文全稱是Nested Vectored Interrupt Controller,中文意思 就是嵌套向量中斷控制器,它屬于M3核心的一個外設,控制着晶片的中 斷相關功能。由于ARM給NVIC預
留了非常多的功能,但對于使用M3核心設 計晶片的公司可能就不需要這麼多功能,于是就需要在NVIC上裁剪。ST 公司的STM32F103晶片内部中斷數量就是NVIC裁剪後
的結果。 中斷控制相關寄存器在固件庫core_cm3.h檔案NVIC結構體内。可打開 任意庫函數工程即可檢視到。
1.3 中斷優先級
STM32F103晶片支援60個可屏蔽中斷通道,每個中斷通道 都具備自己的中斷優先級控制位元組(8位,但是STM32F103中隻使用4位 ,高4位有效),用于表達優先級的高4位
又被為組成搶占式優先級和響應 優先級,通常也把響應優先級稱為“亞優先級”或“副優先級”,每個 中斷源都需要被指定這兩種優先級。 高搶占式優先級的中斷事件會打斷當
前的主程式或者中斷程式運作, 俗稱中斷嵌套。在搶占式優先級相同的情況下,高響應優先級的中斷優 先被響應。 當兩個中斷源的搶占式優先級相同時,這兩個中斷将沒
有嵌套關系, 當一個中斷到來後,如果正在處理另一個中斷,這個後到來的中斷就要 等到前一個中斷處理完之後才能被處理。如果這兩個中斷同時到達,則 中斷控制器根
據他們的響應優先級高低來決定先處理哪一個;如果他們 的搶占式優先級和響應優先級都相等,則根據他們在中斷表中的排位順 序決定先處理那一個。
STM32F103中指定中斷優先級的寄存器位有4位,這4位的分組方式 如下:
設定優先級分組可調用庫函數 NVIC_PriorityGroupConfig(),在 misc.c可以檢視
2.中斷配置步驟
要使用中斷我們就需要先配置它,通常都需經過這幾步:
(1)使能外設某個中斷
(2)設定中斷優先級分組,初始化 NVIC_InitTypeDef 結構體
typedef struct {
uint8_t NVIC_IRQChannel; //中斷源
uint8_t NVIC_IRQChannelPreemptionPriority; //搶占優先級
uint8_t NVIC_IRQChannelSubPriority; //響應優先級
FunctionalState NVIC_IRQChannelCmd; //中斷使能或失能
} NVIC_InitTypeDef;
(3)編寫中斷服務函數
可以根據啟動檔案進行檢視相應的中斷服務函數的函數名。
3.基于STM32CubeMX的執行個體操作
将PC13引腳設定成外部中斷,下降沿觸發,在中斷服務函數中,翻轉PB9引腳的電平信号。
1、将GPIO設定為外部中斷:GPIO_EXIT功能
2、設定中斷觸發條件:上升沿、下降沿、上升沿或下降沿
3、使能相關的NVIC通道