子優先級至少是1個位。因此搶占優先級最多是7個位,這就造成了最多只有128級搶占的現象(stm32只有4位)。
向量表:當發生了異常並且要響應它時,CM3 需要定位其服務例程的入口地址。這些入口地址存儲在所 謂的“(異常)向量表”中。缺省情況下,CM3認為該表位於零地址處,且各向量占用4字節。因此 每個表項占用4字節。 NVIC 的訪問地址是0xE000_E000,NVIC 中有一個寄存器,稱為“向量表偏移量寄存器”(在地 址0xE000_ED08處),通過修改它的值就能重定位向量表。但必須注意的是:向量表的起始地址是 有要求的:必須先求出系統中共有多少個向量,再把這個數字向上“圓整”到2 的整次冪,而起始 地址必須對齊到后者的邊界上。例如,如果一共有32 個中斷,則共有32+16 (系統異常)=48 個 向量,向上圓整到2 的整次冪后值為64,因此向量表重定位的地址必須能被64*4=256整除,從而 合法的起始地址可以是:0x0, 0x100, 0x200等。
表7.7 向量表偏移量寄存器(VTOR) (地址:0xE000_ED08 )
位段 名稱 類型 復位值 描述
7-28 TBLOFF RW 0 向量表的起始地址
29 TBLBASE R - 向量表是在Code 區(0),還是在RAM區(1)
每個外部中斷都在NVIC 的下列寄存器中“掛號”:
使能與除能寄存器
懸起與“解懸”寄存器
優先級寄存器
活動狀態寄存器
另外,下列寄存器也對中斷處理有重大影響
異常掩蔽寄存器(PRIMASK, FAULTMASK 以及BASEPRI)
向量表偏移量寄存器
軟件觸發中斷寄存器
優先級分組位段
cortex_m3 內核對於每一個外部中斷通道都有相應的控制字和控制位,用於單獨的和總
的控制該中斷通道。它們包括有:
z 中斷優先級控制字:PRI_n(上面提到的)
z 中斷允許設置位:在 ISER 寄存器中
z 中斷允許清除位:在 ICER 寄存器中
z 中斷懸掛 Pending(排隊等待)位置位:在 ISPR 寄存器中(類似於置中斷通道標志位)
z 中斷懸掛 Pending(排隊等待)位清除:在 ICPR 寄存器中(用於清除中斷通道標志位)
z 正在被服務(活動)的中斷(Active)標志位:在 IABR 寄存器中,(只讀,可以知道當
前內核正在處理哪個中斷通道)
中斷系統設置全過程的演示
下面給出一個簡單的例子,以演示如何建立一個外部中斷。
1. 當系統啟動后,先設置優先級組寄存器。缺省情況下使用組0 (7位搶占優先級,1位亞優
先級)。
2. 如果需要重定位向量表,先把硬fault和NMI服務例程的入口地址寫到新表項所在的地址中。
3. 配置向量表偏移量寄存器,使之指向新的向量表(如果有重定位的話)
4. 為該中斷建立中斷向量。因為向量表可能已經重定位了,保險起見需要先讀取向量表偏移
量寄存器的值,再根據該中斷在表中的位置,計算出對應的表項,再把服務例程的入口地址填寫進
去。如果一直使用ROM中的向量表,則無需此步驟。
5. 為該中斷設置優先級。
6. 使能該中斷
如果應用程序儲存在ROM中,並且不需要改變異常服務程序,則我們可以把整個向量表編碼到
ROM的起始區域(從0地址開始的那段)。在這種情況下,向量表的偏移量將一直為0,並且中斷向量
一直在ROM中,因此上例可以大大簡化,只需3步:
1. 建立優先級組
2. 為該中斷指定優先級
3. 使能該中斷
如果在I/O密集型系統中,軟件需要控制大量的硬件設備,則可能必須要考慮如下因素:
該芯片支持的中斷數
該芯片中表達優先級的位數
對於stm32,實現了16個異常(其中6個保留),實現了60個中斷,所以就有兩個中斷設置使能寄存器ISER0和ISER1,每個可以控制32個中斷的使能,也有兩個中斷清除寄存器ICER0和ICER1.例如RTC中斷,向量位置為3,即RTC向量地址為4*(16+3)= 0x4C位置.要實現RTC中斷處理,首先在啟動文件中0x4C位置放入RTC_IRQHandler()函數的首地址,(keil編譯器自動生成)然后ISER0 |= (0x01 << 3);即可.
如果要產生中斷,必須事先配置好並使能中斷線。根據需要的邊沿檢測設置2個觸發寄存器,同
時在中斷屏蔽寄存器的相應位寫’1’ 允許中斷請求。當外部中斷線上發生了需要的邊沿時,將產
生一個中斷請求,對應的掛起位也隨之被置’1’。在掛起寄存器的對應位寫’1’,可以清除該中斷
請求。
如果要為產生事件,必須事先配置好並使能事件線。根據需要的邊沿檢測通過設置2個觸發寄存
器,同時在事件屏蔽寄存器的相應位寫’1’允許事件請求。當事件線上發生了需要的邊沿時,將
產生一個事件請求脈沖,對應的掛起位不被置’1’。
通過在軟件中斷/事件寄存器寫’1’,也可以通過軟件產生中斷/事件請求。
硬件中斷選擇
通過下面的過程來配置19個線路做為中斷源:
● 配置19個中斷線的屏蔽位(EXTI_IMR)
● 配置所選中斷線的觸發選擇位(EXTI_RTSR和EXTI_FTSR);
● 配置那些控制映像到外部中斷控制器(EXTI)的NVIC中斷通道的使能和屏蔽位,使得19個中
斷線中的請求可以被正確地響應。
硬件事件選擇
通過下面的過程,可以配置19個線路為事件源
● 配置19個事件線的屏蔽位(EXTI_EMR)
● 配置事件線的觸發選擇位(EXTI_RTSR和EXTI_FTSR)
軟件中斷/事件的選擇
19個線路可以被配置成軟件中斷/事件線。下面是產生軟件中斷的過程:
● 配置19個中斷/事件線屏蔽位(EXTI_IMR, EXTI_EMR)
● 設置軟件中斷寄存器的請求位(EXTI_SWIER)
具體配置步驟:配置向量表(在時鍾初始化里面)
使能端口(A—G時鍾)
設置端口方向,上拉下拉
使能IO復位時鍾RCC->APB2ENR
配置外部中斷輸入源AFIO->EXTICR
開啟line BITx上的中斷EXTI->IMR
EXTI->FTSR或EXTI->RTSR上升沿或下降沿觸發
設置分組SCB->AIRCR
使能中斷位NVIC->ISER
搶占優先級和響應優先級NVIC->IPR(不完全手冊68頁)
最后中斷服務函數