STM32学习笔记:外部中断(EXTI)原理与应用详解

前言

在嵌入式系统开发中,中断机制是提高系统实时性和效率的重要手段。相比传统的51单片机,STM32微控制器提供了更为丰富和灵活的外部中断资源。本文将全面介绍STM32的外部中断(EXTI)功能,包括其工作原理、配置方法和实际应用技巧。

一、外部中断概述

外部中断(EXTI, External Interrupt/Event Controller)是STM32中用于处理外部信号变化的重要外设,它位于APB2总线上。在STM32F1系列中,共有20个EXTI线。

中断与查询的对比

  • 查询方式:就像不断查看水是否烧开,CPU需要持续轮询状态,效率低下
  • 中断方式:如同使用带提醒功能的水壶,水开时自动通知,CPU可处理其他任务

EXTI不仅能产生中断,还能产生事件,二者区别在于:

  • 中断:会触发CPU执行中断服务程序(软件行为)
  • 事件:直接触发其他外设工作(硬件行为),如启动ADC转换或定时器计数

二、STM32外部中断系统架构

1. 外部中断线分配

STM32F10x系列的EXTI控制器具有以下特点:

  • 供GPIO使用的中断线:16个(EXTI0~EXTI15)
  • 专用中断线:4个(EXTI16~EXTI19),分别连接到:
    • EXTI16:PVD输出
    • EXTI17:RTC闹钟事件
    • EXTI18:USB唤醒事件
    • EXTI19:以太网唤醒事件(仅互联型产品)

GPIO引脚与EXTI线的映射关系如下:

  • 每个GPIO端口的Pin x都连接到EXTIx线
  • 例如:PA0、PB0、PC0…都连接到EXTI0线

2. 功能框图分析

在这里插入图片描述

3. 中断向量表

STM32的中断向量表中与EXTI相关的中断有:

中断向量描述
EXTI0_IRQnEXTI线0中断
EXTI1_IRQnEXTI线1中断
EXTI2_IRQnEXTI线2中断
EXTI3_IRQnEXTI线3中断
EXTI4_IRQnEXTI线4中断
EXTI9_5_IRQnEXTI线[9:5]中断
EXTI15_10_IRQnEXTI线[15:10]中断

4. 中断优先级配置

STM32使用NVIC管理中断优先级,配置步骤:

  1. 设置优先级分组(NVIC_PriorityGroupConfig)
  2. 为每个中断通道配置抢占优先级和子优先级

示例配置:

static void EXTI_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;// 配置优先级分组(组0: 0位抢占优先级, 4位子优先级)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 配置EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

三、外部中断库函数开发

1. 配置流程

  1. 开启时钟:GPIO和AFIO时钟
  2. 初始化GPIO:设置为输入模式
  3. 配置EXTI线:选择触发边沿和模式
  4. 配置NVIC:设置中断优先级
  5. 编写中断服务函数:处理中断并清除标志

2. 代码实现

头文件定义 (bsp_key.h):

#ifndef __BSP_KEY_H
#define __BSP_KEY_H// 按键A(PA0)配置
#define KEYA_INT_GPIO_PIN         GPIO_Pin_0
#define KEYA_INT_GPIO_PORT        GPIOA
#define KEYA_INT_GPIO_CLK         (RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO)
#define KEYA_INT_EXTI_Mode        EXTI_Mode_Interrupt
#define KEYA_INT_EXTI_Line        EXTI_Line0
#define KEYA_INT_EXTI_TRIGGER     EXTI_Trigger_Rising
#define KEYA_INT_EXTI_IRQChanned  EXTI0_IRQn
#define KEYA_INT_EXTI_PinSource   GPIO_PinSource0// 按键C(PC13)配置
#define KEYC_INT_GPIO_PIN         GPIO_Pin_13
#define KEYC_INT_GPIO_PORT        GPIOC
#define KEYC_INT_GPIO_CLK         (RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO)
#define KEYC_INT_EXTI_Mode        EXTI_Mode_Interrupt
#define KEYC_INT_EXTI_Line        EXTI_Line13
#define KEYC_INT_EXTI_TRIGGER     EXTI_Trigger_Falling
#define KEYC_INT_EXTI_IRQChanned  EXTI15_10_IRQn
#define KEYC_INT_EXTI_PinSource   GPIO_PinSource13#endif

EXTI初始化函数

void EXTI_Key_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;// 1. 开启时钟RCC_APB2PeriphClockCmd(KEYA_INT_GPIO_CLK, ENABLE);RCC_APB2PeriphClockCmd(KEYC_INT_GPIO_CLK, ENABLE);// 2. 配置GPIOGPIO_InitStructure.GPIO_Pin = KEYA_INT_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(KEYA_INT_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = KEYC_INT_GPIO_PIN;GPIO_Init(KEYC_INT_GPIO_PORT, &GPIO_InitStructure);// 3. 配置EXTI线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, KEYA_INT_EXTI_PinSource);EXTI_InitStructure.EXTI_Line = KEYA_INT_EXTI_Line;EXTI_InitStructure.EXTI_Mode = KEYA_INT_EXTI_Mode;EXTI_InitStructure.EXTI_Trigger = KEYA_INT_EXTI_TRIGGER;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, KEYC_INT_EXTI_PinSource);EXTI_InitStructure.EXTI_Line = KEYC_INT_EXTI_Line;EXTI_InitStructure.EXTI_Trigger = KEYC_INT_EXTI_TRIGGER;EXTI_Init(&EXTI_InitStructure);// 4. 配置NVICEXTI_NVIC_Config();
}

中断服务函数

// EXTI0中断服务函数
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){LED_Toggle();  // 处理中断EXTI_ClearITPendingBit(EXTI_Line0);  // 清除中断标志}
}// EXTI15-10中断服务函数
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line13) != RESET){LED_Toggle();EXTI_ClearITPendingBit(EXTI_Line13);}
}

3. 共享中断线问题探讨

问题:多个GPIO引脚(如PA0、PB0、PC0)共享同一条EXTI线(EXTI0),能否同时使用?

理论分析

  1. 硬件上,同一时间只能有一个EXTI线配置生效
  2. 可通过软件方式实现"共享":
    • 在中断服务函数中读取所有相关GPIO的状态
    • 根据电平变化判断具体是哪个引脚触发的中断

实现尝试

void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0)){// 检查PA0if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET){// 处理PA0中断}// 检查PB0if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == Bit_RESET){// 处理PB0中断}EXTI_ClearITPendingBit(EXTI_Line0);}
}

注意事项

  1. 共享中断线的GPIO必须配置相同的触发边沿
  2. 中断响应时间会略有增加
  3. 实际测试中可能出现预期外的行为,需谨慎使用

四、总结

STM32的外部中断系统提供了强大的外部事件处理能力,合理使用可以显著提高系统的实时性和效率。关键点包括:

  1. 理解EXTI线与GPIO引脚的映射关系
  2. 掌握中断和事件的区别与应用场景
  3. 熟悉NVIC优先级配置方法
  4. 正确处理中断服务函数和标志清除

对于共享中断线的情况,虽然理论可行,但在实际应用中需谨慎评估需求,必要时可考虑使用其他方案如定时扫描或专用中断芯片。

通过本文的介绍,希望读者能够全面掌握STM32外部中断的原理和应用,在项目中灵活运用这一重要功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式知识篇---Zigbee串口

在 Python 中,serial和pyserial是经常被提及的两个库,它们在串口通信方面有着紧密的联系,但又存在一些差异。下面将对它们进行详细介绍,并给出各自的适用场景。 1. 基本概念 pyserial:它是 Python 里专门用于串口通信…

vue中的派发事件与广播事件,及广播事件应用于哪些场景和一个表单验证例子

在 Vue 2.X 中,$dispatch 和 $broadcast 方法已经被废弃。官方认为基于组件树结构的事件流方式难以理解,并且在组件结构扩展时容易变得脆弱。因此,Vue 2.X 推荐使用其他方式来实现组件间的通信,例如通过 $emit 和 $on 方法&#x…

阿里云事件总线 EventBridge 正式商业化,构建智能化时代的企业级云上事件枢纽

作者:肯梦、稚柳 产品演进历程:在技术浪潮中的成长之路 早在 2018 年,Gartner 评估报告便将事件驱动模型(Event-Driven Model)列为十大战略技术趋势之一,指出事件驱动架构(EDA,Eve…

《前端面试题:BFC(块级格式化上下文)》

前端BFC完全指南:布局魔法与面试必备 🎋 端午安康! 各位前端探险家,端午节快乐!🥮 愿你的代码如龙舟竞渡般乘风破浪,样式如香糯粽子般完美包裹!今天我们来解锁CSS中的布局魔法——B…

dvwa10——XSS(DOM)

XSS攻击: DOM型XSS 只在浏览器前端攻击触发:修改url片段代码不存储 反射型XSS 经过服务器攻击触发:可能通过提交恶意表单,连接触发代码不存储 存储型XSS 经由服务器攻击触发:可能通过提交恶意表单,连…

跨平台资源下载工具:res-downloader 的使用体验

一款基于 Go Wails 的跨平台资源下载工具,简洁易用,支持多种资源嗅探与下载。res-downloader 一款开源免费的下载软件(开源无毒、放心使用)!支持Win10、Win11、Mac系统.支持视频、音频、图片、m3u8等网络资源下载.支持视频号、小程序、抖音、…

AOSP CachedAppOptimizer中的冻结和内存压缩功能

AOSP CachedAppOptimizer:应用进程长期处于 Cached 状态的内存压缩和冻结优化管控 冻结和内存压缩两个功能独立触发,可以单独触发也可以组合触发,默认顺序:先压缩,后冻结 public class OomAdjuster { protected b…

相机--相机成像原理和基础概念

教程 成像原理 基础概念 焦距(物理焦距) 镜头的光学中心到感光元件之间的距离,用f表示,单位:mm;。 像素焦距 相机内参矩阵中的 fx​ 和 fy​ 是将物理焦距转换到像素坐标系的产物,可能不同。…

Vue3项目实现WPS文件预览和内容回填功能

技术方案背景:根据项目需要,要实现在线查看、在线编辑文档,并且进行内容的快速回填,根据这一项目背景,最终采用WPS的API来实现,接下来我们一起来实现项目功能。 1.首先需要先准备好测试使用的文档&#xf…

汇编语言学习(三)——DoxBox中debug的使用

目录 一、安装DoxBox,并下载汇编工具(MASM文件) 二、debug是什么 三、debug中的命令 一、安装DoxBox,并下载汇编工具(MASM文件) 链接: https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…

关于DDOS

DDOS是一门没什么技术含量的东西,其本质而言是通过大量数据报文,发送到目标受害主机IP地址上,导致目标主机无法继续服务(俗称:拒绝服务) DDOS灰产人期望达成的预期目标,几乎都是只要把对面打到 …

Modbus转Ethernet IP网关助力罗克韦尔PLC数据交互

在工业自动化领域,Modbus协议是一种广泛应用的串行通信协议,它定义了主站和从站之间的通信规则和数据格式。罗克韦尔PLC是一种可编程的逻辑控制器,通过Modbus协议实现与其他设备之间的数据交互。然而,随着以太网技术的普及和发展&…

C# winform教程(二)----button

一、button的使用方法 主要使用方法几乎都在属性内,我们操作也在这个界面 二、作用 用户点击时触发事件,事件有很多种,可以根据需要选择。 三、常用属性 虽然属性很多,但是常用的并不多 3.常用属性 名称内容含义AutoSize自动调…

【 java 基础问题 第二篇 】

目录 1.深拷贝和浅拷贝 1.1.区别 定义 定义 1.2.实现深拷贝的方式 2.泛型 2.1.定义 2.2.作用 3.对象 3.1.创建对象的方式 3.2.对象回收 3.3. 获取私有成员 4.反射 4.1.定义 4.2.特性 4.3.原理 5.异常 5.1.异常的种类 5.2.处理异常的方法 6.Object 6.1.等于与…

Kafka 入门指南与一键部署

Kafka 介绍 想象一下你正在运营一个大型电商平台,每秒都有成千上万的用户浏览商品、下单、支付,同时后台系统还在记录用户行为、更新库存、处理物流信息。这些海量、持续产生的数据就像奔腾不息的河流,你需要一个强大、可靠且实时的系统来接…

湖北理元理律师事务所:企业债务重组的风险控制方法论

一、担保链破解:阻断债务传染的核心技术 2023年武汉某建材公司案例: 原始债务结构: A公司(主债务人)欠款200万 ↓ B公司(担保人)←连带责任触发执行 ↓ C公司(B公司担…

如何在CloudCompare中打开pcd文件

你只需要将pcd文件的路径改在全英文路径下,CloudCompare就可以打开。若含中文,就会报错:

中医的十问歌和脉象分类

中医核心理论框架如下 诊断技术如下 本文主要介绍问诊和切诊。 十问歌的“十”是虚指,实际包含12个核心问题,脉象28种中常见仅10余种,重点解释脉诊的物理本质(血流动力学触觉感知) 以下是中医十问歌的完整内容及脉…

基于智能代理人工智能(Agentic AI)对冲基金模拟系统:模范巴菲特、凯西·伍德的投资策略

股票市场涉及众多统计数据和模式。股票交易基于研究和数据驱动的决策。人工智能的使用可以实现流程自动化,让投资者在研究上花费更少的时间,同时提高准确性。这使他们能够更加专注于监督实际交易和服务客户。 顶尖对冲基金经理发挥着至关重要的作用&…

大二下期末

一.Numpy(Numerical Python) Numpy库是Python用于科学计算的基础包,也是大量Python数学和科学计算包的基础。不少数据处理和分析包都是在Numpy的基础上开发的,如后面介绍的Pandas包。 Numpy的核心基础是ndarray(N-di…