一、 S32K144 Interrupt介紹
1. Arm Cortex-M4F 中斷結構及中斷過程
ARM Cortex-M4F 內(nèi)核模塊框圖
S32K144 內(nèi)核ARM Cortex-M4F 把中斷分為內(nèi)核中斷與非內(nèi)核模塊中斷,并對內(nèi)核中斷和非內(nèi)核中斷進行了統(tǒng)一編號(0~254),非內(nèi)核中斷的中斷請求號(IRQ)為 0~238,對應于中斷向量號的 15~254。中斷結構原理圖如下:
ARM Cortex-M4F 中斷結構原理圖
M4F 的中斷由 M4F 內(nèi)核、嵌套向量中斷控制器(Nested Vectored Interrupt Controller,NVIC)及模塊中斷源組成。中斷過程分為兩步:第一,模塊中斷源向 NVIC 發(fā)出中斷請求信號;第二步,NVIC 對發(fā)來的中斷信號進行處理,判斷該模塊中斷源是否被使能,若使能,則通過專用外設總線(Private Peripheral Bus,PPB)發(fā)送給 M4F 內(nèi)核,由內(nèi)核進行中斷處理。如果同時有多個中斷信號到來,NVIC 則根據(jù)設定好的中斷優(yōu)先級進行判斷,優(yōu)先級高的中斷被響應,優(yōu)先級低的中斷被掛起,壓入堆棧保存;如果優(yōu)先級完全相同的多個中斷源同時請求,則先響應 IRQ 號較小的,其他被掛起。
2. NVIC 寄存器映射
NVIC 寄存器映射地址(Cortex-M4 User Guide)
- 中斷使能寄存器(NVIC_ISER)
- 中斷禁止寄存器(NVIC_ICER)
- 中斷掛起寄存器(NVIC_ISPR)
- 清除掛起寄存器(NVIC_ICPR)
- 中斷活動位寄存器(NVIC_IABR)
- 優(yōu)先級寄存器(NVIC_IPR)
上表列出了 NVIC 的寄存器映射,由于 NVIC 屬于內(nèi)核外設,具體的寄存器用法可以參考手冊《Cortex?-M4 Devices Generic User Guide》。
二、 S32DS Interrupt例程簡介與應用
下面我們以 S32DS 開發(fā)環(huán)境中自帶的例程 hello_Interrupts_s32k144為例。
1. 例程導入
- 打開S32 Design Studio,點擊:“File”->“New”->“S32DS Project from Example”。
- 在彈出的窗口選取 S32K144 目錄下的 hello_interrupts 例程,點擊“Finish”。
- 點擊左上角“Build”按鈕,編譯例程。
- 點擊“Debug”按鈕。進入例程Debug頁面。
- 點擊運行程序 按鈕,D11 LED blue 燈 1s閃爍。
D11 1s閃爍藍燈
2. 例程簡介
- Hello Interrupt介紹
此例程通過配置時鐘、GPIO、LPIT0和NVIC,將定時器實現(xiàn)的LED燈閃爍的程序放在中斷程序中實現(xiàn)LED燈的藍燈1s閃爍。
- Hello Interrupt框圖
3. 例程設計思路
- 初始化中斷需要在 NVIC中 寫入 3 句代碼來實現(xiàn):
- 清除先前未完成的中斷(假如有中斷未完成)
- -在清除掛起寄存器(ICPR)中的對應位寫1
- 啟用所需中斷
- -在中斷使能寄存器(ISER)中的對應位寫1
- 設置中斷優(yōu)先級
- -在對應的中斷優(yōu)先級寄存器(IP)中寫入一個在0~15之間的優(yōu)先級
- 程序設計思路:
- 初始化端口 D module
- 使能端口 D 時鐘
- 配置 PTD0 為輸出模式(藍燈)
- 初始化系統(tǒng)時鐘(SOSC)為8MHz
- 初始化 SOSC 分頻器
- 配置范圍,高增益,參考系數(shù)
- 確保 SOSC 控制狀態(tài)寄存器是可寫的
- 使能 SOSC 控制狀態(tài)寄存器中的 SOSC
- 等待 SOSC 生效
- 初始化系統(tǒng)鎖相環(huán)(SPLL)為160MHz
- 確保 SPLL 禁止配置
- 初始化 SPLL 分頻器
- 初始化 PLL 分頻和倍頻系數(shù)
- Fpll = Fosc / PLL Ref Clk Divider x Sys PLL Multiplier / 2 = 8 MHz / 1 x 20 / 2= 160 MHz
- 確保 SPLL 控制狀態(tài)寄存器可寫
- 使能 SPLL 控制狀態(tài)寄存器中的 SPLL
- 等待 SPLL 生效
- 初始化 LPIT 0 通道
- 使能時鐘源為 SPLL_DIV2_CLK
- 使能 LPITO 寄存器時鐘
- 使能 LPIT0 模塊
- 初始化 0 通道:
- 使能該通道中斷
- 超時時間=1s
- 設置計數(shù)器模式并使能 0 通道
- 改變 SPLL 工作模式為 Normal RUN Mode
- 初始化 CORE、BUS、FLASH 的分頻系數(shù)
- 切換系統(tǒng)時鐘為 SPLL(160MHz)
- 禁止看門狗
- 主函數(shù):永遠等待
- LPIT_0 0 通道中斷處理程序:
- 清除通道溢出位
- 裝載計數(shù)器
- 翻轉 PTD0 GPIO 輸出
- 清除通道溢出位
三、 例程代碼解釋以及寄存器介紹
1. void NVIC_init_IRQs (void)
- S32_NVIC->ICPR[1] = 1 << (48 % 32); /* IRQ48-LPIT0 ch0: clr any pending IRQ*/
ICPR: Interrupt Clear-pending Registers 中斷清除掛起寄存器
NVIC ICPR 寄存器映射地址
NVIC_ICPR0-NVIC_ICPR7 寄存器清除推遲狀態(tài)的中斷,并顯示推遲中的中斷。操作方法如下:
S32K144 向量表
查詢 S32K144.h 可得 PORTD 的向量值為 64,對應 IRQ 為 48。查詢 S32K144 NVIC 寄存器地址可以看到 256 個中斷向量被分為 8 個寄存器,每個寄存器共 32 位。通過移位運算給 PORTD 對應的 ICPR 寄存器賦值 1,清除 PORTD 中斷。
- S32_NVIC->ISER[1] = 1 << (48 % 32); /* IRQ48-LPIT0 ch0: enable IRQ */
ISER:Interrupt Set-enable Registers 中斷使能寄存器
NVIC ISER 寄存器映射地址
NVIC_ISER0-NVIC_ISER7 寄存器使能中斷,并顯示已經(jīng)使能的中斷。
通過移位運算給 PORTD 對應的的 ISER 寄存器賦值 1,使能 PORTD 中斷。
- S32_NVIC->IP[48] = 0x0A; /* IRQ48-LPIT0 ch0: priority 10 of 0-15*/
IP:Interrupt Priority Registers 中斷優(yōu)先級寄存器
NVIC IPR寄存器映射地址
NVIC_IPR0-NVIC_IPR59 寄存器為每一個中斷提供8 bit的優(yōu)先級域,每個寄存器(32bit)包含4個優(yōu)先級域。這些寄存器都是可以設置的。
NVIC IPR 寄存器分配
NVIC IPR 寄存器與優(yōu)先級域對照
通過位運算直接給 PORTD 對應的IPR寄存器賦值優(yōu)先級,優(yōu)先級為 8 bit 數(shù)值。
2. void LPIT0_Ch0_IRQHandler (void) {}
中斷函數(shù),在需要中斷的模塊名后添加IRQHandler。
3. 主程序
等待中斷狀態(tài)。
四、 參考文獻
[1] Cortex?-M4 Devices Generic User Guide.pdf,ARM
[2] S32K1xx Series Cookbook.pdf,NXP
[3] S32K144 Reference Manual.pdf,NXP
登陸大大通,了解更多詳情,解鎖1000+系統(tǒng)級應用方案,更有大聯(lián)大700+FAE在線為您答疑解惑!
-
mcu
+關注
關注
146文章
17123瀏覽量
350983 -
NXP
+關注
關注
60文章
1278瀏覽量
184039 -
NVIC
+關注
關注
0文章
35瀏覽量
11695 -
S32k144
+關注
關注
1文章
9瀏覽量
1894
發(fā)布評論請先 登錄
相關推薦
評論