网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 操作系统 > 嵌入式 >

STM32HAL库中断教程以及分装中断工具函数(附下载

时间:2025-12-22 11:20

人气:

作者:admin

标签:

导读:文章内容 使用HAL库实现引脚外部中断 封装中断工具函数 快速入门 访问git仓库: Guardian-Elf/Guardian-Elf-Embedded 找到并下载中断工具文件(2个文件:Interrupt.h/.c) 由于我的项目中使用了串口...
  1. 使用HAL库实现引脚外部中断
  2. 封装中断工具函数
  1. 访问git仓库: Guardian-Elf/Guardian-Elf-Embedded
  2. 找到并下载中断工具文件(2个文件:Interrupt.h/.c)
  3. 由于我的项目中使用了串口来调试中断函数,所以如果报错就把无关的代码删除
  4. 代码示例
// 配置GPIOB的1,0引脚
void Interrupt_Service_Init(void) {  
    Interrupt_Init(GPIOB, GPIO_PIN_0, 1, 3);  
    Interrupt_Init(GPIOB, GPIO_PIN_1, 1, 3);  
}  
  
// 中断触发时会执行这两个函数
void Interrupt_0(void) {  
    OLED_NextPage();  // 这个OLED的驱动函数,你可以改成LED点灯来判断是否成功
}  
void Interrupt_1(void) {  
    OLED_PrevPage();  
}

初始化引脚

__HAL_RCC_GPIOB_CLK_ENABLE() // 开启引脚使能

GPIO_InitTypeDef GPIO_InitStruct = {0};  
GPIO_InitStruct.Pin = GPIO_PIN_0;  // GPIOB 0引脚
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  // 下降沿触发(按键按下为低)
GPIO_InitStruct.Pull = GPIO_PULLUP;  // 默认上拉,未按下时为高
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  
HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);

// 配置中断优先级并使能  
// EXTI0_IRQn 表示0通道,当A0,B0,C0...触发中断后会激活这个通道
HAL_NVIC_SetPriority(EXTI0_IRQn, 3, 0);  
HAL_NVIC_EnableIRQ(EXTI0_IRQn);

中断触发函数

  1. EXTI0_IRQHandler实现
// 当A0,B0,C0...触发中断后会进入这个函数
void EXTI0_IRQHandler(void)    {  
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 内部自动处理有关中断的寄存器标志位
}
  1. HAL_GPIO_EXTI_IRQHandler解析

这个函数是HAL库自带的,用于自带处理中断标志位,这样用户就可以不用操作寄存器,而是实现具体中断业务代码

因为这个函数是用来处理所有组的所有引脚的中断,所有需要判断引脚

/**  
  * @brief  This function handles EXTI interrupt request.  * @param  GPIO_Pin: Specifies the pins connected EXTI line  * @retval None  */void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)  
{  
  /* EXTI line interrupt detected */  
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)  
  {  
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);  
    HAL_GPIO_EXTI_Callback(GPIO_Pin);  
  }  
}

可以看到当产生中断是会执行HAL_GPIO_EXTI_Callback函数,所以用户只需要重写这个函数即可

  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_0)
    {
        // 这里写你的中断处理代码
        
        // 示例:翻转LED
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        
        // 示例:发送消息
        // UART_SendString("EXTI0 Triggered!\r\n");
    }
}

如果觉得有帮助到你,就请给仓库一个 star 吧!

git仓库: Guardian-Elf/Guardian-Elf-Embedded

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信