異常類型
原話:
Cortex‐M3 在內核水平上搭載了一個異常響應系統,支持為數眾多的系統異常和外部中斷。
其中,編號為 1-15 的對應系統異常,大於等於 16 的則全是外部中斷。
除了個別異常的優先級被定死外,其它異常的優先級都是可編程的。
所有能打斷正常執行流的事件都稱為異常。
- 異常的概念包含中斷的概念,即中斷是異常的子集。
- 異常與中斷都是硬件支持的
異常表:
外部中斷表:
這里的“外部中斷”不是指STM32中的EXTI中斷,而是所有中斷。
每一個外設(分管部門):
外設中的每一個外設都有一個自己的中斷開關,內核中的系統定時器等也有自己中斷開關。能夠產生中斷的設備通過中斷請求線(IRQ line)連到NVIC上面,所有能夠產生中斷的設備必須要有一根中斷請求線。
NVIC(主管家):
NVIC專門管理中斷的,每一個中斷都要在NVIC中掛號(使NVIC監聽器中斷請求)。NVIC收到外設的中斷請求,會將其中斷請求發送給內核,內核收到NVIC的中斷通知之后,就會去判斷時哪個中斷發生,然后查找FLASH中斷向量表去獲取相應的中斷處理函數。
舉例:
由簡單GPIO電平引起的中斷,由專門的部件管理中斷,這個部件腳EXTI(外部中斷管理控制器)。
某個GPIO需要產生中斷,由EXTI使能之后,EXTI會把中斷的請求,通知給NVIC,NVIC若對其使能,則NVIC把這個中斷請求通知給CORTEX_M3,由CORTEX_M3處理中斷。
stm32所有的I/O都可以配置中斷。
stm32NVIC中斷優先級的配置
stm32中斷配置思路
NVIC
當我們要使用 NVIC 來配置中斷時,自然想到 ST 庫肯定也已經把它封裝成庫函數了。查找庫幫助文檔,發現在 Modules->STM32F10x_StdPeriph_Driver->misc 查找到一個 NVIC_Init() 函數,對 NVIC 初始化,首先要定義並填充一個NVIC_InitTypeDef 類型的結構體。
這個結構體有四個成員
前面兩個結構體成員都很好理解,首先要用 NVIC_IRQChannel 參數來選擇將要配置的中斷向量,用 NVIC_IRQChannelCmd 參數來進行使能(ENABLE)或關閉(DISABLE)該中斷。在NVIC_IRQChannelPreemptionPriority 成員要配置中斷向量的搶占優先級,在 NVIC_IRQChannelSubPriority 需要配置中斷向量的響應優先級。對於中斷的配置,最重要的便是配置其優先級,但 STM32 的同一個中斷向量為什么需要設置兩種優先級?這兩種優先級有什么區別?
搶占優先級和響應優先級
STM32 的中斷向量具有兩個屬性,一個為搶占屬性,另一個為響應屬性,其屬性編號越小,表明它的優先級別越高。搶占,是指打斷其它中斷的屬性,即因為具有這個屬性,會出現嵌套中斷(在執行中斷服務函數 A 的過程中被中斷 B 打斷,執行完中斷服務函數 B 再繼續執行中斷服務函數 A),搶占屬性由 NVIC_IRQChannelPreemptionPriority 的參數配置。而響應屬性則應用在搶占屬性相同的情況下,當兩個中斷向量的搶占優先級相同時,如果兩個中斷同時到達,則先處理響應優先級高的中斷,響應屬性由 NVIC_IRQChannelSubPriority 的參數配置。
例如,現在有三個中斷向量
若內核正在執行 C 的中斷服務函數,則它能被搶占優先級更高的中斷 A 打斷,由於 B 和 C 的搶占優先級相同,所以 C 不能被 B 打斷。但如果 B 和 C 中斷是同時到達的,內核就會首先響應響應優先級別更高的 B 中斷
NVIC 的優先級組
在配置優先級的時候,還要注意一個很重要的問題,中斷種類的數量。NVIC 只可以配置 16 種 中斷向量的優先級,也就是說,搶占優先級和響應優先級的數量由一個 4 位的數字來決定,把這個 4 位數字的位數 分配成搶占優先級部分和響應優先級部分。有 5 組分配方式:
第 0 組:
所有 4 位用來配置搶占優先級,即 NVIC 配置的 2 4 =16 種中斷向量都是只有搶占屬性,沒有響應屬性。
第 1 組:
最高 1 位用來配置搶占優先級,低 3 位用來配置響應優先級。表示有 21=2 種級別的搶占優先級(0 級,1 級),有 23=8 種響應優先級,即在 16種中斷向量之中,有 8 種中斷,其搶占優先級都為 0 級,而它們的響應優先級分別為 0~7,其余 8 種中斷向量的搶占優先級則都為 1 級,響應優先級別分別為 0~7。
第 2 組:
2 位用來配置搶占優先級,2 位用來配置響應優先級。即 22=4 種搶占優先級,22=4 種響應優先級。
第 3 組:
高 3 位用來配置搶占優先級,最低 1 位用來配置響應優先級。即有 8 種搶占優先級,2 種響應 2 優先級。
第 4 組:
所有 4 位用來配置響應優先級。即 16 種中斷向量具有都不相同的響應優先級。
要配置這些優先級組,可以采用庫函數 NVIC_PriorityGroupConfig(),可輸入的參數為NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分別為以上介紹的 5 種分配組。
於是,有人覺得疑惑了,如此強大的 STM32,所有 GPIO 都能夠配置成外部中斷,USART、ADC 等外設也有中斷,而 NVIC 只能配置 16 種中斷向量,那在某個工程中使用了超過 16 個的中斷怎么辦呢?注意 NVIC 能配置的是 16種 中斷向量,而不是 16 個,當工程之中有超過 16 個中斷向量時,必然有 2 個以上的中斷向量是使用相同的中斷種類,而具有相同中斷種類的中斷向量不能互相嵌套。
STM2 單片機的所有 I/O 端口都可以配置為 EXTI 中斷模式,用來捕捉外部信號,可以配置為下降沿中斷,上升沿中斷和上升下降沿中斷這三種模式。它們以下圖的方式連接到 16 個外部中斷/事件線上
stm32F10x產品的向量表。
stm32有許多中斷,用中斷向量表對中斷進行管理。中斷向量表給每個中斷分配一個地址。這個地址里面是一個跳轉語句。可以看到每個向量占用4個字節。而這四個字節就可以存儲一個跳轉指令。
非陰影部分為外設的中斷向量,共60個外部中斷。4個字節
優先級編號從-3 至 6 的中斷向量定義為系統異常;
編號為負的內核異常不能被設置優先級,如復位(Reset)、不可屏蔽中斷 (NMI)、硬錯誤(Hardfault);
從編號 7 開始的為外部中斷,這些中斷的優先級都是可以自行設置的;
NVIC 是屬於Cortex 內核的器件,不可屏蔽中斷 (NMI)和外部中斷都由它來處理,而SYSTICK 不是由 NVIC 來控制的。