STM32 编译后不能运行的几个原因


一、编译和链接都可以通过,但uVision MDK不能全速运行,一运行就停止了,原因在于Option->Target->Code Generation->Use MicroLIB 复选框没有打钩,一般来说,针对一运行就停止的情况,将Use MicroLIB勾选之后,重新编译,运行就可以通过了。

STM32 编译后不能运行的几个原因_第1张图片

二、仿真调试时没有问题,但通过JLink调试时出现如下提示:

"Flash Download Failed-"Cortex-M3" ,则可能的原因是:Option->Debug->Use Driver for Flash Programming->Setting->Flash Download->Programming Algotithm 或 Option->Utilities->Use Driver for Flash Programming->Setting->Flash Download->Programming Algotithm没有添加相应类型的芯片FLASH说明,一般在这两个选项卡中分别点击ADD,添加STM32F10x High-density Flash 即可。

STM32 编译后不能运行的几个原因_第2张图片

STM32 编译后不能运行的几个原因_第3张图片

STM32 编译后不能运行的几个原因_第4张图片
三、调试时,程序总是停止在LDR     R0, =SystemInit 语句,原因如下:堆栈空间默认的太小

默认startup_stm32f10x_hd.s中 Stack_Size      EQU     0x00000400,如果改大之后,可能调试就可以正常运行。

四、调试时,程序停止在HardFault_Handler的问题(引用网上的总结)

    最近调试UCGUI和UCOSII,程序莫名其妙的死掉了,用JLINK调试,发现进入了HardFault_Handler,主要

原因有两个,堆栈溢出和数组越界,很不幸的是这两种情况都被我碰到了。
    第一次是用UCGUI在一个button上显示文字,发现字符串显示不全,只显示第一个字符,在启动文件

startup_stm32f10x_md.s中修改“Stack_Size      EQU     0x00000200”,将堆栈改大点,改为

“Stack_Size EQU     0x00000400”后显示正常。
    第二次是UCGUI和UCOSII联合调试时,也进入了HardFault_Handler,这次原因是数组越界,在一个函数中

定义了一个数组ya[10],定义了一个计数变量count,由于没有初始化count,导致count的值一开始就大于数

组边界,导致数组越界,初始化count=0后,程序正常。

我在调试的过程中,定义了两个结构体的指针变量,然后对这两个指针变量赋值,在执行第一个赋值语句的时候,程序停止在HardFault_Handler,最后的解决办法是将结构体的指针变量改为普通变量,赋值过程不再出现意外。

 

你可能感兴趣的:(STM32)