当前位置: 首页 > news >正文

STM32外部中断事件控制器-EXTI

EXTI简介:

        EXTI 是 External Interrupt 的缩写,表示外部中断事件控制器。EXTI 可以监测指定 GPIO 口的电平信号变化,并在检测到指定条件时,向内核的中断控制器 NVIC 发出中断申请。NVIC 在裁决后,如果满足条件,会中断CPU的主程序,使 CPU 转而执行 EXTI 对应的中断服务程序。
        EXTI 支持的触发方式:上升沿、下降沿、双边沿或软件触发。
        EXTI 支持所有的 GPIO 口,但需要注意的是,相同的 Pin 不能同时触发中断。例如,PA0 和 PB0 不能同时被配置为中断源。
        EXTI 提供了 16 个 GPIO_Pin 的中断线,以及额外的中断线如 PVD 输出、RTC 闹钟、USB 唤醒和以太网唤醒。

EXTI的基本结构:

EXTI框图:

EXTI有关寄存器函数:

         HAL_GPIO_EXTI_IRQHandler——用于处理外部中断请求(External Interrupt)

(EXTI的中断服务函数)

        它的主要作用是处理通过 GPIO 引脚触发的外部中断事件。

具体说明:
        1. 函数含义:HAL_GPIO_EXTI_IRQHandler`是 与 GPIO 外部中断相关的中断处理函数。当某个 GPIO 引脚配置为外部中断模式,并且在引脚上发生中断事件(如上升沿或下降沿),这个函数会被调用。

        2. 主要功能:这个函数的主要功能是调用相应的中断回调函数(HAL_GPIO_EXTI_Callback),以处理特定的中断事件。它内部首先会清除中断标志位,防止中断重复触发,随后会调用由用户实现的回调函数,这样用户可以在这个回调函数中编写具体的中断处理逻辑。

        3. 使用场景:
   - 当你需要响应外部信号(例如按键、传感器信号等)时,可以将某个 GPIO 引脚配置为外部中断模式。当信号触发中断时,系统会自动调用 `HAL_GPIO_EXTI_IRQHandler` 来处理这个中断。
   - 例如,如果一个按钮连接到某个 GPIO 引脚,当用户按下按钮时引脚电平变化,产生一个中断,这时 `HAL_GPIO_EXTI_IRQHandler` 函数会被执行,从而调用用户定义的中断回调函数来处理按钮按下的事件。

示例代码:

void EXTI0_IRQHandler(void)
{// 调用 HAL 库的中断处理函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_0){// 在这里处理按钮按下的事件// 例如:点亮一个 LEDHAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);}
}

       

 __HAL_GPIO_EXTI_GET_IT是 STM32 HAL 库中的一个宏定义,用于获取指定 GPIO 引脚的中断标志位(Interrupt Flag)。

        它的主要作用是检查某个引脚是否触发了中断,判断这个引脚的中断事件是否已经发生。

(简单来说就是查询挂起寄存器的状态,并返回挂起寄存器的值)

具体说明:
1. 宏定义含义:`__HAL_GPIO_EXTI_GET_IT` 是一个宏,用于检查 EXTI(External Interrupt/Event Controller) 中的中断挂起寄存器(Pending Register),判断指定的 GPIO 引脚是否触发了中断。简单来说,它返回一个布尔值,表示该引脚的中断标志是否被置位。

2. 使用场景:
   - 当你在处理中断时,需要确定是哪一个引脚产生了中断,`__HAL_GPIO_EXTI_GET_IT` 可以用于判断特定引脚是否触发了中断。
   - 这在需要处理多个引脚的中断或需要手动检查某个中断状态时非常有用。

3. 使用方式:
   - 该宏的输入是某个 GPIO 引脚号(例如 `GPIO_PIN_0`, `GPIO_PIN_1` 等),它返回一个值,用于指示这个引脚的中断标志位是否被置位。

代码示例:
下面是一个使用 `__HAL_GPIO_EXTI_GET_IT` 的简单例子,展示如何在中断处理程序中使用这个宏来检查某个引脚的中断标志。

void EXTI0_IRQHandler(void)
{// 检查引脚 GPIO_PIN_0 是否触发了中断if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET){// 处理 GPIO_PIN_0 的中断事件HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);// 清除中断标志位__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);}
}

在这个例子中:
- `__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0)` 用于检查 `GPIO_PIN_0` 是否触发了中断。如果返回值不是 `RESET`,则说明该引脚的中断标志已经被置位。
- 如果中断确实发生了,执行相应的中断处理逻辑(例如,切换 LED 的状态)。
- 最后,通过调用 `__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0)` 来清除中断标志位,防止中断被重复触发。

void HAL_GPIO_EXTI_Callback——回掉函数

如果外部触发了中断,我们就需要回调中断处理函数

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【AI学习】在魔塔社区玩Ollama:部署GLM4和CodeGeeX4
  • 切换JDK版本
  • CSS3页面布局-三栏-固定宽度布局
  • TCP协议(1)
  • Ubuntu上搭建Nginx环境
  • Golang | Leetcode Golang题解之第368题最大整除子集
  • 面试被面试官问:3D目标检测预处理优化策略有哪些?
  • 计算机网络模型
  • kafak集群搭建-基于zookeeper方式
  • 七牛云文件存储
  • 大模型在应用开发安全左移实践
  • 【C/C++】Sleep()函数详解
  • GPIO(通用输入/输出)、中断(hal库)
  • Chrome 中的 RCE 会在 JIT 编译器中产生不正确的副作用
  • 【Linux】匿名管道
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • dva中组件的懒加载
  • echarts的各种常用效果展示
  • JavaScript服务器推送技术之 WebSocket
  • k个最大的数及变种小结
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • MQ框架的比较
  • MySQL主从复制读写分离及奇怪的问题
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • 笨办法学C 练习34:动态数组
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #数学建模# 线性规划问题的Matlab求解
  • %check_box% in rails :coditions={:has_many , :through}
  • (C11) 泛型表达式
  • (Java数据结构)ArrayList
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (一)RocketMQ初步认识
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • .chm格式文件如何阅读
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core中如何集成RabbitMQ
  • .NET 快速重构概要1
  • .Net 路由处理厉害了
  • .net 微服务 服务保护 自动重试 Polly
  • .NetCore发布到IIS
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++] vector list 等容器的迭代器失效问题