STM32W108的中斷系統由兩部分組成:一個標準的ARM Cortex-M3嵌套向量中斷控制器(NVIC)提供頂層(一級)中斷,一個事件管理器(EM)提供第二級中斷。NVIC和EM提供了一個簡單的層次結構,所有EM的第二級中斷都會送入NVIC中的頂層中斷。這兩個層次結構既允許很好的微觀控制中斷源,也能宏觀的控制整個外圍設備,同時允許外設有自己的中斷向量。
在工程實踐中,頂層外設中斷僅用於啓用或禁用一個外設的中斷,二級中斷來自於硬件,因此,它纔是應用程序使用中斷的主要部分。
7.1 中斷控制器
7.1.1嵌套向量中斷控制器(NVIC)
ARM Cortex-M3的嵌套向量中斷控制器(NVIC)有利於低延時的異常和中斷的處理,NVIC和處理器內核接口是密切耦合的,從而允許低延遲的中斷處理並能夠有效地處理後續中斷,同時NVIC還具有中斷嵌套能力。
ARM Cortex-M3的NVIC包含10個標準中斷,它們都與芯片、CPU操作以及管理有關。除了10個標準中斷,具體對於STM32W108,還包含了17個單獨的矢量外設中斷。
NVIC定義了一系列異常,這些異常不僅包括傳統的外設中斷,也包括一些特定的事件,如故障和CPU復位。在ARM Cortex-M3的NVIC中,CPU復位事件被認爲是一個高優先級的異常,並且會從NVIC異常表中的初始位置加載堆棧指針。NVIC異常表定義了所有的異常和它們的級別,包括外設中斷。每個異常的級別是很重要的,因爲它被直接轉變成每個中斷的32位的中斷向量位置,並且定義了異常的硬件優先級。表中的每個異常都是一個32位的地址,在異常發生時被加載到程序計數器中。表7.1列出了全部的異常表,異常0(堆棧指針)到異常15(SysTick)是標準的ARM Cortex-M3的NVIC一部分,而異常16(定時器1)至異常32(調試)是STM32W108的專用外設中斷,更詳細的外設中斷在表7.2中列出。
表7.1. NVIC異常表
異常 |
編號 |
描述 |
- |
0 |
復位時從第一個向量表中載入棧頂 |
復位 |
1 |
上電和熱復位時應用,執行第一條指令後,優先級降到最低(線程模式),異步的 |
NMI(不可屏蔽中斷) |
2 |
不能被任何異常所停止或搶佔,除了復位,異步的 |
硬件異常 |
3 |
所有硬件異常,由於優先級或配置異常處理被禁止,異常不能激活,同步的 |
內存異常 |
4 |
MPU不匹配,包括非法訪問和不匹配,同步的 |
總線異常 |
5 |
預取指,內存訪問,以及其它地址/內存相關的故障。精確時同步,不精確時異步 |
用戶異常 |
6 |
使用故障,例如執行了未定義指令或非法狀態轉換,同步的 |
- |
7-10 |
保留 |
SVC調用 |
11 |
使用SVC指令的系統服務調用,同步的 |
調試監控器 |
12 |
調試監控中斷,當沒有暫停時,同步的,但只有使能時會激活。如果優先級低於其他當前有效中斷,則不激活 |
- |
13 |
保留 |
PendSV |
14 |
系統服務可掛起的請求,異步的,並只能由軟件掛起 |
SysTick |
15 |
系統節拍定時器失效,異步的 |
定時器1 |
16 |
定時器1外設中斷 |
定時器2 |
17 |
定時器2外設中斷 |
管理器 |
18 |
管理外設中斷 |
基帶 |
19 |
基帶外設中斷 |
睡眠定時器 |
20 |
睡眠定時器外設中斷 |
21 |
串口控制器1外設中斷 |
|
串口控制器2 |
22 |
串口控制器2外設中斷 |
安全部件 |
23 |
安全部件外設中斷 |
MAC定時器 |
24 |
MAC定時器外設中斷 |
MAC傳輸 |
25 |
MAC傳輸外設中斷 |
MAC接收 |
26 |
MAC接收外設中斷 |
ADC |
27 |
ADC外設中斷 |
IRQA |
28 |
IRQA外設中斷 |
IRQB |
29 |
IRQB外設中斷 |
IRQC |
30 |
IRQC外設中斷 |
IRQD |
31 |
IRQD外設中斷 |
調試 |
32 |
調試外設中斷 |
NVIC還包含一個軟件可配置的中斷優先級機制,復位、NMI和硬件故障異常始終是優先級最高的中斷,並且軟件不可更改。所有其它的異常都可以被分配一個5位的優先級號,數值越小優先級越高。如果有某些異常具有相同的軟件可配置的優先級,那麼NVIC就會使用硬件定義的優先級進行區分,硬件定義的優先級編號和其在異常表中的位置一樣。例如,如果IRQA和IRQB同時發生了,並且擁有相同的軟件定義的優先級,那麼NVIC就會處理優先級爲28的IRQA,因爲它比優先級爲29的IRQB有更高的硬件優先級。
頂層一級中斷由5個ARMCortex-M3 NVIC寄存器控制:INT_CFGSET、INT_CFGCLR、INT_PENDSET、INT_PENDCLR和INT_ACTIVE,寫0到這五個寄存器中的任何位都是無效的。
● INT_CFGSET - 寫1到INT_CFGSET中可以使能該頂層中斷。
● INT_CFGCLR - 寫1到INT_CFGCLR中可以禁用該頂層中斷。
● INT_PENDSET - 寫1到INT_PENDSET中可以觸發該頂層中斷。
● INT_PENDCLR - 寫1到INT_PENDCLR中可以清除該頂層中斷。
● INT_ACTIVE不能被寫入,是用於標識當前哪些中斷是被激活的。
INT_PENDSET和INT_PENDCLR寄存器用於設置和清除中斷標誌;INT_CFGSET和INT_CFGCLR寄存器用於設置和清除中斷標誌的屏蔽位。中斷可能會在任何時候被提交或清除,但只有相應的屏蔽位(INT_CFGSET)被置位的中斷提交後纔會被處理。如果INT_CFGSET中的一位被置位,並且相應的INT_PENDSET位也被置位,那麼該中斷會被處理。如果在設置完INT_PENDSET之後設置INT_CFGSET,那麼中斷同樣會被處理。頂層一級中斷的中斷標誌(信號)是根據電平進行判斷的。
想了解更多的關於NVIC和Cortex-M3異常的信息,請參閱ARM Cortex-M3的技術手冊和ARM ARMv7-M架構手冊。
不可屏蔽中斷(NMI)
不可屏蔽中斷(NMI)是一種特殊情況,儘管是10個標準ARMCortex-M3 NVIC中斷的其中之一,但它是源自於事件管理器,就像外設中斷一樣。NMI有2個二級中斷源:24MHz晶振故障和看門狗低水位線(即將溢出)。
1.24MHz晶振故障:如果STM32W108的主時鐘SCLK使用24MHz晶振,而晶振出現故障,STM32W108會檢測到故障並自動切換到使用內部的12MHz RC時鐘。當此故障檢測和切換已經發生,STM32W108就會觸發CLK24M_FAIL二級中斷,然後這個中斷又會觸發NMI。
2.看門狗低水位線:如果STM32W108的看門狗是激活的並且看門狗計數器在1.792s時沒有被複位,那麼看門狗就會觸發WATCHDOG_INT二級中斷,然後這個中斷又會觸發NMI。
本文出自《STM32W108嵌入式無線傳感器網絡》邱鐵,夏鋒,周玉編著.清華大學出版社,2014年5月