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

STM32开发:C语言函数传引用编译报错原因咨询

为什么STM32 C语言函数用引用传递参数会编译报错?

你遇到的编译错误本质原因很明确:C语言不支持引用传递,你写的TIM_HandleTypeDef &htimer这种带&的引用语法是C++独有的特性,C标准里根本没有这个概念,所以C编译器会把&判定为非法语法,报出expected ';', ',' or ')' before '&' token。

你改用值传递的版本能编译,是因为值传递是C语言原生支持的参数传递方式,但这个版本有致命问题:你在函数里修改PreviousCount时,只是修改了函数内部的局部副本,外部的变量不会被更新——这会导致你的转速计算逻辑完全失效,因为下一次调用函数时,PreviousCount还是旧的计数值。

正确的C语言写法(用指针代替引用)

要实现类似引用的“修改外部变量”效果,C语言里必须用指针:

float computeMotorSpeed(TIM_HandleTypeDef *htimer, uint32_t *PreviousCount ) {
    int32_t DiffCount = 0;
    uint32_t CurrentCount = 0;
    CurrentCount = __HAL_TIM_GET_COUNTER(htimer); /* 从之前的计数值评估定时器计数器的增量 */

    if (__HAL_TIM_IS_TIM_COUNTING_DOWN(htimer)) {
        /* 检查计数器下溢 */
        if (CurrentCount <= *PreviousCount) {
            DiffCount = CurrentCount - *PreviousCount;
        }
        else {
            DiffCount = -((TIM3_ARR_VALUE+1) - CurrentCount) - *PreviousCount;
        }
    }
    else {
        /* 检查计数器溢出 */
        if (CurrentCount >= *PreviousCount) {
            DiffCount = CurrentCount - *PreviousCount;
        }
        else {
            DiffCount = ((TIM3_ARR_VALUE+1) - *PreviousCount) + CurrentCount;
        }
    }

    *PreviousCount = CurrentCount;
    return (float)DiffCount * 60 / (TS * TIM3_ARR_VALUE); // rpm (转每分钟)
}

关键修改点:

  1. 参数类型从&引用改成*指针,比如TIM_HandleTypeDef *htimer
  2. 访问PreviousCount的实际值时,用*PreviousCount解引用指针
  3. 调用HAL库函数时,直接传指针htimer就行(因为__HAL_TIM_GET_COUNTER这类函数本来就要求传入定时器句柄的指针)

调用示例

外部调用这个函数时,需要传入变量的地址:

uint32_t prev_count = 0;
float speed = computeMotorSpeed(&htim3, &prev_count);

内容的提问来源于stack exchange,提问作者امیرحسین محمد امری

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:07:37