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 (转每分钟) }
关键修改点:
- 参数类型从
&引用改成*指针,比如TIM_HandleTypeDef *htimer - 访问
PreviousCount的实际值时,用*PreviousCount解引用指针 - 调用HAL库函数时,直接传指针
htimer就行(因为__HAL_TIM_GET_COUNTER这类函数本来就要求传入定时器句柄的指针)
调用示例
外部调用这个函数时,需要传入变量的地址:
uint32_t prev_count = 0; float speed = computeMotorSpeed(&htim3, &prev_count);
内容的提问来源于stack exchange,提问作者امیرحسین محمد امری
相关产品推荐
相关产品推荐

