STM32G431RB定时器寄存器PWM脉宽测量返回随机值问题
问题:STM32G431RB捕获PWM脉宽时Difference变量返回随机值
我正在STM32G431RB上测量接收机输出PWM信号的脉宽,已确认输入PWM信号正常,捕获回调中断可正常触发,但计算脉宽的Difference(uint32_T类型)变量始终为随机数。相关回调代码如下:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){ if (htim -> Instance == TIM2 && htim -> Channel == HAL_TIM_ACTIVE_CHANNEL_1 && state == 0) { IC_Val1 = TIM2 -> CNT; __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); state = 1; } if(htim -> Instance == TIM2 && htim -> Channel == HAL_TIM_ACTIVE_CHANNEL_1 && state == 1){ IC_CH1 == TIM2 -> CNT; if (IC_Val1 > IC_CH1){ Difference = IC_Val1 - IC_CH1; } else { Difference = (0xffffffff - IC_CH1) + IC_Val1; } __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); state = 0; } }
问题定位与修复
- 核心错误:代码中
IC_CH1 == TIM2 -> CNT使用了比较运算符,而非赋值运算符,导致IC_CH1始终是未初始化的随机值,最终计算出的Difference自然也是随机数。 - 修复方法:将
==改为=,正确捕获下降沿时的计数器值:IC_CH1 = TIM2 -> CNT;
额外优化建议
- 确保
IC_Val1、IC_CH1、state、Difference是全局变量或使用static修饰,避免函数栈上的局部变量被覆盖。 - 可以使用HAL库提供的捕获寄存器读取宏
__HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1)替代直接操作TIM2->CNT,代码更具可读性和兼容性。 - 若定时器存在溢出情况,可启用定时器更新中断,结合溢出计数来更准确计算脉宽,避免仅靠单次计数器值计算的误差。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

