stm32编程心得体会

文章主要讨论了在STM32开发过程中遇到的错误和警告,如.c文件的重定义问题,解决方法是避免在头文件中定义变量和函数。另外,解释了HAL_Delay不能在中断服务函数中使用的原因,并提到了高速设备和低速任务间的同步问题。还提醒了注意头文件引用顺序以及处理重复定义的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

记录了在STM32写代码出现的问题和解决办法

报错警告

1:显示两个.c文件重定义。

比如在main.c和PID.函数重定义

原因是:PID.h里定义了变量、函数,而在mian.c和PID.c里都引用了PID.h、导致变量,函数重定义

解决方法:不在PID.h里定义变量、函数,而在PID.c里定义变量、函数然后在main.c里extern(注意extern只是声明作用,此时修饰的变量不能赋值,比如extern int P=100,这样就会报错,应该extern int P)

2:…/Core/Src/main.c(67): error: #147: declaration is incompatible with “User_Order *p_order” (declared at line 66)

./Core/Src/main.c(68): error: #77-D: this declaration has no storage class or type specifier

解决方法

p_order=&Order;//指向结构体类型的变量地址赋给结构体指针
p_order->KV=0.3;

将以上代码放在main函数里,不要放在main之前

STM32

stm32f1 HAL库中不能把HAL_Delay放在中断服务函数或者中断回调函数

原因:因为HAL库的Delay函数本质上也是用的SysTick定时器更新中断。更新中断就是SysTick计数到0后产生的中断。而中断是有优先级的,所以会阻塞其他中断函数,要慎用!!!

对于HAL_Delay函数解读

在这里插入图片描述
首先先说下里面的HAL——HAL_GetTick()
在这里插入图片描述
这里注意返回值uwTick,我们点看查看uwTick后
在这里插入图片描述
这里uwTickFreq是1(KH)也就是1ms的意思
这样就实现了每次定时器中断一次就会加一,而SyTick定时器默认1ms中断一次。

Delay就是形参,把我们输入的实参传给此函数。

tickstart=HAL_GetTick()把当前的定时器值赋给tickstart
后面if判断中,HAL_MAX_DELAY为0xFFFFFFFF(无符号整数型U)
判断wait小于它时自加一
自加1的原因看后面
while循环中,可以看到wait前是<而不是<=
while循环的目的就是等SysTick中断次数到我们输入的延时ms长度时,退出

高速设备和低速任务之间速度不匹配的问题

一般while()运行速度比串口中断要快,所以在while和串口的同一个变量可能会出现数据运算不正确的情况(遇到之后体会),这时候最后的办法就是都放在串口里解析运算,或者是对同一个变量进行不同的命名。

注意函数编写和.h的引用顺序

  1. 在include 头文件时是有先后顺序的,不然顺序不正确会显示:error in include chain()
    解决方法就是调换include的顺序
  2. 函数编写顺序错误,则结果必然不如人意

显示重复定义 (xxx.h) to (xxx.h)

比如POWER ENERAGE\POWER ENERAGE.axf: Error: L6200E: Symbol SBUS multiply defined (by sbus.o and main.o).
原因一:两个.h文件有重复定义的地方
解决办法一:把其中一个的定义函数(这里的例子是SBUS前加)前加:extern (注意加exern的变量只能作为声明不能赋值,赋值操作应该放在.c源文件中)

原因二 :两个.h文件相互引用。比如a.c文件包含b.h。b.c包含a.h,而a.c想引用b的变量
解决方法二:在b.c文件里定义变量而不是在b.h文件声明。然后再在a.c文件里外部声明此变量。

…/Core/Src/main.c(50): warning: #1295-D: Deprecated declaration MPU6050_Print - give arg types

在头文件中声明了一个无参数的函数,并且没有返回值,出现warning
解决放方法 :在对应函数()内加void

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会变身的火娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值