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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:15:09