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

STM32CubeIDE新建项目过程记录备忘(四)EXTI外部中断

使用外部中断的方式检测按钮。

  • 为中断分配GPIO管脚

        我的野火开发板,PC13已经接有按钮,将PC13设置为外部中断GPIO_EXTI13, 模式为上升沿检测,板子上已有下拉电阻,所以选择无上拉无下拉。

  • 设置中断优先级并使能中断

        EXTI13,对应中断向量是 EXTI15_10_IRQn,所以在设置优先级的时候选择EXTI line[15:10] interrupts。

  • 生成中断代码

黄齿轮,生成代码:

打开main.c,在MX_GPIO_Init()的函数定义中可以看到定义中断的代码:

HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);  /*优先级*/HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);  /*使能中断请求*/

 解释:

  • HAL_NVIC_EnableIRQ() 是 HAL 库提供的中断使能函数,用于向嵌套向量中断控制器(NVIC)发送指令,允许指定的中断源产生中断。
  • EXTI15_10_IRQn 是中断源的标识,代表外部中断线 10 到 15 共用的中断通道。在 STM32 中,外部中断线 10-15 共享一个中断服务程序,调用该函数后,这几个中断线触发时将能够产生中断并执行对应的处理程序。
  • 编写中断程序

打开文件stm32f1xx_it.c

        可以看到中断服务函数EXTI15_10_IRQHandler(),它用于处理外部中断线(EXTI)10 到 15 的中断请求。当 EXTI10 至 EXTI15 中的任何一条中断线触发中断时,系统会自动跳转到执行该函数。

        可以看到,在EXTI15_10_IRQHandler()函数中,调用了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13),按住ctrl键点击这个调用,跳转到它的定义,程序自动打开了stm32f1xx_hal_gpio.c:

 HAL_GPIO_EXTI_IRQHandler()的两行代码,含义为:

__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);  /*清楚中断标志*/
HAL_GPIO_EXTI_Callback(GPIO_Pin);    /*回调中断函数*/

然后,按住ctrl点击HAL_GPIO_EXTI_Callback,跳转到它的定义:

可以看到,这是一个弱定义函数,需要重写同名函数来覆盖它。总结以上的过程,就是:

        触发外部中断EXTI13-->调用共用的中断服务函数EXTI15_10_IRQHandler()-->调用服务函数HAL_GPIO_EXTI_IRQHandler()-->调用中断回调函数HAL_GPIO_EXTI_Callback()。

        中断回调函数HAL_GPIO_EXTI_Callback()一般定义在stm32f1xx_it.c里面,需要自己写代码:

/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{HAL_Delay(10);         /* 延时消抖 */switch(GPIO_Pin){case GPIO_PIN_13 :if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET)/* 按下按钮 */{HAL_GPIO_TogglePin(GPIOA, LED_G_Pin);      /* LED翻转 */break;}}
}/* USER CODE END 1 */

        第一次创建了这个外部中断回调函数,以后直接打开stm32f1xx_it.c文件在这里修改就好了。这个外部中断回调函数是共用的,如果需要定义其他的外部中断,在下面添加case即可。

http://www.dtcms.com/a/309801.html

相关文章:

  • 网络编程-加密算法
  • Spring Boot 异步执行方式全解析:@Async、CompletableFuture 与 TaskExecutor 对比
  • 面试题:怎么理解 OSI 参考模型(开放式系统互联参考模型) 和 TCP/IP 模型(传输控制协议 / 网际协议模型 )
  • Node.js中Buffer的用法
  • Linux中Docker Swarm介绍和使用
  • 数据结构学习基础和从包装类缓存到泛型擦除的避坑指南
  • QT初入门-界面设置
  • Metamorph、LlamaFusion、MetaQuery论文解读
  • Linux的对称多处理(SMP)机制
  • embodied复现所需docker环境配置粗略流程
  • CentOS7下同步时间的几种方式(NTP 、Chrony和systemd-timesyncd)
  • 2025年08月01日Github流行趋势
  • 注解退散!纯XML打造MyBatis持久层的终极形态
  • OCR、文档解析工具合集
  • C++ 前缀和、双指针
  • [位运算]2411. 按位或最大的最小子数组长度
  • 下载一个JeecgBoot-master项目 导入idea需要什么操作启动项目
  • 26数据结构-顺序表
  • SpringMVC RESTful 核心要点
  • Excel数据转化为Xmind思维导图全流程(含Word转化格式),实用
  • hadoop.yarn 带时间的LRU 延迟删除
  • 如何在 Mac OS 上安装 Cursor
  • 2025 腾讯广告算法大赛 Baseline 项目解析
  • Python - 数据分析三剑客之Matplotlib
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘altair’问题
  • Apache Flink 2.1.0: 面向实时 Data + AI 全面升级,开启智能流处理新纪元
  • 从游戏NPC到手术助手:Agent AI重构多模态交互,具身智能打开AGI新大门
  • AI 重塑软件产业:从技术革命到生态重构
  • 超聚变:智能体时代,AI原生重构城企数智化基因
  • 技术信任革命:区块链重构信用机制全解析