嵌入式开发之STM32学习笔记day08

从“门铃”到“中断”:手把手玩转STM32的外部中断控制器(EXTI)

引言:为什么我们需要“中断”?

        类比生活场景:用“快递按门铃”解释中断的意义)
        想象一下:当你在家写代码,突然快递员按门铃,你会暂停工作去开门,处理完后再继续写代码。这就是“中断”的核心思想——让CPU及时响应紧急事件

        在嵌入式系统中,外部中断/事件控制器EXTI(External Interrupt/Event Controller)是一个非常重要的外设,就像这个“门铃”,负责检测外部信号的变化(比如按键按下、传感器触发),并通知CPU处理。EXTI的设计使得开发者能够高效地处理外部事件,而不需要频繁地轮询输入引脚的状态。本文将深入探讨EXTI的工作原理、配置方法以及实际应用,帮助读者更好地理解和应用这一强大的功能。

1 EXTI概述

1.1 什么是EXTI?

        外部中断/事件控制器(EXTI)是微控制器中的一个外设,用于处理来自外部引脚的中断和事件。EXTI可以监控多个GPIO引脚的状态变化,并在检测到特定事件(如上升沿、下降沿或电平变化)时触发中断或事件。

1.2 EXTI的作用与优势

        EXTI的主要作用是允许微控制器对外部事件做出快速响应,而不需要频繁地轮询输入引脚的状态。这种机制不仅提高了系统的响应速度,还降低了CPU的负载,使得系统能够更高效地运行。

  • 快速响应:EXTI能够在微秒级别内响应外部事件。
  • 低功耗:在低功耗模式下,EXTI可以唤醒微控制器,从而延长电池寿命。
  • 灵活性:EXTI支持多种触发方式,可以根据应用需求进行配置。

1.3 EXTI架构全景图

注意:见STM32F10xxx参考手册(中文).pdf文件第135页

EXTI控制器的主要特性如下:

  • 每个中断/事件都有独立的触发和屏蔽
  • 每个中断线都有专用的状态位
  • 支持多达20个软件的中断/事件请求
  • 检测脉冲宽度低于APB2时钟宽度的外部信号

EXTI的核心由三大模块构成:

  1. 事件检测器:24个可配置通道(不同型号可能不同)
  2. 边沿选择器:上升沿/下降沿/双边沿触发
  3. 中断屏蔽器:灵活控制各通道使能状态
// 典型EXTI寄存器结构
typedef struct {__IO uint32_t IMR;   // 中断屏蔽寄存器__IO uint32_t EMR;   // 事件屏蔽寄存器__IO uint32_t RTSR;  // 上升沿触发选择寄存器__IO uint32_t FTSR;  // 下降沿触发选择寄存器__IO uint32_t SWIER; // 软件中断事件寄存器__IO uint32_t PR;    // 挂起寄存器
} EXTI_TypeDef;

2 EXTI的工作原理

2.1 外部中断与外部事件的区别

        在EXTI中,外部中断和外部事件是两个不同的概念:

  • 外部中断:当EXTI检测到特定事件时,会触发一个中断请求,CPU会暂停当前任务,转而执行中断服务程序(ISR)。
  • 外部事件:EXTI检测到事件后,不会触发中断,而是直接触发一个事件信号,通常用于唤醒微控制器或触发其他外设。

        两者的本质区别

模式类型信号路径典型应用场景响应时间
中断模式GPIO → EXTI → NVIC → CPU需要软件处理的紧急事件约5-10个时钟周期
事件模式GPIO → EXTI → 外设联动DMA/定时器等硬件同步信号级响应

2.2 EXTI的触发方式

        EXTI支持以下几种触发方式:

  • 上升沿触发:当输入信号从低电平变为高电平时触发。
  • 下降沿触发:当输入信号从高电平变为低电平时触发。
  • 双边沿触发:当输入信号发生任何变化时触发。
  • 电平触发:当输入信号保持特定电平时触发。

2.3 EXTI的中断处理流程

        当EXTI检测到触发事件时,会按照以下流程处理:

  1. 事件检测:EXTI监控的GPIO引脚状态发生变化。
  2. 触发条件匹配:EXTI根据配置的触发方式判断是否满足触发条件。
  3. 中断请求生成:如果满足触发条件,EXTI会生成一个中断请求。
  4. 中断服务程序执行:CPU暂停当前任务,执行相应的中断服务程序(ISR)。
  5. 中断标志清除:在ISR中清除中断标志,以便处理下一个中断。

3 手把手实战——按键中断全流程开发

3.1 硬件准备:最小系统搭建

  • 材料清单:STM32开发板、10kΩ电阻、轻触开关、杜邦线
  • 电路原理图:
VCC → 按键 → PA0 → GND↑
10kΩ下拉电阻

3.2 配置步骤

  1. 配置PA0引脚为输入模式,并启用外部中断功能
  2. 设置外部中断触发方式(上升沿触发)
  3. 使能并配置中断优先级
  4. 编写中断服务函数

3.3 配置代码

#include "stm32f10x.h"// 初始化GPIO引脚为输入模式
void GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;// 启用GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置PA0为输入模式,且启用外部中断GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               // PA0引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;           // 上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);                   // 应用配置
}// 配置EXTI中断
void EXTI_Config(void) {EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 启用SYSCFG时钟(用来连接外部中断)RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// 连接EXTI Line0 (PA0)到EXTI0GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);// 配置EXTI0中断触发方式为上升沿EXTI_InitStructure.EXTI_Line = EXTI_Line0;                  // 配置EXTI Line0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         // 中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;      // 上升沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   // 启用中断EXTI_Init(&EXTI_InitStructure);// 配置NVIC,设置EXTI0的优先级和使能NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;           // 选择EXTI0中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   // 中断优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         // 子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             // 使能中断NVIC_Init(&NVIC_InitStructure);
}// 外部中断服务程序
void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {               // 检查是否为EXTI0中断EXTI_ClearITPendingBit(EXTI_Line0);                    // 清除中断标志// 这里是中断服务函数的核心代码// 例如,触发某个操作:点亮LED,或切换状态等// LED_GPIO_TogglePin(GPIOC, GPIO_Pin_13); // 假设LED连接到PC13引脚}
}

解释:

  1. GPIO配置:我们配置PA0引脚为输入模式,并启用上拉电阻(GPIO_Mode_IPU),这样PA0引脚会在没有按键按下时保持高电平。当按键按下时,PA0会变为低电平,外部中断触发。
  2. EXTI配置:通过GPIO_EXTILineConfig()函数,我们将PA0引脚映射到EXTI Line0。然后配置EXTI Line0的触发方式为上升沿触发(EXTI_Trigger_Rising)。最后启用中断,并通过NVIC_Init()函数配置NVIC,使能EXTI0的中断处理。
  3. 外部中断服务函数:在EXTI0_IRQHandler()中断处理函数中,当检测到PA0引脚的上升沿时(按键释放),我们清除中断标志,并可以在中断服务函数内执行其他操作,如控制LED灯亮灭等。

4 EXTI的应用场景

4.1 按键检测

在嵌入式系统中,按键检测是一个常见的应用场景。通过配置EXTI,可以在按键按下或释放时立即触发中断,从而快速响应用户输入。

4.2 传感器信号处理

许多传感器输出数字信号,当传感器检测到特定事件时,信号会发生变化。通过EXTI,可以在信号变化时立即触发中断,从而快速处理传感器数据。

4.3 低功耗模式下的唤醒

在低功耗模式下,微控制器通常会关闭大部分外设以节省电能。通过配置EXTI,可以在特定事件(如按键按下或传感器信号变化)发生时唤醒微控制器,从而延长电池寿命。

5. EXTI的常见问题与解决方案

  • 中断抖动问题:在按键检测等应用中,由于机械开关的特性,按键按下或释放时可能会产生抖动,导致多次触发中断。为了解决这个问题,可以在硬件上添加去抖动电路,或者在软件中进行去抖动处理。
  • 中断优先级配置:在多任务系统中,不同中断的优先级配置非常重要。如果多个中断同时触发,高优先级的中断会优先执行。因此,需要根据应用需求合理配置中断优先级。
  • 多引脚中断处理:在某些应用中,可能需要同时监控多个GPIO引脚的状态变化。在这种情况下,可以通过配置多个EXTI线路,并在中断服务程序中判断具体是哪个引脚触发了中断。

6 总结

        外部中断/事件控制器(EXTI)是嵌入式系统中一个非常重要的外设,它允许微控制器对外部事件做出快速响应。通过合理配置EXTI,可以实现高效的外部事件处理,提高系统的响应速度和降低CPU的负载。本文详细介绍了EXTI的工作原理、配置方法以及实际应用,希望能够帮助读者更好地理解和应用这一强大的功能。

        在实际开发中,EXTI的应用场景非常广泛,从简单的按键检测到复杂的传感器信号处理,EXTI都能发挥重要作用。通过深入理解EXTI的工作原理和配置方法,开发者可以更好地利用这一功能,设计出高效、可靠的嵌入式系统。

        希望本文能够为读者提供有价值的信息,并激发大家对嵌入式系统开发的兴趣。如果你有任何问题或建议,欢迎在评论区留言讨论!


互动环节

  • 你在实际项目中是如何使用EXTI的?欢迎分享你的经验和心得!

  • 如果你对EXTI有任何疑问,欢迎在评论区提问,我会尽力解答。


关注我

  • CSDN博客:小程同学>o<-CSDN博客

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

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

相关文章

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; VMw…

Mac:JMeter 下载+安装+环境配置(图文详细讲解)

&#x1f4cc; 下载JMeter 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi &#x1f4cc; 无需安装 Apache官网下载 JMeter 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目…

【简单有效!】Gradio利用html插件实现video视频流循环播放

文章目录 前言 & 思路静态资源挂载完整代码结果示例 前言 & 思路 需要利用gradio在前端搭建一个页面&#xff0c;循环播放视频。思路是直接调用gr.HTML插件实现&#xff0c;简单有效&#xff01;&#xff01;&#xff01; 静态资源挂载 app.mount("/static&quo…

⭐算法OJ⭐克隆图【BFS】(C++实现)Clone Graph

前情提要&#xff1a;图论入门【数据结构基础】&#xff1a;什么是图&#xff1f;如何表示图&#xff1f; 133. Clone Graph Given a reference of a node in a connected undirected graph. Return a deep copy (clone) of the graph. Each node in the graph contains a va…

SpringSecurity——基于角色权限控制和资源权限控制

目录 基于角色权限控制 1.1 自定义 UserDetailsService 1.2 加载用户角色 1.3. 给角色配置能访问的资源&#xff08;使用切面拦截&#xff0c;使用注解&#xff09; 总结 资源权限控制 2.2. 需要有一个用户&#xff1b;&#xff08;从数据库查询用户&#xff09; 2.2 基…

【MySQL】表的约束

目录 零、前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键结尾 零、前言 表中一定要有各种约束&#xff0c;通过约束来让用户未来插入的数据是符合要求的。约束的本质就是通过计算反过来要求用户插入正确的数据。所以站在MySQL的角度上来…

SQLMesh系列教程:SQLMesh虚拟数据环境

各种工具都已将软件工程实践引入到数据工程中&#xff0c;但仍有差距存在&#xff0c;尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地&#xff0c;解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中&#xff0c;我将对 SQLMesh 进行简…

基于Babylon.js的Shader入门之五:让Shader支持法线贴图

如果一个比较平坦的物体表面要添加更多的凹凸细节&#xff0c;但是我们又不想通过建模实现&#xff0c;这时候法线贴图就派上用场了。法线贴图是通过与灯光的交互来让一个平坦表面造成凹凸效果假象的&#xff0c;在基于Babylon.js的Shader入门之四&#xff1a;让Shader支持基础…

活码在实际操作中的具体场景有哪些?怎么应用?

当传统二维码因“内容固定、无法追踪、流量拥堵”等问题逐渐失效时&#xff0c;活码正在成为企业破解运营痛点的关键工具。 无论是需要实时更新内容的线下物料&#xff0c;还是面临用户分流压力的线上客服&#xff0c;动态二维码都能通过“一码多用、灵活配置”的特性&#xf…

极空间NAS部署gitea教程

极空间NAS部署gitea步骤教程 背景1. 准备镜像1.1 极空间官方1.2 Win系统docker再上传1.3 镜像转录 2. MySql配置2.1 容器配置2.2 命令行配置 3. gitea配置3.1 容器配置3.2 打开网页3.3 网页配置安装 参考资料 背景 极空间Nas和别的Nas不同的地方就在于&#xff0c;他不是那种标…

Wireshark:在 显示过滤器中“加入条件”过滤后,出现其他类型的数据包,为什么?

一、 在Wireshark中使用“tcp协议”过滤后&#xff0c;仍出现TLSv1.2协议的数据包&#xff0c;原因如下&#xff1a; 1. ‌协议层次关系‌ ‌TCP是传输层协议‌&#xff0c;而‌TLS属于应用层协议‌&#xff0c;后者直接运行于TCP之上‌28。因此&#xff0c;所有TLS流量&…

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力 0. 论文简介0.1 基本信息0.2 摘要 1. 引言2. 材料与方法2.1 大语言模型的使用2.2 可读性标准2.3 统计分析 3. 结果3.1 Bezirci-Yılmaz可读性评分3.2 Ateşman可读性评分3.3 全面性评分3.4 准确性评分 4. 讨论4.1 可读…

设计模式(行为型)-策略模式

目录 定义 类图 角色 角色详解 Strategy&#xff08;抽象策略类&#xff09;​ Context&#xff08;环境类 / 上下文类&#xff09;​ ConcreteStrategy&#xff08;具体策略类&#xff09;​ 优缺点 优点​ 缺点​ 使用场景 类行为差异场景​ 动态算法选…

服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)

服装零售行业数字化时代的业务与IT转型规划P111 详细资料请看本解读文章的最后内容。 随着数字化技术的迅猛发展&#xff0c;服装零售行业正经历着前所未有的变革。本文将对《服装零售行业数字化时代的业务与IT转型规划P111》进行详细解读&#xff0c;探讨未来几年内该行业的…

【大语言模型_6】mindie启动模型错误整理

一、启动报 [hccl_runner.cpp:141] AllGatherHcclRunner:0 HcclCommInitRootInfo fa il, error:2, rank:0, rankSize:2 背景&#xff1a;运行DeepSeek-R1-Distill-Qwen-14B模型&#xff0c;在2张300 P卡可以运行&#xff0c;单独一张启动报以上错误。 问题分析&…

STM32F429单片机FMC接口驱动TFT LCD和SDRAM

1、FMC接口介绍 FMC 接口&#xff08;即可变存储控制器&#xff09;是一种用于管理外部存储器的外设接口&#xff0c;支持多种类型的存储器&#xff0c;主要分为三大类&#xff1a;NOR/SRAM/PSRAM设备&#xff08;TFTLCD相当于SRAM&#xff09;、NOR FLASH/NAND FLASH/PC卡设备…

ollama不安装到c盘,安装到其他盘

ollama 安装包默认安装到c盘&#xff0c;安装程序并没有提供选择文件夹安装功能&#xff0c;本来c盘就快满了&#xff0c;下几个模型c盘都快爆了&#xff0c;如何将ollma安装到其他盘呢&#xff1f; ollama 默认安装位置 C:\Users\Admin\.ollama 是 Ollama 用来放大模型的文件夹…

java项目之基于ssm的少儿编程在线培训系统(源码+文档)

项目简介 少儿编程在线培训系统实现了以下功能&#xff1a; 用户信息管理&#xff1a; 用户信息新增 用户信息修改 教师信息管理&#xff1a; 教师信息添加 教师信息删除 教师信息修改 课程信息管理&#xff1a; 课程信息添加 课程信息修改 课程信息删除 课程类型管理&…

Cinema4D安装及基本操作

一、简介 Cinema 4D&#xff08;C4D&#xff09;是德国 Maxon Computer 开发的 3D 软件&#xff0c;具备强大的建模、动画、材质、渲染功能&#xff0c;以易用高效著称&#xff0c;广泛应用于影视、游戏、设计等领域&#xff0c;是行业内主流 3D 创作工具。 二、安装 1.下载安…

为什么TCP需要三次握手?一次不行吗?

文章目录 1. 三次握手的过程2. 为什么需要三次握手&#xff1f;3. 握手过程中每一步的具体作用4. 简单比喻5. 为什么是三次握手&#xff0c;而不是两次或四次&#xff1f;6. 三次握手中的序列号有什么作用&#xff1f;7. 总结 1. 三次握手的过程 三次握手是建立 TCP 连接的过程…