STM32 疑难杂症&Tips

STM32疑难杂症&Tips

STM32上电发烫

上电发烫有几种原因:

  • 单片机烧坏
  • IO击穿
  • 外部电路短路
  • 配置错误引起的大电流
  • etc.

STM32可运行

STM32上电发热,但是STM32可用跑

  1. STM32配置错误
    • 当本应当是输入/输出的GPIO,被配置成输出/输入模式
    • GPIO口的输出模式与外部电路不匹配
  2. IO击穿
    • 此时IO一般无法运行,当单片机发热且IO口异常时需要更换单片机

STM32不可运行

换,必须换!同时检查外围电路

KEIL - > MicroLib - 调试可运行但常规运行无法运行

解决方案索引:

STM32程序不运行与MicroLIB讲解_The Road of Engineer的博客-CSDN博客

STM32半主机模式-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’…”。

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

  1. 删除编译生成的”_build“文件夹和文件夹中的所有内容。 非常重要,此步不做,无法解决该问题,建议解决过程当中
  2. 回到“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可能会将其替换成其他的宏定义,参数就不是我们期望的了

image-20240808165708252

示例:

image-20240808165848454

image-20240808165945402

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的中断个数

image-20250226101834986

82个中断个数,最靠近2^7 = 128,128*4 = 512 = 0x200,也就是需要对齐到0x200地址

posted @ 2025-05-07 11:22  c17VV  阅读(213)  评论(0)    收藏  举报