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