STM32 中斷應用概覽
本章參考資料《 STM32F4xx 中文參考手冊》第十章-中斷和事件、《ARM Cortex?-
M4F 技術參考手冊》 -4.3 章節: NVIC 和 4.4 章節: SCB—4.4.5 的 AIRCR。
STM32 中斷非常強大,每個外設都可以產生中斷,所以中斷的講解放在哪一個外設裏
面去講都不合適,這裏單獨抽出一章來做一個總結性的介紹,這樣在其他章節涉及到中斷
部分的知識我們就不用費很大的篇幅去講解,只要示意性帶過即可。
本章如無特別說明,異常就是中斷,中斷就是異常,請不要刻意鉆牛角尖較勁。
異常類型
F429 在內核水平上搭載了一個異常響應系統, 支持為數眾多的系統異常和外部中斷。
其中系統異常有 10 個,外部中斷有 91 個。除了個別異常的優先級被定死外,其它異常的
優先級都是可編程的。有關具體的系統異常和外部中斷可在標準庫文件 stm32f4xx.h 這個頭
文件查詢到,在 IRQn_Type 這個結構體裏面包含了 F4 系列全部的異常聲明。
NVIC 簡介
在講如何配置中斷優先級之前,我們需要先了解下 NVIC。 NVIC 是嵌套向量中斷控制
器,控制著整個芯片中斷相關的功能,它跟內核緊密耦合,是內核裏面的一個外設。但是
各個芯片廠商在設計芯片的時候會對 Cortex-M4 內核裏面的 NVIC 進行裁剪,把不需要的
部分去掉,所以說 STM32 的 NVIC 是 Cortex-M4 的 NVIC 的一個子集。
NVIC 寄存器簡介
在固件庫中, NVIC 的結構體定義可謂是頗有遠慮,給每個寄存器都預覽了很多位,
恐怕為的是日後擴展功能。不過 STM32F429 可用不了這麽多,只是用了部分而已,具體
使用了多少可參考《ARM Cortex
NVIC 中斷配置固件庫
固件庫文件 core_cm4.h 的最後,還提供了 NVIC 的一些函數,這些函數遵循 CMSI 規
則,只要是 Cortex-M4 的處理器都可以使用。
優先級定義
在 NVIC 有一個專門的寄存器:中斷優先級寄存器 NVIC_IPRx(在 F429 中, x=0...90)
用來配置外部中斷的優先級, IPR 寬度為 8bit,原則上每個外部中斷可配置的優先級為
0~255,數值越小,優先級越高。但是絕大多數 CM4 芯片都會精簡設計,以致實際上支持
的優先級數減少,在 F429 中,只使用了高 4bit,如下所示:
在配置每個中斷的時候一般有 3 個編程要點:
1、 使能外設某個中斷,這個具體由每個外設的相關中斷使能位控制。比如串口有發送
完成中斷,接收完成中斷,這兩個中斷都由串口控制寄存器的相關中斷使能位控制。
2、 初始化 NVIC_InitTypeDef 結構體,配置中斷優先級分組,設置搶占優先級和子優
先級,使能中斷請求
2) NVIC_IRQChannelPreemptionPriority:搶占優先級,具體的值要根據優先級分組來
確定,具體參考表格 16 優先級分組真值表 。
3) NVIC_IRQChannelSubPriority:子優先級,具體的值要根據優先級分組來確定,具
體參考表格 16 優先級分組真值表 。
4) NVIC_IRQChannelCmd:中斷使能( ENABLE)或者失能( DISABLE) 。操作的
是 NVIC_ISER 和 NVIC_ICER 這兩個寄存器。
3、 編寫中斷服務函數
在啟動文件 startup_stm32f429_439xx.s 中我們預先為每個中斷都寫了一個中斷服務函
數,只是這些中斷函數都是為空,為的只是初始化中斷向量表。實際的中斷服務函數都需
要我們重新編寫,中斷服務函數我們統一寫在 stm32f4xx_it.c 這個庫文件中。
關於中斷服務函數的函數名必須跟啟動文件裏面預先設置的一樣,如果寫錯,系統就
在中斷向量表中找不到中斷服務函數的入口,直接跳轉到啟動文件裏面預先寫好的空函數,
並且在裏面無限循環,實現不了中斷。
best practice:
用中斷優先級分組0或4最好,省去一大堆比較,誰小誰優先級高,相同看硬件中斷表。
STM32 中斷應用概覽