STM32 中斷系統深度剖析

在嵌入式系統開發領域,STM32 系列微控制器憑借其強大的性能和豐富的資源被廣泛應用。中斷系統作為 STM32 的關鍵特性之一,能夠極大地提升系統的實時響應能力和多任務處理效率。本文將基于 STM32F4 系列芯片,深入剖析中斷與外設中斷的原理、配置及應用,幫助開發者全面掌握這一核心技術。

一、中斷簡介

中斷是指當 CPU 執行程序時,由于外部或內部隨機事件的發生,導致 CPU 暫時停止正在運行的程序,轉而執行一段特殊的服務程序(中斷服務子程序或中斷處理程序)。待事件處理完畢后,CPU 再返回被中斷的程序繼續執行,引發中斷的事件源被稱為中斷源。

STM32 的中斷功能極為強大,每個外設都具備產生中斷的能力。其中,可屏蔽中斷通道多達 82 個(外部),系統異常有 10 個,并且擁有 16 個可編程優先級(使用 4 位中斷優先級) 。除個別異常優先級固定外,其他異常優先級均可編程。在標準庫文件?stm32f4xx.h?的?IRQn_Type?結構體中,包含了 F4 系列全部的異常聲明。以 STM32F405xx/07xx 和 STM32F415xx/17xx 為例,其向量表如下:

序號優先級類型名稱說明地址
保留0x00000000
3固定Reset復位0x00000004
W固定NMI不可屏蔽中斷,RCC 時鐘安全系統(CSS)連接到此向量0x00000008
-1
0
固定
可設置
HardFault
MemManage
所有類型的錯誤
存儲器管理
0x0000000C
0x00000010
1可設置BusFault預取指失敗,存儲器訪問失敗0x00000014
2可設置UsageFault未定義的指令或非法狀態0x00000018
保留0x0000001C - 0x0000002B
3可設置SVCall通過 SWI 指令調用的系統服務0x0000002C
4可設置DebugMonitor調試監控器0x00000030
保留0x00000034
5可設置Pendsv可掛起的系統服務0x00000038
07
6
可設置
可設置
WWDG
SysTick
窗口看門狗中斷
系統滴答定時器
0x00000040
0x0000003C
18可設置PVD連接到 EXTI 線的可編程電壓檢測0x00000044
29TAMPSTAMP(PVD)中斷0x00000048
310可設置
可設置
RTC_WKUP連接到 EXTI 線的入侵和時間蔽中斷
連接到 EXTI 線的 RTC 喚醒中斷
0x0000004C
4
5
6
7
11
12
13
14
可設置
可設置
可設置
FLASH
RCC
EXTI0
EXTI1
FLASH 全局中斷
RCC 全局中斷
EXTI 線 0 中斷
0x00000050
0x00000054
0x00000058
0x0000005C
8
9
10
15
16
17
可設置
可設置
可設置
EXTI2
EXTI3
EXTI4
EXTI 線 1 中斷
EXTI 線 2 中斷
EXTI 線 3 中斷
EXTI 線 4 中斷
0x00000060
0x00000064
0x00000068
...............
80
81
87
88
可設置
可設置
哈希和隨機數發生器全局中斷
FPU 全局中斷
0x00000180
0x00000184

二、NVIC(Nested vectored interrupt controller)

NVIC 即嵌套向量中斷控制器,在中斷向量表中,優先級 7 - 88(中斷號從 0 - 82)代表著 STM32F103 的 91 個中斷 ,優先級號越小,優先級越高。當異常或中斷被觸發時,程序計數器指針(PC)會跳轉到對應地址執行,該地址存放跳轉指令,進而跳轉到服務函數執行相應功能。

在 MDK 開發環境中,可使用標準的異常和中斷向量表文件?startup_stm32f40_41xxx.s?,其中明確規定了中斷處理函數的名稱,開發者不可隨意定義。

在 STM32 中,中斷優先級由搶占式優先級和響應優先級共同決定,二者組成 4 位控制字,數值越小優先級越高。通過不同的優先級分組,可靈活配置搶占式優先級和子優先級的位數:

優先級分組搶占式優先級子優先級高 4 位使用情況描述
NVICPriorityGroup_00 級搶占優先級0 - 15 級子優先級4bit 全用于子優先級
NVICPriorityGroup_10 - 1 級搶占優先級0 - 7 級子優先級1bit 用于搶占優先級,3bit 用于子優先級
NVICPriorityGroup_20 - 3 級搶占優先級0 - 3 級子優先級2bit 用于搶占優先級,2bit 用于子優先級
NVICPriorityGroup_30 - 7 級搶占優先級0 - 1 級子優先級3bit 用于搶占優先級,1bit 用于子優先級
NVICPriorityGroup_40 - 15 級搶占優先級0 級子優先級4bit 全用于搶占優先級

具有高搶占式優先級的中斷能夠在低搶占式優先級中斷服務程序執行過程中被響應,即支持中斷嵌套;而在搶占式優先級相同的情況下,若多個子優先級不同的中斷同時到來,高子優先級的中斷優先被響應 。不過,子優先級不支持中斷嵌套,當低子優先級中斷正在執行時,高子優先級中斷需等待其執行結束才能得到響應。此外,Reset、NMI、Hard Fault 的優先級為負數,高于普通中斷優先級且不可配置。

NVIC 相關的庫函數位于?misc.c?中:

  • NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);:用于設置搶占式優先級的位數。

  • NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);:初始化配置函數,其中?NVIC_InitTypeDef?結構體定義如下:

typedef struct {uint8_t NVIC_IRQChannel; // 指定IRQ通道,可從IRQn_Type枚舉中選擇uint8_t NVIC_IRQChannelPreemptionPriority; // 搶占式優先級,取值0 - 15,值越小優先級越高uint8_t NVIC_IRQChannelSubPriority; // 子優先級,取值0 - 15,值越小優先級越高FunctionalState NVIC_IRQChannelCmd; // 使能或禁用IRQ通道,可設置為ENABLE或DISABLE
} NVIC_InitTypeDef;

三、外部中斷

3.1 外部中斷簡介

外部中斷 / 事件控制器(EXTI)負責管理控制器的 23 個中斷 / 事件線 。每個中斷 / 事件線都配備邊沿檢測器,可實現對輸入信號的上升沿和下降沿檢測。EXTI 能夠對每條中斷 / 事件線進行單獨配置,可設置為中斷或事件,并定義觸發事件的屬性。中斷線路將輸入信號傳輸至 NVIC,進而運行中斷服務函數實現軟件層面的功能;而事件線路則是向其他外設傳輸脈沖信號,屬于硬件級別的電路信號傳輸。

STM32F4 的中斷控制器支持 22 個外部中斷 / 事件請求(中斷線) 。對于每條中斷線,開發者可設置相應的觸發方式(上升沿觸發、下降沿觸發、邊沿觸發)并使能。各中斷線的映射關系如下:

  • EXTI 線 0 - 15:對應外部 IO 口的輸入中斷。

  • EXTI 線 16:連接到 PVD 輸出。

  • EXTI 線 17:連接到 RTC 鬧鐘事件。

  • EXTI 線 18:連接到 USB OTG FS 喚醒事件。

  • EXTI 線 19:連接到以太網喚醒事件。

  • EXTI 線 20:連接到 USB OTG HS(在 FS 中配置)喚醒事件。

  • EXTI 線 21:連接到 RTC 入侵和時間戳事件。

  • EXTI 線 22:連接到 RTC 喚醒事件。

系統配置控制器(SYSCFG)主要用于管理可執行代碼存儲區域的地址重映射、選擇以太網 PHY 接口以及管理 GPIO 的外部中斷線連接 。例如,SYSCFGEXTICR1 寄存器中的 EXTI0 [3:0] 位和 EXTI1 [3:0] 位分別用于映射 PA0 - PI0 和 PA1 - PI1 到相應的 EXTI 線。

3.2 配置流程

  1. 使能 GPIO 外設時鐘:為使用的 GPIO 端口提供時鐘,確保其正常工作。例如,若使用 PA0 和 PF9 端口,則需使能 GPIOA 和 GPIOF 的時鐘:

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOF, ENABLE);
    
  2. 配置外部中斷占用的 GPIO:將用于外部中斷的 GPIO 端口配置為輸入模式,無需設置復用功能。例如,配置 PA0 為按鍵輸入端口:

    GPIO_InitTypeDef gpio_struct;
    gpio_struct.GPIO_Pin = GPIO_Pin_0;
    gpio_struct.GPIO_Mode = GPIO_Mode_IN;
    gpio_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &gpio_struct);
    
  3. 使能 SYSCFG 外設時鐘:SYSCFG 用于處理外部中斷映射,因此需要使能其時鐘:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    
  4. 設置中斷線與 IO 的映射關系:通過?SYSCFG_EXTILineConfig()?函數設置 GPIO 端口與 EXTI 中斷線的映射。例如,將 PA0 映射到 EXTI0:

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
    
  5. 配置外部中斷參數:使用?EXTI_InitTypeDef?結構體配置外部中斷的相關參數,如中斷線、模式、觸發方式和使能狀態等。例如,配置 EXTI0 為上升沿觸發的中斷:

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
  6. 設置中斷優先級(NVIC):通過?NVIC_InitTypeDef?結構體設置外部中斷的優先級,包括搶占式優先級和子優先級,并使能中斷通道。例如,設置 EXTI0 的優先級:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitTypeDef mynvic;
    mynvic.NVIC_IRQChannel = EXTI0_IRQn;
    mynvic.NVIC_IRQChannelPreemptionPriority = 0;
    mynvic.NVIC_IRQChannelSubPriority = 3;
    mynvic.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&mynvic);
    
  7. 編寫中斷處理函數:中斷處理函數的名稱必須與啟動代碼向量表中定義的一致。在函數中,需檢測中斷標志位,處理完中斷后清除標志位。例如,EXTI0 的中斷處理函數:

void EXTI0_IRQHandler() {if(EXTI_GetFlagStatus(EXTI_Line0) == SET) {// 處理中斷事件,如設置標志位led_flag = 1;EXTI_ClearFlag(EXTI_Line0);}
}

3.3 實戰案例:按鍵控制 LED 閃爍

以按下按鍵使 D1 燈閃爍五次為例,完整代碼如下:

#include "stm32f4xx.h"uint8_t led_flag = 0;// 配置GPIO端口
void config_port() {RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOF, ENABLE);// 配置LED1端口為推挽低速輸出GPIO_InitTypeDef gpio_struct;gpio_struct.GPIO_Pin = GPIO_Pin_9;gpio_struct.GPIO_Mode = GPIO_Mode_OUT;gpio_struct.GPIO_OType = GPIO_OType_PP;gpio_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;gpio_struct.GPIO_Speed = GPIO_Low_Speed;GPIO_Init(GPIOF, &gpio_struct);// 按鍵端口配置gpio_struct.GPIO_Pin = GPIO_Pin_0;gpio_struct.GPIO_Mode = GPIO_Mode_IN;gpio_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &gpio_struct); 
}// 設置外部中斷(EXTI與syscfg)
void config_exti() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); 
}// 配置NVIC
void config_nvic() {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitTypeDef mynvic;mynvic.NVIC_IRQChannel = EXTI0_IRQn;mynvic.NVIC_IRQChannelPreemptionPriority = 0; mynvic.NVIC_IRQChannelSubPriority = 3;mynvic.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&mynvic);
}// 中斷函數
void EXTI0_IRQHandler() {if(EXTI_GetFlagStatus(EXTI_Line0) == SET) {led_flag = 1;EXTI_ClearFlag(EXTI_Line0);}
}// 簡單延時函數
void delay() {int i = 1000000;while(i--);
}int main() {config_port();config_exti();config_nvic();while(1) {if(led_flag == 1) {for(int i = 0; i < 5; i++) {GPIO_SetBits(GPIOF, GPIO_Pin_9);delay();delay();GPIO_ResetBits(GPIOF, GPIO_Pin_9);delay();delay();}led_flag = 0;}}
}

在上述代碼中,首先通過?config_port()?函數配置了按鍵輸入端口(PA0)和 LED 輸出端口(PF9);接著在?config_exti()?函數中完成了外部中斷的配置,將 PA0 映射到 EXTI0 并設置為上升沿觸發;config_nvic()?函數則設置了 EXTI0 的中斷優先級;最后在主函數中,根據按鍵觸發的中斷標志?led_flag?控制 LED 閃爍五次。

四、總結

本文全面深入地介紹了 STM32 中斷系統中的中斷基本概念、NVIC 的工作機制以及外部中斷的詳細原理和配置方法,并通過實際案例展示了外部中斷在按鍵控制 LED 閃爍中的應用。掌握這些知識對于開發高效、穩定的 STM32 嵌入式系統至關重要。在實際項目中,開發者可根據具體需求靈活配置中斷優先級、觸發方式等參數,充分發揮 STM32 中斷系統的強大功能,提升系統的性能和響應速度。希望本文能為廣大嵌入式開發者在 STM32 中斷開發方面提供有益的參考和幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77745.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77745.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77745.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1.3 本書結構概覽:從理論基礎到實踐案例的系統闡述

本書采用由淺入深、理論聯系實踐的結構設計&#xff0c;旨在為讀者提供一個關于大模型與智能代理(Agent)技術的全面認知框架與實施路徑。全書共分為十章&#xff0c;系統性地覆蓋了從技術基礎到企業落地的完整知識鏈條&#xff0c;現概述如下&#xff1a; 首先&#xff0c;第一…

小白訓練日記——2025/4/22

實驗描述 將GobalM模塊加入到changerEx的stage2中。 下面展示一些內聯片段&#xff1a; model dict(backbonedict(interaction_cfg(None,dict(typeGlobalM, embed_dim128,num_heads32,axial_strategyrow),dict(typeChannelExchange, p1/2),dict(typeChannelExchange, p1/2))…

【上位機——MFC】MFC入門

MFC庫中相關類簡介 CObject MFC類庫中絕大部分類的父類&#xff0c;提供了MFC類庫中一些基本的機制。 對運行時類信息的支持。對動態創建的支持。對序列化的支持。 CWinApp 應用程序類&#xff0c;封裝了應用程序、線程等信息。 CDocument 文檔類&#xff0c;管理數據 F…

代碼隨想錄第三十七天|華為秋季筆試真題230823

刷題小記&#xff1a; 主要偏向扎實編碼基礎的考察&#xff0c;但貌似近些年題目難度有所提高&#xff0c;僅供參考。 卡碼網136.獲取連通的相鄰節點列表&#xff08;卡碼網136.獲取連通的相鄰節點列表&#xff09; 題目分析&#xff1a; 題目描述&#xff1a; 存在N個轉發…

計算機視覺cv2入門之實時手勢檢測

前邊我們已經講解了使用cv2進行圖像預處理以及針對實時視頻流文件的操作方法&#xff0c;這里我們通過實時手勢檢測這一案例來學習和實操一下。 大致思路 根據手勢的種類以及指定手勢圖片數量來構建一個自己的手勢圖片數據集CNN模型訓練手勢圖片數據集使用訓練好的模型進行實時…

Java 安全:如何防止 SQL 注入與 XSS 攻擊?

Java 安全&#xff1a;如何防止 SQL 注入與 XSS 攻擊&#xff1f; 在 Java 開發領域&#xff0c;安全問題至關重要&#xff0c;而 SQL 注入和 XSS 攻擊是兩種常見的安全威脅。本文將深入探討如何有效防止這兩種攻擊&#xff0c;通過詳細代碼實例為您呈現解決方案。 一、SQL 注…

Itext進行PDF的編輯開發

這周寫了一周的需求&#xff0c;是制作一個PDF生成功能&#xff0c;其中用到了Itext來制作PDF的視覺效果。其中一些功能不是很懂&#xff0c;僅作記錄&#xff0c;若要學習請仔細甄別正確與否。 開始之前&#xff0c;我還是想說&#xff0c;這傻福需求怎么想出來的&#xff0c…

android編譯使用共享緩存

注意 服務器端與客戶端系統的版本號需為Ubuntu20.04ccache版本不能低于4.4執行用戶需要為sudo權限服務器端nfs目錄權限必須為nobody:nogroup 一、服務端配置&#xff1a; 在服務器192.168.60.142上配置 NFS 共享 1.安裝 NFS 服務器&#xff1a; 1 sudo apt-get install nfs…

工作中sql總結

sql總結 場景1分組后失敗的成功數據帶入場景2完全性質的一對一匹配場景3虛擬戶的特殊匹配場景4多對多匹配場景5一對一匹配場景6 一對多匹配 場景1分組后失敗的成功數據帶入 現有一批交易表的數據&#xff0c;根據戶名&#xff0c;日期&#xff0c;金額分組&#xff0c;存在TRA…

QML FontDialog:使用FontDialog實現字體選擇功能

目錄 引言相關閱讀FontDialog基本介紹字體屬性 實例演示項目結構代碼實現Main.qmlmain.cpp 代碼解析運行效果 總結 引言 在桌面應用程序開發中&#xff0c;字體選擇是一個常見的需求。Qt Quick提供了FontDialog組件來實現這一功能。本文將介紹如何在Qt Quick應用程序中使用Fon…

MCP(3):在CherryStudio中使用MCPServer

上一文章講述了如何新建一個MCP Server&#xff0c;并在MCP Inspector完成測試。本文講述如何在CherryStudio中進行測試。 Cherry Studio 是一款由 CherryHQ 開發的多模型支持的 AI 桌面助手&#xff0c;兼容 Windows、Linux 和 macOS 系統&#xff0c;旨在為用戶提供更便捷、…

面試題-鏈表(2)

1.合并兩個有序鏈表&#xff1a; 21. 合并兩個有序鏈表 - 力扣&#xff08;LeetCode&#xff09; public ListNode mergeTwoLists(ListNode headA, ListNode headB){ListNode newheadnew ListNode(-1);ListNode curnewhead;while(headA!null&&headB!null){if(headA.va…

微軟Entra新安全功能引發大規模賬戶鎖定事件

誤報觸發大規模鎖定 多家機構的Windows管理員報告稱&#xff0c;微軟Entra ID新推出的"MACE"&#xff08;泄露憑證檢測應用&#xff09;功能在部署過程中產生大量誤報&#xff0c;導致用戶賬戶被大規模鎖定。這些警報和鎖定始于昨夜&#xff0c;部分管理員認為屬于誤…

【MATLAB第117期】#源碼分享 | 基于MATLAB的SSM狀態空間模型多元時間序列預測方法(多輸入單輸出)

【MATLAB第117期】#源碼分享 | 基于MATLAB的SSM狀態空間模型多元時間序列預測方法&#xff08;多輸入單輸出&#xff09; 引言 本文使用狀態空間模型實現失業率遞歸預測&#xff0c;狀態空間模型&#xff08;State Space Model, SSM&#xff09;是一種用于描述動態系統行為的…

谷歌瀏覽器搜索后的頁面總是覆蓋當前頁面

最近將搜索引擎換為谷歌后&#xff0c;發現&#xff0c;每次搜索完的結果頁面總是覆蓋當前頁面&#xff0c;非常不方便&#xff0c;在瀏覽器設置中又找不到類似設置的選項&#xff0c;然后終于在一個博主“如何設置使谷歌瀏覽器打開鏈接自動跳轉到新標簽頁而不是覆蓋當前頁面?…

記錄學習的第三十天

今天終于又開始寫博客了。 還是滑動窗口問題&#xff0c;這段時間不出意外都是這了 上面的思路是我自己做的&#xff0c;但是不知道為什么不行&#xff0c;有沒有大佬能指點一下我。 接下來這道題是進階的。不過我之前的基礎都做的很艱難&#xff0c;道阻且長啊。

QTextDocument 入門

一、QTextDocument QTextDocument 是 Qt 中用于處理富文本文檔的核心類&#xff0c;支持文本格式、圖片、表格等復雜內容。 1. QTextDocument 入門 1.1 基本概念 QTextDocument 是 Qt 中用于處理富文本內容的核心類&#xff0c;它提供了&#xff1a; 結構化文本存儲&#x…

WebRTC服務器Coturn服務器相關測試工具

1、概述 在安裝開源的webrtc服務器coturn服務器后&#xff0c;會附帶安裝coturn的相關工具&#xff0c;主要有以下幾種工具 2、turnadmin工具 說明&#xff1a;服務器命令行工具&#xff0c;提供添加用戶、添加管理員、生成TURN密鑰等功能&#xff0c;turnadmin -h查看詳細用…

如何創建Vue3工程

1.首先下載環境 &#xff08;默認下好了VS code&#xff09; Node.js: Node.js 中文網 — 下載 Node.js 選擇要下載的版本 檢查環境&#xff1a; 在命令行中輸入 node ,檢查版本號 2.創建工程 1.找到自己要創建工程的文件目錄&#xff0c;右鍵打開打開終端 在終端輸入創…

基于大模型的肛裂手術全流程預測與治療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目標與創新點 1.3 研究方法與技術路線 二、肛裂概述與大模型技術原理 2.1 肛裂的醫學定義與分類 2.2 肛裂的發病機制與臨床癥狀 2.3 大模型技術簡介 三、大模型在肛裂術前預測的應用 3.1 術前風險因素分析與數據收集 3.2 …