清园暖歌 2023-06-07 21:39 采纳率: 0%
浏览 52

stm32hal库中断回调函数

stm32hal库如果使用多个外设的话是不是可以不用中断回调函数,直接在中断服务函数里写代码

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-12 14:40
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7742252
    • 这篇博客你也可以参考下:STM32HAL库中断服务函数调用过程
    • 除此之外, 这篇博客: 【STM32HAL库】常用功能备忘中的 外部中断回调函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      这个函数是每一个外部中断发生时调用,需要在里面区分中断

      需要自己写,名字不能错误

      void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
      {
          if (GPIO_Pin == GPIO_PIN_x)
          {
              
          }
      }

      GPIO_PIN_x是外部中断管脚

    • 您还可以看一下 朱辉老师的stm32嵌入式开发实战入门与提高课程中的 存储器与寄存器实例讲解小节, 巩固相关知识点
    • 以下回答来自chatgpt:

      回答:

      在使用STM32HAL库时,可以在中断服务函数中编写代码处理多个外设的中断,而不必使用中断回调函数来处理。具体操作可以按照以下步骤进行:

      1. 首先需要确定使用了哪些外设,并配置好它们的中断。
      2. 在中断服务函数中按照外设的优先级依次处理各个外设的中断,保证高优先级的外设先得到处理。
      3. 在处理一个外设的中断时,需要清除该外设的中断标志位,以便下一次中断能够被触发。可以使用HAL库提供的函数进行清除。
      4. 在编写中断服务函数时需要注意以下几点:

      5. 需要使用关键字“volatile”来声明相关的变量,确保它们不被编译器优化掉。

      6. 处理中断时需要尽快退出中断服务函数,以便其他中断能够及时得到处理。可以使用“return”语句来退出中断服务函数。
      7. 对于需要在中断服务函数中修改的变量,需要使用互斥锁或者原子操作来保证数据的一致性,防止出现数据竞争等问题。

      使用中断回调函数和在中断服务函数中编写代码处理的主要区别在于回调函数需要在外部进行定义,并在HAL库的相关函数中进行注册,而在中断服务函数中编写代码则更加灵活,并且能够更好地控制中断的处理过程。但是,在编写代码过程中需要格外注意避免出现数据竞争等问题。

      在使用多个外设时,需要注意以下几点:

      • 在配置和使用外设时需要考虑优先级和抢占关系,确保高优先级的外设先得到处理,避免产生数据竞争等问题。
      • 需要保证不同外设的中断处理程序之间不干扰,避免出现不可预期的错误。
      • 需要注意处理外设的错误中断,避免系统崩溃或者出现其他不可预期的问题。

      下面是一个使用两个串口和一个定时器的例子,在中断服务函数中编写代码处理多个外设的中断:

      #include "stm32f4xx_hal.h"
      
      UART_HandleTypeDef huart1;
      UART_HandleTypeDef huart2;
      TIM_HandleTypeDef htim3;
      
      void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
      {
          if (huart == &huart1) {
              // 处理USART1的中断
              // ...
              // 清除USART1中断标志位
              __HAL_UART_CLEAR_FLAG(&huart1, UART_CLEAR_CMF);
      
          } else if (huart == &huart2) {
              // 处理USART2的中断
              // ...
              // 清除USART2中断标志位
              __HAL_UART_CLEAR_FLAG(&huart2, UART_CLEAR_CMF);
          }
      }
      
      void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
      {
          if (htim == &htim3) {
              // 处理TIM3的中断
              // ...
              // 清除TIM3中断标志位
              __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);
          }
      }
      
      void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
      {
          // 处理串口错误中断
          // ...
          // 清除USART1和USART2中断标志位
          __HAL_UART_CLEAR_FLAG(&huart1, UART_CLEAR_CMF);
          __HAL_UART_CLEAR_FLAG(&huart2, UART_CLEAR_CMF);
      }
      
      void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim)
      {
          // 处理定时器错误中断
          // ...
          // 清除TIM3中断标志位
          __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);
      }
      
      void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
      {
          // 处理外部中断
          // ...
          // 清除GPIO中断标志位
          __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
      }
      
      int main(void)
      {
          // 初始化UART和TIM
          // ...
      
          while (1) {
              // 主循环
              // ...
          }
      }
      

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 6月7日

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿