在 STM32CubeIDE 中为 STM32F103C8(64KB 闪存,20KB RAM)创建新项目时,生成的链接脚本包含以下内容:
/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + (LENGTH(RAM) / 2); /* end of "RAM" Ram type memory */
_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
/* Memories definition */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 64K
}
这将栈(_estack)放置在 0x20005000 = 0x20000000 + 20KB 的位置。通过调试器查看(_estack - 1)处的内存时,无法读取该地址。因此,STM32 在启动时立即进入硬 fault(硬中断)。
实际上,最后一个可读取的地址是 0x200027ff,这表明该地址实际上是以字(而非字节)为单位的:0x20000000 + 10KB = 0x20002800。
将该行修改为_estack = ORIGIN(RAM) + (LENGTH(RAM) / 2); /* end of "RAM" Ram type memory */
将栈放置在 0x20002800 位置就能解决这个问题。
|
|