stm32编程心得体会

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


前言

记录了在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

猜你喜欢

转载自blog.csdn.net/cherish1211/article/details/125611992