You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F103C8T6用PWM调整TIM ARR驱动步进电机中断设参失效问题

STM32 PWM中断中修改ARR寄存器不生效解决方案

首先确认基础前提:你提供的代码片段中TIM2->ARR=result;和TIM2->CCR1=result / 2;两行处于注释状态,首先确认实际烧录运行的代码中这两行是取消注释的,这是功能生效的基础。

排除上述基础问题后,按以下顺序排查解决:

  • TIM自动重装载预装载配置问题
    如果TIM2初始化时开启了自动重装载预装载(CR1寄存器ARPE位置1),写入ARR寄存器的值不会立刻生效,要等到下一次更新事件才会加载到影子寄存器发挥作用,在脉冲完成回调中修改就会出现延迟或看似不生效的情况。
    两种修复方案:
    1. 初始化TIM时关闭预装载:将TIM初始化结构体的AutoReloadPreload参数设置为TIM_AUTORELOAD_PRELOAD_DISABLE,写入ARR的值会立刻生效
    2. 保留预装载的情况下,修改完ARR后手动触发更新事件:
    TIM2->ARR = result;
    TIM2->CCR1 = result / 2;
    SET_BIT(TIM2->EGR, TIM_EGR_UG); // 手动触发更新,立刻加载新的ARR值
    
  • 写入值非法问题
    你使用的PowerTLine是float数组,强制转int时可能出现边界异常:
    1. ARR值不能为0,否则定时器会停止计数
    2. 如果TIM2是16位定时器,ARR最大值不能超过65535,超出会溢出导致写入值异常
      加入边界校验即可:
    int result = (int)PowerTLine[accelerate_len];
    result = result < 1 ? 1 : result;
    result = result > 65535 ? 65535 : result; // 32位TIM2可删除这行
    
  • 中断执行异常问题
    确认TIM2的中断优先级配置合理,没有被更高优先级的中断长时间抢占,导致回调函数中的寄存器修改逻辑没有按预期执行。
  • 调试验证方法
    修改完ARR后新增打印代码,读取TIM2->ARR的实际值输出,确认寄存器是否写入成功,快速区分是写入失败还是生效机制问题:
    TIM2->ARR = result;
    printf("actual ARR value: %d\r\n", TIM2->ARR);
    

内容的提问来源于stack exchange,提问作者Matrix Ko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:06:04