【STM32】外部中斷

STM32 外部中斷(EXTI)概述

這篇文章結合示例代碼,系統性地講述 STM32 外部中斷(EXTI)實驗的原理、以及配置流程。目的在于輔助讀者掌握STM32F1 外部中斷機制。

STM32F1xx官方資料:《STM32中文參考手冊V10》-第9章 中斷和事件

STM32的每個IO都可以作為外部中斷輸入。
STM32的中斷控制器支持19個外部中斷/事件請求:
線0~15:對應外部IO口的輸入中斷。
線16:連接到PVD輸出。
線17:連接到RTC鬧鐘事件。
線18:連接到USB喚醒事件。每個外部中斷線可以獨立的配置觸發方式(上升沿,下降沿或者雙邊沿觸發),觸發/屏蔽,專用的狀態位。從上面可以看出,STM32供IO使用的中斷線只有16個,但是STM32F10x系列的IO口多達上百個,STM32F103ZET6(112),
STM32F103RCT6(51),那么中斷線怎么跟io口對應呢?

在這里插入圖片描述
如圖所示,

GPIOx.0映射到EXTI0
GPIOx.1映射到EXTI1
…
GPIOx.15映射到EXTI15圖20:AFIO_EXTICR 映射機制圖:
每個 EXTI 線可通過 AFIO 寄存器選擇映射到 GPIOA~GPIOG 的某一個引腳。
例如:EXTI3 可以綁定 PE3、PC3、PB3 等,只能綁定一個。
特性說明
可用中斷線EXTI0 ~ EXTI15(共16條 IO 線)
+ EXTI16(PVD)、EXTI17(RTC)、EXTI18(USB)
可觸發方式上升沿、下降沿、雙邊沿
可配置功能中斷 / 事件
IO與EXTI映射通過 AFIO_EXTICR 寄存器設置
中斷向量數量僅有 7 個中斷服務函數(EXTI0~4,EXTI9_5,EXTI15_10)
中斷線與中斷函數映射關系

對于每個中斷線,我們可以設置相應的觸發方式(上升沿觸發,下降沿觸發,邊沿觸發)以及使能。

那么,是不是16個中斷線就可以分配16個中斷服務函數呢?

IO口外部中斷在中斷向量表中只分配了7個中斷向量,也就是只能使用7個中斷服務函數。
在這里插入圖片描述
從表中可以看出,外部中斷線5~9分配一個中斷向量,共用一個服務函數,
外部中斷線10~15分配一個中斷向量,共用一個中斷服務函數。

中斷線中斷服務函數是否共享中斷
EXTI0EXTI0_IRQHandler
EXTI1EXTI1_IRQHandler
EXTI2EXTI2_IRQHandler
EXTI3EXTI3_IRQHandler
EXTI4EXTI4_IRQHandler
EXTI5~9EXTI9_5_IRQHandler是,需區分
EXTI10~15EXTI15_10_IRQHandler是,需區分

另外,補充一個知識點,線16、線17、線18 是 STM32 外部中斷控制器(EXTI)中,與特定內部外設連接的特殊中斷線。 它們不再對應 GPIO 引腳,而是與 STM32 內部某些模塊直接相關。

EXTI 特殊中斷線(EXTI16 ~ EXTI18)

EXTI16 — PVD(電源電壓監測器)
EXTI17 — RTC Alarm(實時時鐘鬧鐘)
EXTI18 — USB Wakeup(USB 喚醒)

中斷線編號來源模塊名稱/用途中斷觸發條件常用用途
EXTI16PVD(電源監測)電壓檢測中斷電壓低于/高于設定閾值電源掉電、低電壓預警
EXTI17RTC(實時時鐘)RTC鬧鐘中斷RTC 到達設定鬧鐘時間定時喚醒、定時事件處理
EXTI18USB(喚醒模塊)USB 喚醒中斷USB 活動信號喚醒 MCUUSB 喚醒低功耗模式

外部中斷庫函數設置

中斷服務函數列表:

EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler

EXTI_Init函數
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
typedef struct
{uint32_t EXTI_Line;   //指定要配置的中斷線           EXTIMode_TypeDef EXTI_Mode;   //模式:事件 OR中斷EXTITrigger_TypeDef EXTI_Trigger;//觸發方式:上升沿/下降沿/雙沿觸發FunctionalState EXTI_LineCmd;  //使能 OR失能
}EXTI_InitTypeDef;EXTI_InitStructure.EXTI_Line=EXTI_Line2;	 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);	 	

EXTI 外部中斷配置步驟(官方流程)

外部中斷的一般配置步驟:

① 初始化IO口為輸入。
GPIO_Init();
② 開啟IO口復用時鐘。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
③ 設置IO口與中斷線的映射關系。
void GPIO_EXTILineConfig();
④ 初始化線上中斷,設置觸發條件等。
EXTI_Init();
⑤ 配置中斷分組(NVIC),并使能中斷。
NVIC_Init();
⑥ 編寫中斷服務函數。
EXTIx_IRQHandler();
⑦ 清除中斷標志位
EXTI_ClearITPendingBit();

EXTI線通過 AFIO_EXTICR1~4 映射 GPIO 引腳

  • EXTI0 可映射 PA0 ~ PG0
  • EXTI15 可映射 PA15 ~ PG15

在這里插入圖片描述
在這里插入圖片描述

中斷向量表圖說明:僅為 EXTI0~4、EXTI9_5、EXTI15_10 提供中斷服務函數。多線共享的服務函數需在函數內判斷是哪條線路觸發。
🌟 配置步驟詳解(以 KEY1 按鍵連接 PE3 → EXTI3 為例):

① 配置 GPIO 為輸入模式

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // 使能GPIOE時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;             // PE3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         // 上拉輸入
GPIO_Init(GPIOE, &GPIO_InitStructure);

② 使能 AFIO(復用功能模塊)時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

③ 配置 EXTI 線映射(將 PE3 映射到 EXTI3)

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);

④ 配置 EXTI 中斷線

EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line3;                  // EXTI3
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         // 中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     // 下降沿觸發
EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   // 使能
EXTI_Init(&EXTI_InitStructure);

⑤ 配置 NVIC 中斷優先級并使能中斷

NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   // 搶占優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          // 響應優先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             // 使能
NVIC_Init(&NVIC_InitStructure);

⑥ 編寫中斷服務函數 EXTI3_IRQHandler

void EXTI3_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line3) != RESET){// 中斷處理邏輯,比如點亮 LEDLED1_TOGGLE();  // 示例函數,用戶自定義EXTI_ClearITPendingBit(EXTI_Line3); // 清除中斷標志位}
}

按鍵的硬件連接

戰艦:
在這里插入圖片描述
精英:
在這里插入圖片描述
mini:
在這里插入圖片描述
原理圖說明(KEY0 ~ KEY2 與 PA0、PE3、PE4)(對照圖解說明)

按鍵名稱接口引腳對應 EXTI 線中斷函數
KEY0PE4EXTI4EXTI4_IRQHandler
KEY1PE3EXTI3EXTI3_IRQHandler
KEY2PE2EXTI2EXTI2_IRQHandler
WK_UPPA0EXTI0EXTI0_IRQHandler
多個引腳使用同一個中斷線時的處理(共享中斷)

如圖所示:
EXTI9_5_IRQHandler 處理 EXTI5EXTI9
EXTI15_10_IRQHandler 處理 EXTI10EXTI15

處理多個中斷線:

void EXTI9_5_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line7) != RESET){// 處理 EXTI7 對應按鍵EXTI_ClearITPendingBit(EXTI_Line7);}if (EXTI_GetITStatus(EXTI_Line6) != RESET){// 處理 EXTI6 對應按鍵EXTI_ClearITPendingBit(EXTI_Line6);}
}

完整按鍵中斷實驗總結

📋 總體代碼結構:

void KEY_Interrupt_Init(void)
{// 1. 初始化 GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOE, &GPIO_InitStructure);// 2. 映射 EXTI 線GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);// 3. 配置 EXTIEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line3;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 4. 配置 NVICNVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

綜上。

步驟
1?? 配置 GPIO 為輸入模式(上拉/下拉)
2?? 使能 AFIO 時鐘
3?? 使用 GPIO_EXTILineConfig() 設置 EXTI 映射
4?? 使用 EXTI_Init() 配置中斷線觸發方式
5?? 使用 NVIC_Init() 設置中斷優先級與使能
6?? 編寫 EXTIx_IRQHandler() 并清除中斷標志位

以上,歡迎有從事同行業的電子信息工程、互聯網通信、嵌入式開發的朋友共同探討與提問,我可以提供實戰演示或模板庫。希望內容能夠對你產生幫助!

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

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

相關文章

LeetCode Hot100 算法題 (矩陣篇)

1、73. 矩陣置零 給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1: 輸入:matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出:[[1,0,1],[0,0,0],[1,0,1]]// 將第一行…

Flutter基礎(項目創建)

一、使用命令行創建項目 1. 確認 Flutter 環境正常 要保證 Flutter SDK 已經正確安裝,并且環境變量配置無誤。可以通過執行以下命令來驗證: flutter doctor 要保證所有檢查項都顯示綠色對勾,要是有問題,可按照提示進行修復。 …

【Actix Web】Rust Web開發實戰:Actix Web框架全面指南(2025企業級應用版)

? 在2025年高并發、低延遲成為Web服務核心指標的背景下,??Actix Web憑借異步Actor模型與零成本抽象??,成為Rust生態中生產環境部署率最高的Web框架。本指南深入解析Actix Web 4.0核心技術,覆蓋??百萬級并發架構設計??、??內存安全…

HTML之常用基礎標簽

HTML之常用基礎標簽 一、HTML文檔基本結構標簽1. <html>標簽2. <head>標簽3. <body>標簽 二、文本相關基礎標簽1. 標題標簽&#xff08;<h1> - <h6>&#xff09;2. 段落標簽&#xff08;<p>&#xff09;3. 換行標簽&#xff08;<br>…

外鍵列索引優化:加速JOIN查詢的關鍵

在使用數據庫時&#xff0c;特別是在執行涉及JOIN操作的查詢時&#xff0c;優化外鍵列的索引是非常重要的。外鍵通常用于建立表之間的關聯&#xff0c;而JOIN操作則是基于這些外鍵列來實現的。下面是一些關鍵步驟和技巧&#xff0c;可以幫助你優化外鍵列的索引&#xff0c;從而…

2025年 UI 自動化框架使用排行

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </

【軟考高項論文】論信息系統項目的整體管理

摘要 在信息系統項目的管理中&#xff0c;整體管理處于核心地位&#xff0c;對項目全局規劃與協調起著關鍵作用&#xff0c;保障項目各階段目標一致且高效執行。本文結合作者參與的 2024 年 6 月啟動的信息系統項目&#xff0c;深入探討項目整體管理的過程&#xff0c;著重闡述…

(4)Wireshark捕獲設置

1.簡介 WireShark的強大之處就在于不用你再做任何配置就可以抓取http或者https的包。主要是講解和分享如何使用WireShark抓包。 2.運行Wireshark 安裝好 Wireshark 以后&#xff0c;就可以運行它來捕獲數據包了。方法如下&#xff1a; 1.在 Windows 的“開始”菜單中&#…

智慧校園電子班牌系統源碼的開發與應用,基于Java/SpringBoot后端、Vue2前端、MySQL5.7數據庫

智慧校園系統源碼&#xff0c;智慧班牌源碼&#xff0c;java語言 技術棧&#xff1a; ?后端開發?&#xff1a;采用Java語言和Spring Boot框架進行開發。Java是一種廣泛使用的、面向對象的編程語言&#xff0c;而Spring Boot是基于Spring框架的快速應用開發框架&#xff0c;能…

工程優化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信對比

WebSocket、WSS&#xff08;WebSocket Secure&#xff09;和SSE&#xff08;Server-Sent Events&#xff09;是三種常見的實時通信技術&#xff0c;它們的核心區別在于通信方向、協議實現、數據格式和適用場景。以下是分維度的詳細解釋&#xff0c;并附帶Python示例和應用場景選…

【TiDB 社區智慧合集】 TiDB x 運營商|掌上營業廳、賬務、物聯網等多核心業務場景的實戰應用案例

作者&#xff1a; Billmay表妹 原文來源&#xff1a; https://tidb.net/blog/bb1467af 在信息基礎設施國產化戰略加速落地的背景下&#xff0c;電信及廣電領域正迎來數據庫國產化替代的關鍵轉型期。TiDB 憑借自身技術創新優勢&#xff0c;深度攜手各大運營商&#xff0c;以全…

Java 17 下 Spring Boot 與 Pulsar 隊列集成實戰:生產者與消費者實現指南

Pulsar隊列與Springboot集成有2種模式&#xff1a;官方pulsar-client 或社區Starter&#xff08;如pulsar-spring-boot-starter&#xff09; 如果考慮最新、最快、最齊全的功能&#xff0c;使用官方pulsar-client如果考慮快速低成本接入&#xff0c;使用社區Starter&#xff0…

《Go語言高級編程》RPC 入門

《Go語言高級編程》RPC 入門 一、什么是 RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;遠程過程調用&#xff09;是分布式系統中不同節點間的通信方式&#xff0c;允許程序像調用本地函數一樣調用遠程服務的方法。 Go 語言的標準庫 net/rpc 提供了基礎的…

第N5周:Pytorch文本分類入門

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 一、前期準備 1.加載數據 import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

uniappx 安卓app項目本地打包運行,騰訊地圖報錯:‘鑒權失敗,請檢查你的key‘

根目錄下添加 AndroidManifest.xml 文件&#xff0c; <application><meta-data android:name"TencentMapSDK" android:value"騰訊地圖申請的key" /> </application> manifest.json 文件中添加&#xff1a; "app": {"…

【向上教育】結構化面試開口秘籍.pdf

向 上 教 育 XI A N G S H A N G E D U C A T I O N 結構化 面試 開口秘笈 目 錄 第一章 自我認知類 ........................................................................................................................... 2 第二章 工作關系處理類 .......…

Webpack 熱更新(HMR)原理詳解

&#x1f525; Webpack 熱更新&#xff08;HMR&#xff09;原理詳解 &#x1f4cc; 本文適用于 Vue、React 等使用 Webpack 的項目開發者&#xff0c;適配 Vue CLI / 自定義 Webpack 項目。 &#x1f3af; 一、什么是 HMR&#xff1f; Hot Module Replacement 是 Webpack 提供的…

MySQL索引完全指南

一、索引是什么&#xff1f;為什么這么重要&#xff1f; 索引就像字典的目錄 想象一下&#xff0c;你要在一本1000頁的字典里找"程序員"這個詞&#xff0c;你會怎么做&#xff1f; 沒有目錄&#xff1a;從第1頁開始一頁一頁翻&#xff0c;可能要翻500頁才能找到有…

學習使用dotnet-dump工具分析.net內存轉儲文件(2)

運行ShenNiusModularity項目&#xff0c;使用createdump工具dump完整的進程內存映射文件&#xff0c;然后運行dotnet-dump analyze命令加載dump文件。 ??可以先使用dumpheap命令顯示有關垃圾回收堆的信息和有關對象的收集統計信息。dumpheap支持多類參數&#xff08;如下所示…

Oracle BIEE 交互示例(一)同一分析內

Oracle BIEE 交互示例(一)同一分析內 1 示例背景2 實踐目標3 實操步驟3.1 創建數據集3.1.1 TEST_TABLE3.1.2 保存名字為【01 TEST_TABLE】3.2 創建分析3.2.1 創建列3.2.2 創建視圖3.2.2.1 數據透視表3.2.2.2 圖形3.2.2.3 表3.3 設置交互4 結果示例1 示例背景 版本:OBIEE 12…