STM32F1 EXTI介紹及應用

第三章 EXTI介紹及應用

1. EXTI介紹

EXTI(External interrupt/event controller)—外部中斷/事件控制器,管理了控制器的 20 個中斷/事件線。每個中斷/事件線都對應有一個邊沿檢測器,可以實現輸入信號的上升沿檢測和下降沿的檢測。 EXTI 可以實現對每個中斷/事件線進行單獨配置,可以單獨配置為中斷或者事件,以及觸發事件的屬性。

在這里插入圖片描述

EXTI 有 20 個中斷/事件線,每個 GPIO 都可以被設置為輸入線,占用 EXTI0 至 EXTI15,還有另外七根用于特定的外設事件

在這里插入圖片描述

EXTI0 至 EXTI15 用于 GPIO,通過編程控制可以實現任意一個 GPIO 作為 EXTI 的輸入源。

2. EXTI初始化結構體介紹

標準庫函數對每個外設都建立了一個初始化結構體,比如 EXTI_InitTypeDef,結構體成員用于設置外設工作參數,并由外設初始化配置函數,比如 EXTI_Init() 調用,這些設定參數將會設置外設相應的寄存器,達到配置外設工作環境的目的。

初始化結構體和初始化庫函數配合使用是標準庫精髓所在,理解了初始化結構體每個成員意義基本上就可以對該外設運用自如了。初始化結構體定義在 stm32f10x_exti.h 文件中,初始化庫函數定義在 stm32f10x_exti.c 文件中,編程時我們可以結合這兩個文件內注釋使用。

typedef struct {uint32_t EXTI_Line; // 中斷/事件線EXTIMode_TypeDef EXTI_Mode; // EXTI 模式EXTITrigger_TypeDef EXTI_Trigger; // 觸發類型FunctionalState EXTI_LineCmd; // EXTI 使能
} EXTI_InitTypeDef;
  1. EXTI_Line: EXTI 中斷/事件線選擇,可選 EXTI0 至 EXTI19

  2. EXTI_Mode: EXTI 模式選擇,可選為產生中斷 (EXTI_Mode_Interrupt) 或者產生事件(EXTI_Mode_Event)。

  3. EXTI_Trigger: EXTI 邊沿觸發事件,可選上升沿觸發 (EXTI_Trigger_Rising)、下降沿觸發 (EXTI_Trigger_Falling) 或者上升沿和下降沿都觸發 ( EXTI_Trigger_Rising_Falling)。

  4. EXTI_LineCmd:控制是否使能 EXTI 線,可選使能 EXTI 線 (ENABLE) 或禁用 (DISABLE)。

3. EXTI應用示例

輕觸按鍵在按下時會使得引腳接通,通過電路設計可以使得按下時產生電平變化

在這里插入圖片描述

3.1 KEY和EXTI相關參數宏定義

#ifndef __KEY_H__
#define __KEY_H__#include "stm32f10x.h"/* KEY GPIO */
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA // KEY1 PA0
#define KEY1_GPIO_Port GPIOA
#define KEY1_GPIO_Pin GPIO_Pin_0
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC // KEY2 PC13
#define KEY2_GPIO_Port GPIOC
#define KEY2_GPIO_Pin GPIO_Pin_13/* KEY EXTI */
#define KEY1_EXTI_CLK (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)
#define KEY1_EXTI_Port GPIO_PortSourceGPIOA // 外部中斷端口
#define KEY1_EXTI_Pin GPIO_PinSource0 // 外部中斷引腳
#define KEY1_EXTI_Line EXTI_Line0 // 外部中斷線
#define KEY1_EXTI_IRQ EXTI0_IRQn // 外部中斷中斷號
#define KEY1_IRQHandler EXTI0_IRQHandler // 外部中斷服務函數#define KEY2_EXTI_CLK (RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO)
#define KEY2_EXTI_Port GPIO_PortSourceGPIOC
#define KEY2_EXTI_Pin GPIO_PinSource13
#define KEY2_EXTI_Line EXTI_Line13
#define KEY2_EXTI_IRQ EXTI15_10_IRQn
#define KEY2_IRQHandler EXTI15_10_IRQHandler#define KEY_OFF 0
#define KEY_ON 1void NVIC_Configuration(void);
void KEY_EXTI_Init(void);#endif /* __KEY_H__ */

3.2 NVIC配置

void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 配置中斷優先級組NVIC_InitStructure.NVIC_IRQChannel = KEY1_EXTI_IRQ; // 配置中斷源NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 配置中斷優先級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 配置中斷子優先級NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中斷NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = KEY2_EXTI_IRQ;NVIC_Init(&NVIC_InitStructure);
}

3.3 KEY GPIO配置及EXTI

void KEY_EXTI_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(KEY1_EXTI_CLK|KEY2_EXTI_CLK, ENABLE);NVIC_Configuration();/* GPIO 配置 */GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_Pin;GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStructure);/* EXTI 配置 */GPIO_EXTILineConfig(KEY1_EXTI_Port, KEY1_EXTI_Pin); // 配置中斷引腳EXTI_InitStructure.EXTI_Line = KEY1_EXTI_Line; // 配置中斷線EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 配置中斷模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿觸發EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中斷線EXTI_Init(&EXTI_InitStructure);GPIO_EXTILineConfig(KEY2_EXTI_Port, KEY2_EXTI_Pin);EXTI_InitStructure.EXTI_Line = KEY2_EXTI_Line;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿觸發EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}

3.4 中斷服務函數

void KEY1_IRQHandler(void)
{if(EXTI_GetITStatus(KEY1_EXTI_Line) != RESET){LED_TOGGLE(RED_LED_Pin);EXTI_ClearITPendingBit(KEY1_EXTI_Line); // 清中斷標志位}
}void KEY2_IRQHandler(void)
{if(EXTI_GetITStatus(KEY2_EXTI_Line) != RESET){LED_TOGGLE(BLUE_LED_Pin);EXTI_ClearITPendingBit(KEY2_EXTI_Line); // 清中斷標志位}
}

3.5 主函數測試

#include "stm32f10x.h"
#include "led.h"
#include "key.h"int main()
{BSP_LED_Init();KEY_EXTI_Init();while(1);
}

4. EXTI常見函數

4.1 基本配置步驟

  • 使能時鐘
// 使能AFIO時鐘(EXTI配置需要)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  • 配置GPIO為輸入模式
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;         // 以PA0為例
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;     // 上拉輸入模式
GPIO_Init(GPIOA, &GPIO_InitStruct);
  • 映射GPIO到EXTI線
// 將PA0映射到EXTI0線
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
  • 配置EXTI線
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line0;        // 選擇EXTI0線
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 中斷模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿觸發
EXTI_InitStruct.EXTI_LineCmd = ENABLE;         // 使能該線
EXTI_Init(&EXTI_InitStruct);
  • 配置NVIC(嵌套向量中斷控制器)
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;  // EXTI0中斷通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x0F; // 搶占優先級
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0F;      // 子優先級
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;   // 使能通道
NVIC_Init(&NVIC_InitStruct);

4.2 關鍵EXTI操作函數

  • 初始化與配置
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
  • 參數結構體
typedef struct {uint32_t EXTI_Line;    // 選擇EXTI線 (EXTI_Line0~EXTI_Line15)EXTIMode_TypeDef EXTI_Mode;       // 模式: EXTI_Mode_Interrupt 或 EXTI_Mode_EventEXTITrigger_TypeDef EXTI_Trigger; // 觸發: EXTI_Trigger_Rising/Falling/BothFunctionalState EXTI_LineCmd;     // 使能狀態: ENABLE/DISABLE
} EXTI_InitTypeDef;
  • GPIO引腳映射到EXTI線
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
  • 中斷狀態管理
// 檢查中斷標志:
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
// 清除中斷掛起位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
  • 軟件觸發中斷
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

4.3 中斷服務函數

  • 單個引腳中斷(EXTI0~EXTI14)
// PA0~PA4等引腳的中斷服務函數
void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {// 處理中斷EXTI_ClearITPendingBit(EXTI_Line0); // 清除標志位}
}
  • 多引腳共用中斷
// EXTI5~9共用中斷服務函數
void EXTI9_5_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line5) != RESET) {// 處理EXTI5中斷EXTI_ClearITPendingBit(EXTI_Line5);}if (EXTI_GetITStatus(EXTI_Line6) != RESET) {// 處理EXTI6中斷EXTI_ClearITPendingBit(EXTI_Line6);}// ... 其他線同理
}// EXTI10~15共用中斷服務函數
void EXTI15_10_IRQHandler(void) {// 處理方式同上
}

文中工程下載:https://github.com/hazy1k/STM32F1-Quick-Start-Guide-STD/tree/master/2.code

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

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

相關文章

Oracle SYS用戶無法登錄數據庫-ORA-12162

錯誤詳情 [Oracleorcl bin]$ ./sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Aug 18 08:12:04 2025 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-12162: TNS:net service name is incorrectly specifiedOS登錄解析 注意&…

【計算機視覺與深度學習實戰】06基于光流算法的實時運動檢測系統設計與實現——以蚊子軌跡追蹤為例(有完整代碼)

第一章 引言 計算機視覺作為人工智能領域的重要分支,近年來在目標檢測、運動分析、行為識別等方面取得了顯著進展。其中,運動檢測技術作為視頻分析的基礎技術之一,在安防監控、交通管理、體感交互、生物行為研究等領域發揮著越來越重要的作用。光流算法作為運動檢測的經典方…

國產CANFD芯片技術特性與應用前景綜述:以ASM1042系列為例

摘要本文綜述了國科安芯推出的國產CANFD芯片ASM1042系列的技術特性與應用前景。ASM1042系列作為一款高性能的CANFD收發器,支持5Mbps的高速通信和高達70V的總線耐壓,廣泛應用于汽車電子、工業控制和航空航天等領域。文中詳細分析了其高速率設計、高耐壓設…

偶現型Bug處理方法---用系統方法對抗隨機性

在軟件開發中,Bug是影響產品質量的核心問題,而偶現型Bug(Intermittent Bug)因其“時隱時現、難以復現”的特性,成為最頭疼的挑戰之一。這類Bug不像必現Bug那樣有穩定的觸發路徑,可能在特定環境、特定操作序…

一分鐘docker部署onlyoffice 在線預覽word pdf excel...

目錄 效果 1.執行命令 2.訪問 3.測試 3.1執行下面的命令 3.2測試效果 3.3預覽效果 3.4轉換 效果 1.執行命令 sudo docker run -i -t -d -p 80:80 onlyoffice/documentserver 稍等片刻 2.訪問 瀏覽器打開ip:80即可訪問 3.測試 3.1執行下面的命令 sudo docker exec 7…

ES_數據存儲知識

一、 _source 字段:數據的“真相之源” 1. 是什么? _source 是一個獨立的、特殊的元字段。它存儲了你在索引文檔時提交的原始JSONbody的完整內容。 2. 工作原理與用途 寫入:當你索引一個文檔 {"title": "My Book", "…

day37-Nginx優化

1.每日復盤與今日內容1.1復盤nginx四層轉發rewrite tag:last和breakredirect、permanent🍟🍟🍟🍟🍟Nginx內置參數動靜分離🍟🍟🍟🍟🍟1.2今日內容N…

Zynq開發實踐(fpga高頻使用的兩個場景)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】本身fpga是介于純軟件和asic之間的元器件。如果是純軟件,那我們要做的,就是純上層開發。只要相關驅動已經實現,那…

20250822在Ubuntu24.04.2下指定以太網卡的IP地址

20250822在Ubuntu24.04.2下指定以太網卡的IP地址 2025/8/22 20:28緣起:公司的服務器的IP地址老變!,路由器經常被其他其它部門斷電重啟。 導致IP地址被DHCP服務器給更改了! 直接固定IP地址了。 本來想通過VI命令編輯配置文件來指定…

【yocto】BitBake指令匯總解析

【點關注,不迷路 】BitBake 是一個功能強大且核心的元任務執行器,它是 OpenEmbedded 和 Yocto Project 的構建基石。簡單來說,它就像一個高度專業化的 make 工具,但它能解析復雜的元數據(配方、配置、類)&…

CSS @media 媒體查詢

media 媒體查詢是響應式設計的核心工具,允許根據設備特性(如屏幕寬度、高度、方向等)應用不同的 CSS 樣式。一、基本語法media media-type and (media-feature) {/* 目標樣式規則 */ }媒體類型(可選):all&a…

Vue2.x核心技術與實戰(三)

目錄 四、Vue2.x:組件通信&進階用法 4.1 組件的三大組成部分(結構/樣式/邏輯) 4.1.0 組件的三大組成部分-注意點說明 4.1.1 組件的樣式沖突 scoped 4.1.2 data是一個函數 4.2 組件通信 4.2.1 什么是組件通信 4.2.2 不同的組件關系和組件通信方案分類 4.2.2 父傳子…

泵站遠程監控與自動化控制系統:智慧泵房設備的創新實踐

在智慧水務快速發展的背景下,泵站自動化控制系統與水泵遠程監控技術已成為提升供水效率、保障水質安全、降低運維成本的核心手段。通過物聯網、云計算、邊緣計算等技術的深度融合,智慧泵房設備實現了從“人工值守”到“無人化智能管理”的跨越式升級&…

校園作品互評管理移動端的設計與實現

摘 要 本文概述了一款運用 Spring Boot 框架精心打造的校園作品互評管理移動端的設 計與實現,其設計初衷在于激發校園內的創作活力,并優化學生間的互評流程,進一 步推動教育模式的創新。該系統深度融合了移動互聯網技術,借助小程序…

為什么需要關注Flink并行度?

當你的Flink作業運行時,是否遇到過資源利用率不足或任務堆積的情況?這很可能與并行度設置不當有關。作為流處理領域的"性能放大器",合理配置并行度能帶來:提升吞吐量資源成本降低的黃金比例背壓問題的天然解決方案一、四…

電腦芯片大的32位與64位指的是什么

32 位與 64 位既不單純指數據線根數,也不單純指地址線根數,而是對CPU 核心架構位數的統稱,其核心關聯以下兩個關鍵硬件指標,需結合場景區分:核心關聯:CPU 通用寄存器位數這是 “32 位 / 64 位” 的核心定義…

第1.1節:圖靈測試與AI的誕生

🏆作者簡介,黑夜開發者,CSDN領軍人物,全棧領域優質創作者?,CSDN博客專家,阿里云社區專家博主,2023年6月CSDN上海賽道top4。 🏆數年電商行業從業經驗,歷任核心研發工程師…

分布式搜索(Elasticsearch)基本用法

目錄 初識Elasticsearch 什么是elasticsearch 正向索引和倒排索引 與mysql進行對比 安裝elasticsearch、kibana 安裝分詞器IK IK分詞器的拓展和停用詞典 ik分詞器-拓展詞庫 ik分詞器-停用詞庫 索引庫操作 mapping映射屬性 索引庫的CRUD 查看、刪除索引庫 文檔操作 …

docker 查看容器 docker 篩選容器

目錄 docker ps 看運行中的容器 運行中的容器篩選容器名 2?? 包括已停止的容器中篩選 3?? 只輸出容器 ID(腳本里常用) docker ps 看運行中的容器 docker ps -a 看所有容器 --filter "namexxx" 可以按名字查 運行中的容器篩選容器名 …

策略模式 vs 適配器模式

一、模式本質1 策略模式:行為的選擇核心思想:定義一組算法,將每個算法封裝起來,并使它們可以互相替換,讓算法的變化獨立于使用它的客戶端。2 適配器模式:接口的轉換核心思想:將一個類的接口轉換…