有趣的灵魂KAKA 2024-05-06 18:03 采纳率: 50%
浏览 17
已结题

单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数

单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数,单片机用的是STM32F407,高级定时器TIM1,初始化是在CubeMX中配置好的,然后根据网上说的,在主函数中加入了 HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_1);HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);但还是进入不了中断。

  • 写回答

15条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-06 18:03
    关注

    引自免费微信小程序:皆我百晓生

    遇到HAL_TIM_PWM_PulseFinishedCallback回调函数不触发的问题,我们可以一步步排查可能的原因。首先确保以下几个关键点都已正确设置:

    1. 定时器配置:在STM32CubeMX中,确认TIM1已被正确配置为高级定时器,并且PWM模式已开启。特别是对于通道1(TIM_CHANNEL_1),确保它被设置为输出PWM,并且选择了"Update and DMA interrupt"(如果可用)或者至少"Update interrupt"。

    2. 中断使能:除了您提到的HAL_TIM_PWM_Start_ITHAL_TIM_Enable_IT,还需要确保在HAL_TIM_Base_InitHAL_TIM_Init之后调用了这些函数。正确的中断使能代码应该是:

      HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1); // 启动通道1的PWM并启用中断
      HAL_TIM_Enable_IT(&htim1, TIM_IT_CC1);       // 使能比较匹配通道1中断,对于PWM完成中断是必要的
      

      注意,这里使用了TIM_IT_CC1而不是TIM_IT_UPDATE,因为我们要监听的是PWM脉冲完成的中断,即比较匹配中断。

    3. 中断服务函数:确保在您的项目中有正确的中断服务函数(ISR)原型,并且该函数中调用了HAL_TIM_IRQHandler来处理中断。通常,CubeMX会自动生成这部分代码,但检查总是好的。中断服务函数看起来应该像这样:

      void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)
      {
          /* USER CODE BEGIN TIM1_IRQn 0 */
      
          /* USER CODE END TIM1_IRQn 0 */
          HAL_TIM_IRQHandler(htim); // 调用HAL库的中断处理函数
          /* USER CODE BEGIN TIM1_IRQn 1 */
      
          /* USER CODE END TIM1_IRQn 1 */
      }
      

      并且确保在中断向量表中此ISR被正确配置。

    4. NVIC设置:在HAL_Init()SystemClock_Config()之后,确保已经正确开启了TIM1相关的中断在NVIC中,类似这样:

      HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); // 或者可能是TIM1_UP_IRQn,具体取决于使用的中断
      
    5. 回调函数注册:虽然CubeMX一般会自动处理,但确认一下HAL_TIM_PWM_ConfigChannel函数中是否正确指定了你的HAL_TIM_PWM_PulseFinishedCallback回调函数。如果是手动配置,确保有如下代码:

      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, YourDesiredPulseValue); // 设置初始脉冲值
      htim1.Instance->CCR1 = YourDesiredPulseValue; // 如果上面一行不起作用,尝试直接设置寄存器
      htim1.PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; // 注册回调
      
    6. 回调函数实现:确保你的HAL_TIM_PWM_PulseFinishedCallback函数已正确定义并且有实际内容,哪怕是简单的调试信息输出,比如:

      void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
      {
          if (htim->Instance == TIM1) // 确认是TIM1的中断
          {
              // 你的处理逻辑
              __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, NewPulseValue); // 可以在这里改变下一个PWM脉冲的宽度
              // 和/或
              // HAL_GPIO_TogglePin(LED_Pin, LED_GPIO_Port); // 用于简单验证中断是否工作
              // printf("PWM Pulse Finished Callback Called!\n"); // 如果支持printf到串口
          }
      }
      
    7. 硬件检查:最后,确认没有硬件上的问题,比如时钟源选择正确、引脚配置无误等。

    如果以上所有步骤都确认无误,仍然无法进入回调函数,可能需要借助示波器检查定时器输出信号,同时使用调试器检查中断标志位及中断相关寄存器的状态,看看是否有其他未知因素阻止了中断的正常触发。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(14条)

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 已采纳回答 5月7日
  • 赞助了问题酬金15元 5月6日
  • 创建了问题 5月6日

悬赏问题

  • ¥15 统计大规模图中的完全子图问题
  • ¥15 使用LM2596制作降压电路,一个能运行,一个不能
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路
  • ¥15 经gamit解算的cors站数据再经globk网平差得到的坐标做形变分析
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式