当前位置: 首页 > 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——回掉函数

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


http://www.mrgr.cn/news/12400.html

相关文章:

  • 成功解决:jenkins构建失败,cannot open directory /home/centos/: Permission denied等问题
  • SFF1604-ASEMI无人机专用SFF1604
  • DAY5:HTTPS和HTTP有哪些区别 | HTTPS的工作原理(HTTPS建立连接的过程)| TCP和UDP的区别
  • Ubuntu搭建FTP服务器
  • vue3使用swiper实现首页图片轮播并自定义左右箭头样式及分页器样式
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • Chromium编译指南2024 - Android篇:安装并运行(九)
  • pyflink中UDTF和UDF的区别
  • PPT到PDF转换器:一个功能强大的Python GUI应用(unzip,convert,replace,merge)
  • 18行为型设计模式——观察者模式
  • CSS学习【margin为负值】
  • Python selenium爬虫被检测到,该怎么破?
  • UE5 多个类选择界面生成
  • 小程序自定义组件配合插槽和组件传值
  • 安卓全盘加密 (Full-Disk Encryption, FDE) 概述
  • vector相关功能的底层实现
  • Java13 网络编程
  • 2024中国国际大数据博览会:引领数字变革,共创未来辉煌
  • Unity坐标系四元数转角度和轴向
  • 金融基础知识-权证投资+基金投资+债券投资