1.st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL

方法1:首先检查SWIO,SCLK,GND,VCC,RST这五根线是否都接了,有些情况把RST接上就好了,还有我是用的国信长天G431开发板,VCC应该接在开发板的5V引脚,另一边接在stlink的3.3v引脚,当时接的5v,stlink上的灯就熄灭了,改为3.3v这次的问题就解决了。

剩下的方法是在网上看到的解决他人的问题的方法

方法2:按住开发板RST引脚,电机IDE下载图标,松手,完成下载,下次就不会出现Error了。

方法3:将Keil中Debug->Setting->Reset 由normal改为pre-reset;

st-link下载STM32程序出现Flash download faild -m3

方法:查看是不是芯片信号选错了,比如用的是C8T6,但KEIL中选择的是ZET6,这样Debug-Setting中选择的就是high-density高容量,就烧录错误,改为C8T6,C/C++那里定义STM32F10X_MD,而不是HD,

Med-density中等容量而不是高容量。

2.编译使用CubeMX生成的代码时报错

Error: L6218E: Undefined symbol HAL_PWREx_DisableUCPDDeadBattery (referred from stm32g4xx_hal_msp.o).
解决方法:将HAL_PWREx_DisableUCPDDeadBattery改为HAL_PWREx_DisableUSBDeadBatteryPD

3.main.c中有个变量另一个X.c文件也想访问,变量的定义问题:

1.在main.h头文件中声明一个变量 extern uint8_t str[21];(不是定义,而是声明)
2.main.c及X.c文件都Include “main.h”
3.随便一个函数中定义这个变量:uint8_t str[21]=“123”(这样的才是定义)
4.这样就都可以访问了,直接在h文件中定义会提示在两个c文件中重复定义。

4.使用ADC测量电压值时:

使用的全局变量来接收,uint8_t Voltage 回调函数中使用uint32_t temp=HAL_ADC_GetValue(hadc1);导致Voltage值太小了,一步步排查最后发现时变量为8位的装不下!!!--2022.03.29备赛蓝桥嵌入式

5.使用STM32MP157时stlink 连接不了:

更改Port为JTAG或者SW,下面Connect为Normal或者under_reset,Pack部分enable打勾。只要切换这些操作过程中Serial序列号变了,那就保存退出开始烧写

stm32cubeMX生成STM32F1代码无法STlink下载_stm32

6.volatile关键字作用



volatile 表示强制编译器减少优化,告诉编译器必须每次去内存中取变量值。


程序运行时数据是存储在主内存(物理内存)中的,每个线程先从主内存拷贝变量到对应


的寄存器中。对没有加 volatile 的变量进行读写时,为了提高读取速度,编译器进行优化时,会


先把主内存中的变量读取到一个寄存器中,以后,再读取此变量的值时,就直接从该寄存器中


读取,而不是直接从内存中读取了,这样的读写速度比较快。如果其它程序改变了内存中变量


的值,上面已经保存到寄存器中的值不会跟着改变,从而造成应用程序读取的值和实际的变量


值不一致。加了 volatile 以后的变量,表示不想被编译器优化掉,每次都要从内存中读取该变量


的数据,不会用寄存器里的值,这样确保了数据的准确性,但影响了效率。


8.使用cubemx生成用于mp157的程序时,引脚需要指定给A7还是M4:

stm32cubeMX生成STM32F1代码无法STlink下载_arm_02

9.点击debug 出现flash download fail m4:

stm32cubeMX生成STM32F1代码无法STlink下载_arm_03

stm32cubeMX生成STM32F1代码无法STlink下载_stm32_04

stm32cubeMX生成STM32F1代码无法STlink下载_stm32_05

Debug中右边AP处填写2

debug中取消打勾Enable

stm32cubeMX生成STM32F1代码无法STlink下载_引脚_06

取消打勾Update Target before Debugging 因为MP157的M4中没有flash,不能下载程序进去

stm32cubeMX生成STM32F1代码无法STlink下载_arm_07

10.error: #268: declaration may not appear after executable statement in block

解决:勾选c99 Mode

stm32cubeMX生成STM32F1代码无法STlink下载_arm_08

11,报错与arm-version有关的:

解决:Code Generation中arm compiler由版本6改为5.

stm32cubeMX生成STM32F1代码无法STlink下载_单片机_09

12.代码中有printf打印字符串,导致程序不能运行

解决:程序不能运行时,尝试找出问题:keil中打断点,如果能正常运行至断点,则程序能运行,如果debug时运行至BRKT表示程序出错

有些源程序将printf函数重定向为串口打印,此时没有正确设置则无法运行,并且部分程序

使用#define Debug(__info,...)  printf("Debug : " __info,##__VA_ARGS_)也会调用printf,所以删除printf部分或者设置串口重定向

13.在ioc(stm32cubemx生成的文件)所在的文件夹中,自己新建的文件夹名字若为Middlewares则在下次生成代码时会被删除