找回密码
 立即注册
首页 业界区 业界 STM32HAL库中断教程以及分装中断工具函数(附下载地址) ...

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

奄蜊 2 小时前
文章内容


  • 使用HAL库实现引脚外部中断
  • 封装中断工具函数
快速入门


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

初始化引脚
  1. __HAL_RCC_GPIOB_CLK_ENABLE() // 开启引脚使能
  2. GPIO_InitTypeDef GPIO_InitStruct = {0};  
  3. GPIO_InitStruct.Pin = GPIO_PIN_0;  // GPIOB 0引脚
  4. GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  // 下降沿触发(按键按下为低)
  5. GPIO_InitStruct.Pull = GPIO_PULLUP;  // 默认上拉,未按下时为高
  6. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  
  7. HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
  8. // 配置中断优先级并使能  
  9. // EXTI0_IRQn 表示0通道,当A0,B0,C0...触发中断后会激活这个通道
  10. HAL_NVIC_SetPriority(EXTI0_IRQn, 3, 0);  
  11. HAL_NVIC_EnableIRQ(EXTI0_IRQn);
复制代码
中断触发函数


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

  • HAL_GPIO_EXTI_IRQHandler解析
这个函数是HAL库自带的,用于自带处理中断标志位,这样用户就可以不用操作寄存器,而是实现具体中断业务代码
因为这个函数是用来处理所有组的所有引脚的中断,所有需要判断引脚
  1. /**  
  2.   * @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)  
  3. {  
  4.   /* EXTI line interrupt detected */  
  5.   if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)  
  6.   {  
  7.     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);  
  8.     HAL_GPIO_EXTI_Callback(GPIO_Pin);  
  9.   }  
  10. }
复制代码
可以看到当产生中断是会执行HAL_GPIO_EXTI_Callback函数,所以用户只需要重写这个函数即可

  • void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.     if(GPIO_Pin == GPIO_PIN_0)
  4.     {
  5.         // 这里写你的中断处理代码
  6.         
  7.         // 示例:翻转LED
  8.         HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  9.         
  10.         // 示例:发送消息
  11.         // UART_SendString("EXTI0 Triggered!\r\n");
  12.     }
  13. }
复制代码
结语

如果觉得有帮助到你,就请给仓库一个 star 吧!
git仓库: Guardian-Elf/Guardian-Elf-Embedded

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册