目錄
STM32中斷
NVIC 中斷控制器
NVIC優先級分組
EXTI 外部中斷
AFIO 復用IO口
外部中斷/事件控制器(EXTI)框圖
STM32中斷
????????在STM32微控制器中,共有68個可屏蔽中斷通道,涵蓋了多個外設,如外部中斷(EXTI)、定時器(TIM)、模擬數字轉換器(ADC)、串行外設接口(USART)、串行外設接口(SPI)、I2C總線、實時時鐘(RTC)等。
????????這些中斷通道的管理由嵌套向量中斷控制器(NVIC)負責。NVIC提供了統一的中斷管理機制,允許對每個中斷通道設置16個可編程優先級。這些優先級可以通過分組進行配置,用戶可以設定中斷的搶占優先級和響應優先級,從而實現對中斷的精細化控制。這種機制有助于在復雜系統中合理地調度中斷,確保實時性和系統響應性。
NVIC 中斷控制器
????????NVIC(Nested Vectored Interrupt Controller)嵌套向量中斷控制器,是 Cortex-M 內核中的一部分,用于管理中斷的觸發、優先級排序和 CPU 響應。
簡而言之:
????????NVIC 是 STM32 中用來 統一管理各個中斷事件 的模塊,決定了“誰能打斷 CPU”、“什么時候打斷”、“打斷完誰先執行”。
NVIC 的核心功能
功能 | 說明 |
---|---|
中斷使能/屏蔽 | 可以啟用或關閉某個中斷源 |
中斷優先級管理 | 每個中斷可以分配優先級(0~15) |
中斷響應控制 | 控制 CPU 響應中斷的方式 |
中斷掛起清除 | 手動觸發/清除掛起中斷 |
中斷源外設
包括:
EXTI:外部中斷(如按鍵觸發)
TIM:定時器(溢出中斷、PWM更新中斷)
ADC:模數轉換完成中斷
USART:串口接收/發送完成中斷
這些外設都可以產生中斷信號。
黑色 “n” 路線:中斷請求線
每個外設可能有多個中斷類型(如 TIM1 有更新中斷、比較中斷等),這些中斷通過中斷請求線發給 NVIC。
NVIC 模塊
NVIC 收到多個中斷請求后:
根據中斷源設置的優先級
決定哪個中斷先被 CPU 響應處理
若一個中斷發生時有更高級的中斷,也可以實現嵌套中斷
NVIC 的優先級從 0(最高)~15(最低)。圖中綠色框優先級0~優先級15 表示優先級調度隊列。
橙色區域:STM32 內核(CPU核心 + NVIC)
NVIC 是屬于 Cortex-M 內核的一部分,圖中 NVIC 模塊包裹在內核塊中,最終中斷是由 CPU 執行對應的中斷服務函數(ISR)
NVIC優先級分組
????????NVIC的中斷優先級由優先級寄存器的4位(0~15)決定,這4位可以進行切分,分為高n位的搶占優先級和低4-n位的響應優先級
????????搶占優先級高的可以中斷嵌套,響應優先級高的可以優先排隊,搶占優先級和響應優先級均相同的按中斷號排隊
分組方式 | 搶占優先級(高位) | 響應優先級(低位) |
---|---|---|
分組0 | 0 位,取值為 0 | 4 位,取值為 0~15 |
分組1 | 1 位,取值為 0~1 | 3 位,取值為 0~7 |
分組2 | 2 位,取值為 0~3 | 2 位,取值為 0~3 |
分組3 | 3 位,取值為 0~7 | 1 位,取值為 0~1 |
分組4 | 4 位,取值為 0~15 | 0 位,取值為 0 |
EXTI 外部中斷
????????EXTI(External Interrupt)外部中斷 是STM32微控制器中用于監測外部信號并觸發中斷的一種機制。EXTI模塊能夠監測指定GPIO引腳的電平信號變化,并在GPIO引腳發生電平變化時立即向NVIC發出中斷請求。當NVIC接收到該請求后,會根據中斷優先級的設置決定是否中斷當前的CPU主程序,并執行與該中斷關聯的中斷服務程序。
EXTI的主要特點:
支持的觸發方式:
上升沿觸發: 當GPIO引腳的電平從低電平變為高電平時觸發中斷。
下降沿觸發: 當GPIO引腳的電平從高電平變為低電平時觸發中斷。
雙邊沿觸發: 當GPIO引腳的電平發生變化,無論是從低到高,還是從高到低時都會觸發中斷。
軟件觸發: 可以通過軟件命令觸發中斷,不依賴GPIO引腳的電平變化。
支持的GPIO口:
????????EXTI可以監測幾乎所有的GPIO口,包括STM32的所有引腳。但是同一個GPIO引腳不能同時觸發多個中斷通道。一個引腳只能與一個中斷通道綁定。
中斷通道:
????????EXTI模塊支持最多16個GPIO引腳觸發的外部中斷,另外還包括一些特殊的觸發源,如PVD(電壓檢測輸出)、RTC鬧鐘、USB喚醒和以太網喚醒等。
觸發響應方式:
????????EXTI不僅支持傳統的中斷響應,還支持事件響應。在事件響應模式下,系統可以響應外部信號的變化,但并不一定中斷當前的CPU任務。根據配置,可以選擇不同的響應方式來滿足不同的應用需求。
? ? ? ? 總之,EXTI外部中斷功能能夠監測GPIO引腳的電平變化,并通過不同的觸發方式(上升沿、下降沿、雙邊沿或軟件觸發)來生成中斷請求,經過NVIC的裁決后,CPU可被打斷并執行相關的中斷服務程序。EXTI模塊支持多種GPIO口,并能夠處理多種外部信號觸發,靈活地支持不同的響應模式。
從 GPIO 到中斷觸發的完整路徑:
GPIOx → AFIO(引腳選擇)→ EXTI(邊沿檢測)→ NVIC(優先級管理)→ CPU 執行中斷服務函數
GPIO 外設輸入端口(GPIOA、GPIOB、GPIOC…)
每個 GPIO 端口有 16 個引腳(0~15)
這些引腳可以作為普通輸入,也可以配置為中斷觸發輸入
但多個端口(如 PA0、PB0、PC0)不能同時映射到同一個 EXTI0 線,需要選擇誰占用
AFIO 模塊(Alternate Function IO)
AFIO:中斷引腳選擇器
它的作用是告訴 EXTI 哪個 GPIO 引腳連接到哪一條 EXTI 線。
關鍵點:
STM32F1 的 EXTI 有 16 條(EXTI0 ~ EXTI15)
每條 EXTI 線最多只能掛接一個引腳
AFIO_EXTICRx 寄存器用來設置:
例如 EXTI0 ← PA0 或 PB0 或 PC0,由軟件配置
EXTI 模塊(邊沿檢測與中斷控制器)
EXTI = External Interrupt/Event Controller
它負責:
監控外部信號的上升沿 / 下降沿
將觸發事件發出中斷請求
將中斷信號傳遞給 NVIC
還可以控制:
是否屏蔽中斷(IMR)
是否只作為事件觸發(EMR)
AFIO 復用IO口
????????在 STM32 微控制器中,AFIO(Alternate Function I/O)模塊是一個非常關鍵的外設控制單元,主要負責 引腳的復用功能選擇與重定義。由于 STM32 的某些外設功能(如 USART、TIM、SPI 等)可以復用到多個不同的引腳上,因此需要通過 AFIO 模塊來進行合理的映射和配置。
AFIO 主要完成以下兩個核心任務:
????????復用功能引腳的重映射:當默認的外設引腳與實際設計沖突時,可以通過 AFIO 對這些引腳的映射關系進行重新定義,將某個功能分配到另一個引腳上。例如,可以將 USART1 的 Tx/Rx 引腳從默認的 PA9/PA10 重映射到其他可選引腳。
????????外部中斷引腳的選擇(EXTI 配置):STM32 的 EXTI(外部中斷控制器)支持將 GPIOA、GPIOB、GPIOC 等多個端口的同一編號引腳(如 PA0、PB0、PC0)接到同一條 EXTI 線(如 EXTI0)。而 AFIO 則負責選擇當前哪一個具體的引腳與某條 EXTI 中斷線相連。
外部中斷/事件控制器(EXTI)框圖
這張圖主要完成了兩件事:
1. 檢測外部輸入信號是否發生邊沿變化(上升/下降)
2. 如果檢測到了,決定是否向 NVIC 發起中斷或事件觸發
整體流程:從輸入引腳 → EXTI → 中斷或事件
【1】邊沿檢測電路
來自 GPIO(或其他模塊)的電平輸入信號進入。
通過上升沿觸發寄存器和下降沿觸發寄存器設置:
是否對上升沿、下降沿敏感。
一旦檢測到配置的邊沿變化,輸出一個觸發信號。
【2】生成中斷或事件請求
邊沿檢測信號經過兩個分支:
A)進入中斷控制通路(上面那條線)
請求掛起寄存器(PR):記錄這次中A)進入中斷控制通路(上面那條線)斷事件發生了
中斷屏蔽寄存器(IMR):決定這個中斷能否被 NVIC 接收
如果沒有被屏蔽 → 送到 NVIC,啟動中斷服務函數
B)進入事件控制通路(下面那條線)
事件屏蔽寄存器(EMR):決定是否產生“事件信號”
如果允許事件 → 送入 脈沖發生器(用于觸發 DMA 或其他模塊)
【3】軟件觸發支持
軟件可直接寫入 軟件中斷事件寄存器(SWIER),人為觸發中斷或事件,模擬一次外部信號觸發。
【4】附加控制
所有寄存器都有 20 位(支持 EXTI0~EXTI19,F1 通常用前16個)
最終與門(AND)和或門(OR)控制是否允許請求生效