stm32 将系统堆栈放置在外部内存,避免 SystemInit 前外部 SRAM 未初始化导致 HardFault

张开发
2026/4/20 19:42:12 15 分钟阅读

分享文章

stm32 将系统堆栈放置在外部内存,避免 SystemInit 前外部 SRAM 未初始化导致 HardFault
背景内容stm32可以外扩很大的sram,常见外部sram的初始化函数一般是c语言写的,默认写在main函数里面。stm32初始化首先进入汇编代码startup_stm32f407xx.s,在汇编代码中Reset_Handler(复位中断服务程序)里面先调用了SystemInit,然后调用__main进行堆栈的初始化,最后才会跳转到用户main函数。调用SystemInit涉及到局部变量和函数调用,需要用到stack栈空间,如果我们简单的将系统堆栈配置到外部sram,执行SystemInit时外部sram还没有初始化,运行到这里程序就会进入hardfault卡死。为了解决这个问题,首先可以将外部sram的初始化函数提前,放到SystemInit函数中调用,cube生成的stm32代码已经为我们提供了这样的接口,这样__main就可以正确运行,然而这还没有解决SystemInit本身执行的问题,我们需要保证SystemInit执行时使用STM32内部RAM。具体步骤:1、修改启动代码堆栈指针在startup_stm32fxxxxx.s中,找到 __initial_sp这一行,改为如下内容Stack_Size EQU0x2000AREA STACK,NOINIT,READWRITE,ALIGN=3Stack_Mem SPACE Stack_Size __initial_sp

更多文章