STM32将外部SDRAM空间作为系统堆(Heap)空间

概述

stm32可以外扩很大的sram,常见外部sram的初始化函数一般是c语言写的,默认写在main函数里面。stm32初始化首先进入汇编代码startup_stm32f429xx.s,在汇编代码中Reset_Handler(复位中断服务程序)里面先调用了SystemInit,然后调用__main进行堆栈的初始化,最后才会跳转到用户main函数。调用SystemInit涉及到局部变量和函数调用,需要用到stack栈空间,如果我们简单的将系统堆栈配置到外部sram,执行SystemInit时外部sram还没有初始化,运行到这里程序就会进入hardfault卡死。
为了解决这个问题,首先可以将外部sram的初始化函数提前,放到SystemInit函数中调用,cube生成的stm32代码已经为我们提供了这样的接口,这样__main就可以正确运行,然而这还没有解决SystemInit本身执行的问题,我们需要保证SystemInit执行时使用STM32内部RAM。

具体步骤

(1).修改启动代码堆栈指针
在startup_stm32f429xx.s中,找到 __initial_sp这一行,改为如下内容
在这里插入图片描述
注意这里0x20000400 =内部主内存地址0x20000000+栈大小0x400,也就是说这个地址和Stack_Size有关,需要根据自己Stack_Size的设置来修改,这样就强制指定了系统初始化的栈顶指针在内部内存,保证进入main函数之前的其它初始化函数调用堆栈正常使用。

(2).修改启动代码中堆的空间大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值