STM32F103C8T6用PWM调整TIM ARR驱动步进电机中断设参失效问题
STM32 PWM中断中修改ARR寄存器不生效解决方案
首先确认基础前提:你提供的代码片段中TIM2->ARR=result;和TIM2->CCR1=result / 2;两行处于注释状态,首先确认实际烧录运行的代码中这两行是取消注释的,这是功能生效的基础。
排除上述基础问题后,按以下顺序排查解决:
- TIM自动重装载预装载配置问题
如果TIM2初始化时开启了自动重装载预装载(CR1寄存器ARPE位置1),写入ARR寄存器的值不会立刻生效,要等到下一次更新事件才会加载到影子寄存器发挥作用,在脉冲完成回调中修改就会出现延迟或看似不生效的情况。
两种修复方案:- 初始化TIM时关闭预装载:将TIM初始化结构体的
AutoReloadPreload参数设置为TIM_AUTORELOAD_PRELOAD_DISABLE,写入ARR的值会立刻生效 - 保留预装载的情况下,修改完ARR后手动触发更新事件:
TIM2->ARR = result; TIM2->CCR1 = result / 2; SET_BIT(TIM2->EGR, TIM_EGR_UG); // 手动触发更新,立刻加载新的ARR值 - 初始化TIM时关闭预装载:将TIM初始化结构体的
- 写入值非法问题
你使用的PowerTLine是float数组,强制转int时可能出现边界异常:- ARR值不能为0,否则定时器会停止计数
- 如果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
相关产品推荐
相关产品推荐

