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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 适配器模式:接口的转换核心思想:将一个类的接口转换…