赞
踩
嵌入式开发难免遇到各种坑,总结一下之前遇到的各种坑~,持续更新中…
在使用STM32
时,芯片发热严重,很烫手,而且集中在芯片的某一块区域。但奇怪的是,程序可以正常运行。
分析与解决: 很有可能是某个引脚被击穿了导致的,建议换一块芯片。
在使用STM32
控制12V舵机(通过3S电池直接供电)运动,舵机出现抖动?可能原因是供电电压不足,低于12V就容易出现抖动。博主还遇到过,一旦舵机出现抖动,再利用文件系统打开文件时,SD卡会出错,直接导致STM32
卡住。
分析与解决: 提高供电电压。
STM32使用无线模块,例如蓝牙,RF200等,与上位机进行通讯,有时候数据可以顺利发送和接收,有时候无法传输数据,时好时坏。可能原因是供电不足。博主在3S锂电池上接了一个稳压模块7.4V给舵机供电,然后另一个稳压模块5V给STM板子供电(板子内置5-3V转压),然后使用无线模块就出现以上情况,将7.4V稳压模块撤了,通讯就正常了。 其次,对于RF200这种需要天线的模块,最好装上天线!
分析与解决: 检查供电是否正常,电池是否有电。
检点芯片的Boot0和Boot1是否连接正确。其次可能的是,如果通过USB给板子供电,同时该USB又是串口的通讯线,如果在打开串口【特指上位机串口:此情况是串口通讯用的有线连接】的情况下,进行代码下载,则会出现该情况。
分析与解决: 检点芯片的Boot0和Boot1;下载代码的时候关闭串口。
在STM32
开发中时,代码中的某个变量 突然自动变化,博主遇到过是一个结构体的一个变量数值自动改变(PS:
这个可以通过debug
分析出来)。
分析与解决: 可能是内存溢出的问题,即内部的代码复杂,定义的变量(尤其是静态变量过多),导致内存溢出;建议在使用该变量前重新赋值,或者减少静态变量的定义(推荐后一种)。
舵机没有按照期望的运动进行摆动(PS:
尽管舵机是一种位置伺服电机,但还是能用来做类似速度模式的运动),例如,设定舵机按照某个特定的幅值做正弦摆动,但是频率一高,舵机振幅很小,甚至不动。
分析与解决: 很有可能舵机的电流不足(可能使用了某个电流值较小的稳压模块给舵机供电),建议直接电池供电(与舵机电压匹配),或者使用电流值更大的稳压模块。
STM32
电路板突然不工作,LED
不亮。
分析与解决: 首先单独检查一下电源,是不是供电正常(一没注意,电池过放了);如果电池供电正常,就得排查电路板是不是烧了。
STM32
的ADC
采样值不对,而且基本稳定不变。
分析与解决: 首先,查看ADC的驱动代码有没有问题。其次,如果确认代码没有问题的话,检查芯片的参考地和参考电压VREF
( 注:有些STM32
芯片内部已经设置好了,不支持外部设置参考地和参考电压VREF
,主要是封装引脚少的芯片;有些只支持设置参考电压VREF
,例如STM32F407ZGT6
;有些均支持设置)。然后,看看待采样的电压和芯片的通道对应的引脚是否连接好了,是否硬件连接的引脚和代码中的使用的通道是对应的。最后,可能是芯片虚焊导致的(这个博主遇到过~),可以重新焊接一下,如果还是不行,建议直接更换板子。
使用SWD下载,同时连接了STlink,报错,原因是端口占用。
分析与解决: 将STlink拆了,尽管STlink没有连接到PC,同样会造成端口占用,也得拆了。
因为读取欧拉角的时间略微有点长,因此开始想着让这个放到临界区(freertos),能够保证IMU读取的是同一时刻的值,但是…但是,一旦这样做,那么在这段时间内就不会进行任务切换。恰好在这段时间内如果主动的发送上位机的信号,就有可能信号无法处理,导致信号接收不到,这就导致了通讯有时候不成功,有时候成功。
taskENTER_CRITICAL(); //进入临界区
mpu_dmp_get_data(&pitch,&roll,&yaw); //读取欧拉角
taskEXIT_CRITICAL(); //退出临界区
分析: 直接去掉临界区!!!
//taskENTER_CRITICAL(); //进入临界区
mpu_dmp_get_data(&pitch,&roll,&yaw); //读取欧拉角
//taskEXIT_CRITICAL(); //退出临界区
STM32程序下载成功后,板子卡死,尽管在keil里面设置了Reset and Run
。
分析与解决: 可能由于板子是通过USB用电脑供电,同时USB还是串口收发线,且上位机串口的端口已经打开。这时候只要在上位机中关闭串口即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。