STM32 疑难杂症&Tips
STM32疑难杂症&Tips
STM32上电发烫
上电发烫有几种原因:
- 单片机烧坏
- IO击穿
- 外部电路短路
- 配置错误引起的大电流
- etc.
STM32可运行
STM32上电发热,但是STM32可用跑
- STM32配置错误
- 当本应当是输入/输出的GPIO,被配置成输出/输入模式
- GPIO口的输出模式与外部电路不匹配
- IO击穿
- 此时IO一般无法运行,当单片机发热且IO口异常时需要更换单片机
STM32不可运行
换,必须换!同时检查外围电路
KEIL - > MicroLib - 调试可运行但常规运行无法运行
解决方案索引:
STM32程序不运行与MicroLIB讲解_The Road of Engineer的博客-CSDN博客
一句话:C标准库的printf会调用半主机模式,半主机模式有利于程序员对设备进行调试,其使用内核支持的SVC指令,可以将debug输出(printf之类)直接由调试器/仿真器输出到电脑。但是半主机模式的支持需要完整的调试线(不是那种4线的SWD,完整的JIAT)
semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机 (douban.com)
2.1 硬件连接
ITM机制要求使用SWD方式接口,并需要连接SWO线,一般的四线SWD方式(VCC SDCLK,SDIO,GND)是不行的。标准的20针JTAG接口是可以的,只需要在MDK里设置使用SWD接口即可。Stuff About MicroLib
https://www.keil.com/arm/microlib.asp
使用MicroLIB,简化嵌入式开发操作,例如你用printf()函数的时候,就会从串口1输出字符串,当然也可以重定义到其他串口;
使用MicroLIB会优化代码空间,但会降低某些程序的执行效率(比如: memcpy()),效率换空间;
由于MicroLIB不支持浮点运算,所以在有FPU单元的MCU上,使用MicroLIB并开启FPU会让程序死机或跑飞。
Microlib不支持C++,在使用C++开发MCU时,首要条件是不能使用Microlib;
解决方案
取消使用MicroLib,改用CSTDLib,取消半主机模式,重定向fputc函数并定义_sys_exit函数
#ifndef ___CSTD_FIX_38221284JFJSI___ //防止重复包含
#define ___CSTD_FIX_38221284JFJSI___
#include "stdio.h"
#pragma import(__use_no_semihosting) //不使用半主机模式
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
// USART_SendData(USART1,ch); //可以自定义打印重定向的地址
// while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return ch;
}
#endif
KEIL -> 编译提示 Note: object file renamed from “xxx.o“ to “xxx_1.o“
解决方案:[【填坑指南】keil] 编译提示Note: object file renamed from “xxx.o“ to “xxx_1.o“-CSDN博客
现象: 在使用keil的时候,有时候会不小心在不同的group文件夹里添加了两个相同的.c文件,会导致编译出现如下的提示:
`Note: object file renamed from “xxx.o“ to “xxx_1.o“` 1此时,我们删除多余的.c文件也不能消除提示。
解决方法: 1. 删除多余的.c文件。 2. 在剩下的有效的xxx.c文件上点击右键。 3. 选择“Options for File ‘xxx.c’…”。

- 取消"include in Target Build"处的勾选,点击“OK”后,重新编译工程。

- 删除编译生成的”_build“文件夹和文件夹中的所有内容。 非常重要,此步不做,无法解决该问题,建议解决过程当中
- 回到“Options for File ‘xxx.c’…”,重新勾选上"include in Target Build",点击“OK”后,再次编译工程。
![]()
STM32 GCC MAKEFILE 编译相关
make编译输出Flash&RAW使用信息
Flash&RAW空间使用信息是在链接(LD)阶段进行的,所以修改的地方在链接相关处
需要在链接指令中添加 -Wl,--print-memory-usage 即可在链接阶段在控制台打印空间使用信息
# libraries
LIBS = -lc -lm -lnosys
LIBDIR =
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,--print-memory-usage -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
如何在makefile中添加静态库文件
LIBS 为需要添加库的名字 | 注意:添加库的名字不包含后缀名,且有一定的命名标准,如果打错了编译器会提示你的
一种示例
库的名字为 libarm_cortexM4lf_math.a
链接LIBS应该为
-l:libarm_cortexM4lf_math.a
LIBDIR 为需要添加库所在的文件夹
# libraries
LIBS = -lc -lm -lnosys -larm_cortexM4lf_math
LIBDIR = Middlewares/ST/ARM/DSP/Lib ../Ext_Common/IQmath/gcc-cm4f/
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
STM32CubeMX 非常量的参数配置(1599写成1600-1)
在STM32CubeMX中,如果参数写成一个表达式,CubeMX可能会将其替换成其他的宏定义,参数就不是我们期望的了
示例:


Flash烧写地址对齐
中断向量表需要内存地址对齐
https://blog.csdn.net/limubai__/article/details/127865063
https://cloud.tencent.com/developer/article/1669333
需要对齐的2的整数次幂,如果内核支持245个中断向量,则对齐到256个,256*4Byte,也就是需要对齐到0x400
程序的烧写在Flash中的地址需要注意中断向量表的位置,中断向量表在程序的开头
如果中断向量表出现问题,则会进入NMI(NonMaskableInt)中断
F4的中断个数
82个中断个数,最靠近2^7 = 128,128*4 = 512 = 0x200,也就是需要对齐到0x200地址




浙公网安备 33010602011771号