[STM32F4] 输入捕获在溢出条件下的问题

[复制链接]
49|11
小库里 发表于 2026-4-20 01:33 | 显示全部楼层 |阅读模式
我用 STM32 通过波形发生器测量频率。开发板:STM32F401RE Nucleo。
在下溢条件下功能正常。
当前参数:参考时钟 25MHz,计数器自动重装载值 65535。因此可测量的最低频率为 382Hz,低于 381Hz 时无法正常工作。
代码中配置的溢出判断逻辑没有生效。
以下是我的参考代码:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim1)
{
  if (! is_capture_done)
  {
    if (count == 1)
    {
      input_captures[0] = __HAL_TIM_GET_COMPARE(htim1, TIM_CHANNEL_1);
      count=0;
    }
    else
    {
      input_captures[1] = __HAL_TIM_GET_COMPARE(htim1, TIM_CHANNEL_1);
      count = 1;
      is_capture_done = 1;
    }
  }
}

主函数的操作如下
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          if(is_capture_done == 1)
                          {
                                    if (input_captures[1] > input_captures[0])
                                    {
                                          capture_difference = input_captures[1] - input_captures[0];
                                    }
                                    else if (input_captures[1] < input_captures[0])
                                    {
                                          capture_difference = ((0XFFFF - input_captures[0]) + input_captures[1]) + 1;
                                    }
                                    // calculate the frequency by capture difference
                                    float refClock = (HAL_RCC_GetPCLK2Freq());
                                    timer2_cnt_freq = refClock / capture_difference;
                                    printf("%lf\n",timer2_cnt_freq);
                                    is_capture_done = 0;
                                    HAL_Delay(1000);
                          }
  }


我想问的是:else if 部分能处理溢出条件吗?如果不能,那我该怎么处理?
还有,这个控制器能处理的最低频率是多少?


公羊子丹 发表于 2026-4-20 08:08 | 显示全部楼层
你这段代码里的溢出处理逻辑我感觉有点问题,单纯靠两次捕获值大小判断不太靠谱,最好在中断里加个定时器溢出标志位判断,这样低频率才稳。
周半梅 发表于 2026-4-20 08:11 | 显示全部楼层
我之前用F4测低频也踩过坑,你这个最低频率计算看着没问题,但溢出没生效大概率是没开溢出中断,你检查下定时器配置里的中断使能了吗?
帛灿灿 发表于 2026-4-20 08:12 | 显示全部楼层
兄弟你这代码只在回调里判了两次捕获差值,没读溢出标志,低频肯定会乱啊,建议把TIM的更新中断打开,在回调里结合标志位处理。
童雨竹 发表于 2026-4-20 08:13 | 显示全部楼层
挺好奇你定时器分频系数设的多少,25MHz直接跑的话计数太快了,低频本来就难测,你试试先把分频调大再测最低频率看看。
万图 发表于 2026-4-20 08:14 | 显示全部楼层
我怀疑你__HAL_TIM_GET_COMPARE读的时机不对,加上溢出中断后,要先清标志再算周期,不然数据会被覆盖,低频就测不出来。
Wordsworth 发表于 2026-4-20 08:16 | 显示全部楼层
这问题挺常见的,F4输入捕获测低频必须处理溢出,你现在else if那段只能算偶然对上,不能稳定工作,乖乖加溢出中断判断才是正解。
Bblythe 发表于 2026-4-20 08:17 | 显示全部楼层
你有没有试过把自动重装载值改小一点测试?先验证溢出逻辑好不好使,再调回65535测最低频率,这样排查更快。
Pulitzer 发表于 2026-4-20 08:19 | 显示全部楼层
我之前做频率测量都是捕获+溢出计数结合,你只靠两次捕获判溢出,频率一低就超出计数范围,肯定不生效啊。
Uriah 发表于 2026-4-20 08:20 | 显示全部楼层
想问下你定时器通道是用的双边沿捕获吗?如果配置不对,捕获触发都有问题,更别说溢出处理了,先核对下捕获模式配置。
Clyde011 发表于 2026-4-20 08:21 | 显示全部楼层
你当前算的最低382Hz理论是对的,但溢出逻辑不生效就测不到,建议先单独写个溢出中断测试程序,确认中断能正常触发再整合。
小夏天的大西瓜 发表于 2026-4-20 08:43 | 显示全部楼层
代码只在回调里判了两次捕获差值,没读溢出标志,低频肯定会乱
您需要登录后才可以回帖 登录 | 注册

本版积分规则

218

主题

219

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0