保姆級 STM32 HAL 庫外部中斷教學

1. 外部中斷概述

為什么用外部中斷?
當按鍵按下時,CPU 無需輪詢檢測引腳狀態,而是通過中斷機制立即響應,提高效率,適用于實時性要求高的場景。

關鍵概念

  • EXTI (External Interrupt/Event Controller):STM32 的外設,負責管理外部中斷/事件。
  • NVIC (Nested Vectored Interrupt Controller):管理中斷優先級和使能。
  • GPIO 與 EXTI 的映射:每個 GPIO 引腳對應特定的 EXTI 線(如 PA0、PB0 共用 EXTI0)。
2. 準備工作
  • 硬件:STM32 開發板(如 STM32F103C8T6)、按鍵電路(接 GPIO 引腳,如 PA0,按下時拉低/拉高)。
  • 軟件:STM32CubeMX、Keil MDK 或 IDE。
  • 按鍵消抖:硬件消抖(電容電阻)或軟件消抖(延時檢測)。
3. STM32CubeMX 配置

步驟 1:創建工程

  1. 打開 CubeMX → 新建工程 → 選擇你的 STM32 型號。

步驟 2:配置 GPIO 為外部中斷模式

  1. 找到按鍵連接的 GPIO 引腳(如 PA0)。
  2. 設置 GPIO Mode 為 External Interrupt Mode with Rising/Falling edge trigger(根據按鍵電路選擇觸發邊沿,如下降沿觸發 Falling Edge)。

步驟 3:配置 NVIC

  1. 在 NVIC 標簽頁中,使能對應的 EXTI 中斷(如 EXTI line0 interrupt)。
  2. 設置優先級(默認優先級即可,復雜項目需調整)。

步驟 4:生成代碼

  1. Project → Generate Code → 選擇 IDE 生成代碼。
4. 代碼編寫

關鍵函數解析

  • 中斷服務函數EXTI0_IRQHandler()(自動生成,無需修改,調用 HAL 庫處理函數)。
  • 回調函數HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),用戶在此編寫中斷邏輯。

示例代碼

// 在 main.c 中重寫回調函數
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if (GPIO_Pin == KEY_PIN) {  // KEY_PIN 需替換為你的引腳(如 GPIO_PIN_0)// 簡單消抖:延時檢測電平是否穩定HAL_Delay(10);  // 注意:中斷內慎用延時,實際項目建議用標記位+主循環處理if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_PIN) == GPIO_PIN_RESET) {// 執行按鍵操作,如翻轉 LEDHAL_GPIO_TogglePin(LED_GPIO_Port, LED_PIN);}}
}

優化建議

  • 避免在中斷內使用延時:改用全局變量標記按鍵狀態,在主循環中處理。
    volatile uint8_t key_pressed = 0;  // 中斷內修改,主循環檢測void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if (GPIO_Pin == KEY_PIN) {key_pressed = 1;  // 標記按鍵按下}
    }// 主循環中處理
    while (1) {if (key_pressed) {HAL_Delay(50);  // 消抖if (HAL_GPIO_ReadPin(...)) {// 執行操作}key_pressed = 0;}
    }
    
5. 關鍵注意事項
  1. GPIO 與 EXTI 線映射:PA0、PB0 等共用 EXTI0,同一時間只能有一個 GPIO 使用 EXTI0。
  2. 中斷優先級:若系統中有多個中斷,需合理配置 NVIC 優先級。
  3. 消抖處理:機械按鍵需消抖,防止誤觸發。
  4. 中斷函數簡潔性:避免在中斷內執行耗時操作(如 printf)。
6. 測試與驗證
  • 現象:按下按鍵時,LED 狀態翻轉。
  • 調試技巧
    • 在回調函數內設置斷點,觀察是否觸發。
    • 使用邏輯分析儀或示波器監測引腳電平變化。
7. 常見問題
  • 中斷不觸發
    • 檢查 GPIO 配置模式和觸發邊沿。
    • 確認 NVIC 中中斷已使能。
    • 檢查硬件連接(按鍵是否接觸良好)。
  • 按鍵多次觸發:未消抖或觸發邊沿設置錯誤。

總結

通過外部中斷實現按鍵檢測,能顯著提升系統實時性。掌握 CubeMX 配置和 HAL 庫回調機制后,可擴展至其他外部事件(如傳感器信號、通信事件)。進階學習可探索中斷嵌套、事件模式等。

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

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

相關文章

Postman高級功能深度解析:Mock Server與自動化監控——構建高效API測試與監控體系

引言:Postman在API開發中的核心價值 在數字化時代,API(應用程序編程接口)已成為系統間交互的“神經網絡”,其質量直接影響用戶體驗與業務連續性。然而,傳統API測試面臨兩大挑戰: 開發階段依賴…

【程序人生】成功人生架構圖(分層模型)

文章目錄 ?前言?一、根基層——價值觀與使命?二、支柱層——健康與能量?三、驅動層——學習與進化?四、網絡層——關系系統?五、目標層——成就與財富?六、頂層——意義與傳承?外層:調節環——平衡與抗風險?思維導圖 標題詳情作者JosieBook頭銜CSDN博客專家…

【最后203篇系列】020 rocksdb agent

今天還是挺開心的一天,又在工具箱里加了一個工具。嗯,但是快下班的時候也碰到一些不太順心的事,讓我有點惱火。我還真沒想到一個專職的前端,加測試,以及其他一堆人,竟然不知道后端返回的markdown,在前端渲染…

10-- 網絡攻擊防御原理全景解析 | 從單包攻防到DDoS軍團作戰(包你看一遍全記住)

🛡? 網絡攻擊防御原理全景解析 | 從單包攻防到DDoS軍團作戰 如果你也對網絡工程師的內容感興趣的話,歡迎看我的最新文章9–BGP路由黑洞(超萬字大解析):網絡世界的“百慕大三角“逃生指南(BGP路由配置實驗含路由黑洞,…

解鎖Python print()函數高級用法

print() 是 Python 中最常用的函數之一,用于將內容輸出到控制臺。雖然它的基本用法非常簡單,但 print() 函數還支持許多高級功能,如格式化輸出、重定向輸出、控制分隔符和結束符等。 1. print() 函數的基本用法 1.1 語法 print() 函數的基本語法如下: print(*objects, …

鬼泣:動作系統3

文章目錄 self-Tag:可以直接在游戲運行時通過標簽區分不同Actorsolid隔離:模塊化低耦合:將功能拆分成多個模塊,修改單一模塊時無需修改其他模塊 動作優先級:當前動作能否打斷上一動作函數不能使用timelineset timer by…

Polymer入門指南:從零開始構建、組織、管理Web Component

前言 Web Component是一種強大的技術,它允許開發者創建可重用的自定義元素,其功能和樣式都與原生HTML元素類似。Polymer是一個用于創建Web Component的庫,簡化了開發過程。今天我們將一起來了解如何基于Polymer開發Web Component。 什么是P…

廣度優先搜索(BFS) vs 深度優先搜索(DFS):算法對比與 C++ 實現

目錄 一、BFS 和 DFS 的核心思想 1. BFS(廣度優先搜索) 2. DFS(深度優先搜索) 二、BFS 和 DFS 的對比 三、C 代碼實現 1. BFS 實現(鄰接表表示的無向圖) 2. DFS 實現(遞歸與迭代兩種方式&…

vulhub靶機----基于docker的初探索,環境搭建

環境搭建 首先就是搭建docker環境,這里暫且寫一下 #在kali apt update apt install docker.io配置docker源,位置在/etc/docker/daemon.json {"registry-mirrors": ["https://5tqw56kt.mirror.aliyuncs.com","https://docker…

第7章 類與面向對象

6-1 二維平面上的點操作(Python3) 題目描述 設計一個表示二維平面上點的類 Point。該類應該包含以下功能: 兩個私有屬性 _x 和 _y,分別表示點的橫坐標和縱坐標。 一個構造函數 __init__,用于初始化點的坐標。 一個…

算法訓練篇06--力扣611.有效三角形的個數

目錄 1.題目鏈接:611.有效三角形的個數 2.題目描述: 3.解法一:(暴力解法)(會超時): 4.解法二(排序雙指針) 1.題目鏈接:611.有效三角形的個數 2.題目描述: 給定一個包含非負整數的數組 nums &#xf…

網絡編程之解除udp判斷客戶端是否斷開

思路&#xff1a;每幾秒發送一條不顯示的信息&#xff0c;客戶端斷開則不再發送信息&#xff0c;超時則表示客戶端斷開連接。&#xff08;心跳包&#xff09; 服務器 #include <head.h>#define MAX_CLIENTS 100 // 最大支持100個客戶端 #define TIMEOUT 5 // 5秒…

Python Cookbook-4.8 二維陣列變換

任務 需要變換一個列表的列表&#xff0c;將行換成列&#xff0c;列換成行。 解決方案 需要一個列表&#xff0c;其中的每一項都是同樣長度的列表&#xff0c;像這樣 arr [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]列表推導提供了簡單方便的方法以完成二維陣列的轉換: print …

B樹與B+樹在MySQL中的應用:索引

數據結構演示網站&#xff1a;Data Structure Visualization 先來了解兩個數據結構B樹與B樹 B樹&#xff1a; N階B樹每個節點最多存儲N-1個Key&#xff0c;N個指針 例如&#xff1a;一個5階B樹&#xff0c;當前節點存儲到5個Key時&#xff0c;中間的數會向上分離&#xff0c;…

【重構小程序】基于Tika和Langchain4J進行文件解析和文本切片(二)

為了將大語言模型植入到小程序中&#xff0c;來支持用戶的問答。那我們首先需要做的是什么呢&#xff0c;不是引入大語言模型&#xff0c;而且為大語言模型搭建一個私有化知識庫&#xff0c;但是這是這節呢&#xff0c;我們先不搭建私有化知識庫&#xff0c;在這之前&#xff0…

python|exm6-1try-except結構|raise關鍵字|異常類型

目錄 一、try-expect 1. 多個try-expect結構的使用 1.1 捕捉特定異常 1.2 捕捉全部異常 1.3 所有異常合并處理 2. try-except-else-finally 結構 二、raise 關鍵字 一、try-expect try-expect 結構是 Python 中用于異常處理的關鍵機制。它允許你捕獲并處理代碼中可能發生…

小藍的括號串1(棧,藍橋云課)

問題描述 小藍有一個長度為 nn 的括號串&#xff0c;括號串僅由字符 ( 、 ) 構成&#xff0c;請你幫他判斷一下該括號串是否合法&#xff0c;合法請輸出 Yes &#xff0c;反之輸出 No 。 合法括號序列&#xff1a; 空串是合法括號序列。 若 ss 是合法括號序列&#xff0c;則 (…

Centos7配置本地yum源

Centos7配置本地yum源 1、基于iso鏡像的centos源 1.1 準備iso <span style"color:#000000"><span style"background-color:#ffffff"><code class"language-bash"><span style"color:#008000"># 首先看自己使用…

VNA操作使用學習-14 再測晶振特性

再測一下4Mhz晶振&#xff0c;看看特性曲線&#xff0c;熟悉一下vna使用。 s11模式&#xff0c;找遍了各種format都無法顯示&#xff0c;只有這一種&#xff08;s11&#xff0c;Resistance&#xff09;稍微顯示出一個諧振&#xff0c;但是只有一個點。 s21模式 這是201p&#…

Tr0ll2靶機詳解

一、主機發現 arp-scan -l靶機ip&#xff1a;192.168.55.164 二、端口掃描、漏洞掃描、目錄枚舉、指紋識別 2.1端口掃描 nmap --min-rate 10000 -p- 192.168.55.164發現21端口的ftp服務開啟 以UDP協議進行掃描 使用參數-sU進行UDP掃描 nmap -sU --min-rate 10000 -p- 19…