飛思卡爾Kinetis芯片中NVIC模塊的中斷寄存器的介紹及其應用舉例

NVIC模塊的中斷寄存器簡介
嵌套式向量中斷控制器(NVIC)是Cortex內核不可分割的一部分,它與CPU緊密結合,可對系統異常和外設中斷進行控制。如圖1所示,NVIC右端連接到各個外圍模塊,負責對外設中斷進行處理;左端連接到內核,負責對內核系統異常進行處理。本文重點介紹NVIC對外圍模塊的中斷控制。通常,在配置某個外圍模塊的中斷功能時,除了需要設置此模塊本身的寄存器中的中斷使能位外,還需要配置NVIC模塊中對應的中斷控制寄存器,系統纔會響應此外圍模塊的中斷請求。
這裏寫圖片描述
ARM Cotex-M4的NVIC模塊中相關寄存器的地址、名稱、功能描述如圖2所示,它們可分爲兩種類型:非優先級中斷寄存器(non-IPR register)和優先級中斷寄存器(IPR register)。其中,非優先級中斷寄存器有以下幾種:
NVICISERx:中斷使能設置寄存器;
NVICICERx:中斷使能清除寄存器;
NVICISPRx:中斷掛起設置寄存器;
NVICICPRx:中斷掛起清除寄存器;
NVICIABRx;中斷激活狀態寄存器;
其中x爲0 - 7,稱爲寄存器的組號,表示每種寄存器都有8個。這些寄存器都是32位的。因此,如果每一位控制一箇中斷源,則可以分別控制256箇中斷源。通常, NVICISERx(中斷使能設置寄存器)用於去使能某個中斷,而NVICICPRx(中斷掛起清除寄存器)用於配合NVICISERx寄存器來使能這個中斷;NVICIABRx(中斷激活狀態寄存器)爲只讀寄存器,用於判斷某個中斷是否處於激活的狀態。這裏寫圖片描述
而優先級中斷寄存器只有一種: NVICIPRx,用於設定每個中斷源的優先級。從圖3可以看到,每個中斷源的優先級控制字要佔用4位,再加上保留位,則每個32位的寄存器可以配置4箇中斷源的優先級。因此,如果要配置256箇中斷源的優先級,則需要256 ÷ 4 = 64個32位的寄存器。但是Kinetis系列MCU的中斷源一般都沒有這麼多,也就不需要這麼多的寄存器。
這裏寫圖片描述
下面以K60爲例進行具體說明。K60支持16級中斷控制,所以在NVIC中,對應於不同的中斷源,在優先級中斷寄存器NVICIPRx中都有4個相應的位來控制其優先級,另外還有4位是保留位,如圖3所示。
從圖2可以看出,每種非優先級中斷寄存器都是一個包含8個32位寄存器的寄存器組。那麼在應用過程中,對應於K60的90多種不同的中斷源,應該配置這些寄存器組中的哪一個寄存器(組號)和該32位寄存器的那一位(位號)呢?簡單來說,就是組號和位號的確定。例如NVICICER2[21],它的組號就是2,位號就是21。這就需要藉助芯片廠商在CPU中爲不同中斷源定義的中斷請求號IRQ。需要特別注意的是,中斷向量號和中斷請求號IRQ號不同,中斷請求號IRQ = 中斷向量號-16,因爲有16個ARM內核中斷請求是沒有分配IRQ號的。在K60的Reference Manual 的P74頁可以看到CPU中斷向量分配表,定義了各種不同的中斷源所對應的中斷入口地址、中斷向量號、中斷請求號、寄存器號以及彼此之間的關係,如圖4所示。這裏寫圖片描述
這裏結合K60的中斷向量分配表,以LPTMR(低功耗定時器)模塊爲例介紹一下NVIC寄存器的配置。LPTMR模塊的中斷向量分配如圖4所示,可以看到LPTMR中斷入口地址爲0x0000_0194,中斷向量號爲101,中斷請求號IRQ爲85。那麼如何確定配置LPTMR中斷所對應的NVIC寄存器的組號和位號呢?即LPTMR使用NVIC寄存器組中的哪一個寄存器,以及該寄存器的哪個位呢?它們又和中斷向量號 IRQ有什麼關係呢,下面分非優先級中斷寄存器和優先級中斷寄存器分別介紹。
對於非優先級中斷寄存器,如上面提到的NVICISERx、NVICICERx、NVICSPRx、NVICCPRx以及NVICABRx,組號的計算公式爲IRQ / 32,所以可以得到LPTMR的NVIC非優先級中斷寄存器的組號爲85 / 32 = 2,從而得到LPTMR需要使用的非優先級中斷寄存器爲 NVICISER2、 NVICICER2、 NVICISPR2、NVICICPR2、NVICIABR2。這些寄存器都是32位的,所以對應於LPTMR的位號計算公式爲IRQ % 32,得到85 % 32 = 21。確定完了組號和位號,便得到了需要設置的LPTMR的非優先級中斷控制寄存器及相應的位爲:NVICISER2[21]、 強調內容NVICICER2[21]、 NVICISPR2[21]、NVICICPR2[21]、NVICIABR2[21]。
對於優先級中斷寄存器IPR,如上所述,因爲每一個IPR寄存器可以設置4箇中斷源的優先級,所以組號計算公式爲IRQ / 4 = 21。下面確定位號,前面講到優先級控制需要4位,另外還有4位保留位,所以每個中斷源需要8位,因此位起始號的計算公式爲8 * (IRQ % 4) + 4,得到LPTMR的位起始號爲8 * (85 % 4) + 4 = 12。確定完了組號和位號,便得到了LPTMR的優先級中斷寄存器及相應的位爲:NVICIPR21[15:12]。
通常,中斷程序的處理流程爲:關閉系統總中斷、開啓外設模塊並使能該外設模塊中斷、配置NVIC模塊中的中斷寄存器、開總中斷等幾個過程。
第一步,關閉系統總中斷。一般採用宏定義DisableInterrupts,其本質是在內部調用一句彙編代碼“CPSID i”。同樣,打開總中斷一般採用EnableInterrupts,本質是在內部調用一句彙編代碼“CPSIE i”。
第二步,開啓外設模塊並使能其中斷。需要設置外設模塊的寄存器中的中斷使能位。對於LPTMR,需要置位控制狀態寄存器LPTMRx_CSR的TIE位。 SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK; //開LPT模塊時鐘 LPTMR0_CSR|=LPTMR_CSR_TIE_MASK; //使能LPT定時器中斷
第三步,配置NVIC模塊的中斷寄存器。需要設置NVIC中相關的中斷控制寄存器,如上面提到的NVICISERx、NVICICERx、NVICSPRx、NVICCPRx、NVICABRx以及NVICIPRx。值得注意的是,使能一個外設的中斷需要完成兩個步驟,首先置位 NVICICPRx(中斷掛起清除寄存器),然後再置位NVICISERx(中斷使能設置寄存器)。其原因在於,在完成第二步開啓並使能外設模塊中斷後,外設模塊便可以被觸發產生中斷請求,這時如果置位NVICISERx(中斷使能設置寄存器),程序便可以進入中斷服務程序,而這並非程序編寫者的本意。所以爲避免出現這種情況,需要首先置位NVICICPRx(中斷掛起清除寄存器),清除已經掛起的中斷,然後再置位NVICISERx(中斷使能設置寄存器),等待下一個中斷的發生。

發佈了13 篇原創文章 · 獲贊 79 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章