stm32 中斷非常強大,幾乎每個外設都可以產生中斷,因此這裡我們單獨使用一章來介紹它,為後面介紹外設中斷做鋪墊。學習本章可以參考《stm32f10x中文參考手冊》 -9 中斷和事件章節, 《cortex m3 權威指南(中文)》 -chpt08 nvic與中斷控制章節。
中斷概念
在學習 51 微控制器時,我們就接觸過中斷,中斷其實就是當 cpu 執行程式時,由於發生了某種隨機的事件(外部或內部),引起 cpu 暫時中斷正在執行的程式,轉去執行一段特殊的服務程式(中斷服務子程式或中斷處理程式),以處理該事件,該事件處理完後又返回被中斷的程式繼續執行,這一過程就稱為中斷,引發中斷的稱為中斷源。比如:看電視時突然門鈴響,那麼門鈴響就相當於中斷源。
有些中斷還能夠被其他高優先順序的中斷所中斷,那麼這種情況又叫做中斷的巢狀,中斷示意圖如圖。
crotex-m3 核心支援 256 個中斷,其中包含了 16 個核心中斷和 240 個外部中斷。但 stm32 並沒有使用 m3 核心的全部東西,而是只用了它的一部分。
stm32f10x 晶元有 84 個中斷通道,包括 16 個核心中斷和 68 個可遮蔽中斷,對於stm32f103系列晶元只有60個可遮蔽中斷, 在 stm32f107 系列才有 68 個。
除了個別異常的優先順序被定死外,其它異常的優先順序都是可程式設計的。這些中斷通道已按照不同優先順序順序固定分配給相應的外部裝置。從 stm32f10x 中文參考手冊的中斷向量表可以知道具體分配到那些外設,這裡只擷取一部分,如需了解更詳細可參考《stm32f10x 中文參考手冊》-9 中斷和事件章節內容,中斷向量表如圖。
nvic介紹
nvic 英文全稱是 nested vectored interrupt controller,中文意思就是巢狀向量中斷控制器,它屬於 m3 核心的乙個外設,控制著晶元的中斷相關功能。
由於 arm 給 nvic 預留了非常多的功能, 但對於使用 m3 核心設計晶元的公司可能就不需要這麼多功能,於是就需要在 nvic 上裁剪。st 公司的 stm32f103晶元內部中斷數量就是 nvic 裁剪後的結果。
typedef struct nvic_type;
在配置中斷時,我們通常使用的只有 iser、 icer 和 ip 這三個暫存器,
iser是中斷使能暫存器,icer是中斷清除暫存器,ip 是中斷優先順序暫存器。
在韌體庫 core_cm3.**件後面,還提供了一些對 nvic 操作的庫函式,這些
函式都是遵循 cmsis 標準, 所以只要是基於 cortex-m3 核心的晶元都可以用這些函式來操作 nvic,只不過我們很少這樣做,甚至不使用這些函式,因為在後面我們會有更簡單的辦法來配置中斷。至於這些函式內容,大家如果有興趣的話,可以開啟我們庫函式版本任意程式,找到 core_cm3.h 檔案檢視即可。
中斷優先順序
前面說了 stm32f103 晶元支援 60 個可遮蔽中斷通道,每個中斷通道都具備自己的中斷優先順序控制位元組(8 位,理論上每個外部中斷優先順序可以設定為0-255,數值越小,優先順序越高。但是 stm32f103 中只使用 4 位,高4位有效),用於表達優先順序的高 4 位又被分組成搶占式優先順序和響應優先順序, 通常也把響應優先順序稱為「亞優先順序」或「副優先順序」,每個中斷源都需要被指定這兩種優先順序。
高搶占式優先順序的中斷事件會打斷當前的主程式或者中斷程式執行, 俗稱中斷巢狀。在搶占式優先順序相同的情況下,高響應優先順序的中斷優先被響應。
當兩個中斷源的搶占式優先順序相同時,這兩個中斷將沒有巢狀關係,當乙個中斷到來後,如果正在處理另乙個中斷,這個後到來的中斷就要等到前乙個中斷處理完之後才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先順序高低來決定先處理哪乙個;如果他們的搶占式優先順序和響應優先順序都相等,則根據他們在中斷表中的排位順序決定先處理那乙個,越靠前的先執行。
stm32f103 中指定中斷優先順序的暫存器位有 4 位,這 4 位的分組方式如圖。
第0 組:所有 4 位用於指定響應優先順序
第1 組:最高 1 位用於指定搶占式優先順序,最低 3 位用於指定響應優先順序
第2 組:最高 2 位用於指定搶占式優先順序,最低 2 位用於指定響應優先順序
第3 組:最高 3 位用於指定搶占式優先順序,最低 1 位用於指定響應優先順序
第4 組:所有 4 位用於指定搶占式優先順序
設定優先順序分組可呼叫庫函式 nvic_prioritygroupconfig()實現,有關nvic 中斷相關的庫函式都在庫檔案 misc.c 和 misc.h 中,所以當使用到中斷時 , 一 定 要 記 得 把 misc.c 和 misc.h 添 加 到 工 程 組 中 。
nvic_prioritygroupconfig()函式**如下:
void nvic_prioritygroupconfig(uint32_t nvic_prioritygroup)
nvic_prioritygroupconfig 函式帶乙個形參用於中斷優先順序分組,該值範圍可以是 nvic_prioritygroup_0-nvic_prioritygroup_4,對應優先順序與占用的位數資訊如下:
函式內最終將分組值給 scb->aircr,說明控制中斷優先順序暫存器是核心外設 scb的 aircr 暫存器的prigroup[10:8]位。
中斷配置
(1)使能外設某個中斷,這個具體是由外設相關中斷使能位來控制,比如
定時器有溢位中斷,這個可由定時器的控制暫存器中相應中斷使能位來控制。
(2)設定中斷優先順序分組,初始化 nvic_inittypedef 結構體,設定搶占
優先順序和響應優先順序,使能中斷請求。
nvic_inittypedef 結構體如下:
typedef struct nvic_inittypedef;
下面我們對 nvic_inittypedef 結構體成員進行一下簡單介紹。
1.nvic_irqchannel:中斷源的設定,不同的外設中斷,中斷源不一樣,自
然名字也不一樣,所以名字不能寫錯,否則不會進入中斷。中斷源放在stm32f10x.h 檔案的 irqn_type結構體內,由於內容太多,這裡就不複製所有中斷源,只擷取一部分,如下:
typedef enum irqnirqn_type;
3.nvic_irqchannelsubpriority:響應優先順序,具體的值要根據優先順序分組
來確定,可以參考前面中斷優先順序分組內容。
4.nvic_irqchannelcmd:中斷使能/失能設定,使能配置為 enable,失能配置為 disable。
(3)編寫中斷服務函式
配置好中斷後如果有觸發,即會進入中斷服務函式,那麼中斷服務函式也有固定的函式名,可以在 startup_stm32f10x_hd.s 啟動檔案檢視,啟動檔案提供的只是乙個中斷服務函式名,具體實現什麼功能還需要我們自己編寫,可以將中斷服務函式放在 stm32f10x_it.c 檔案內,也可以放在自己的應用程式中。通常我們把中斷函式放在應用程式中。這裡提醒一下大家,不要任意修改中斷服務函式名,因為啟動檔案內中斷服務函式名已經固定,如果要修改,你還必須在啟動檔案內把原中斷函式修改。
stm32中斷優先順序
cm3 核心支援 256 個中斷,stm32 並沒有使用 cm3 核心的全部只用了它的一部分。stm32 有 84 個中斷,包括 16 個核心中斷和 68 個可遮蔽中斷,stm32f103 系列上面只有 60 個 107 系列才有 68 個 下面針對stm32f103 系列說明。與 nvic 相關的...
STM32 中斷 優先順序設定
stm32中斷 優先順序設定 記性老差,前邊熟悉的東西,轉眼又忘了。今又翻開以前的筆記,重溫記錄如下 參考 記不清楚了 一 中斷優先順序概念 stm32 cortex m3 中有兩個優先順序的概念 搶占式優先順序和響應優先順序,有人把響應優先順序稱作 亞優先順序 或 副優先順序 每個中斷源都需要被指...
stm32 中斷優先順序配置
一 中斷優先順序概念 stm32 cortex m3 中有兩個優先順序的概念 搶占式優先順序和響應優先順序,有人把響應優先順序稱作 亞優先順序 或 副優先順序 每個中斷源都需要被指定這兩種優先順序。二 中斷響應次序 1 具有高搶占式優先順序的中斷可以在具有低搶占式優先順序的中斷處理過程中被響應,即中...