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).修改启动代码中堆的空间大小
在这里插入图片描述
注意这里的0x02000000的大小为32M,因为这里我们采用的SDRAM的芯片大小是32M,将此32M的空间全部用作堆(Heap)空间,也可以只用SDRAM芯片的一部分空间作为堆空间。

(3).添加宏定义使能DATA_IN_ExtSDRAM
在Keil软件中的option,c/c++选项卡 define后面添加 DATA_IN_ExtSDRAM
在这里插入图片描述
(4).修改外部内存初始化代码

假定外部内存初始化函数为SDRAM_Init(),修改system_stm32f4xx.c文件
找到如下内容,英文说明这个函数将在跳转到main之前执行,可以让外部内存被系统当做程序数据内存使用,包括堆栈,这就是关键了,接下来修改SystemInit_ExtMemCtl(void)函数,直接注释掉里面的所有内容,改为如下内容
在这里插入图片描述
SystemInit_ExtMemCtl()函数是被SystemInit函数调用的,这样执行完SystemInit后,再进入__main就可以初始化配置在外部内存的堆栈了。
在这里插入图片描述
(5).配置和使用外部内存空间

方式1
如果让mdk自动分配内存,则打开option,target选项卡,右下角 read/write memory areas 添加内存块,勾选RAM1,填入外部内存起始地址和大小即可
在这里插入图片描述
方式2
修改自定义的sct文件,添加如下字段,即可将系统堆(Heap),系统堆通过malloc函数申请容量,以及通过attribute标记为EXRAM的数据都放在外部内存
在这里插入图片描述
(6).编写测试代码查看申请系统堆的地址

cp = (char *)malloc(sizeof(char)*n);
memset(cp,0x36,sizeof(char)*n);
printf("\r\ncp_Addr=0x%x",cp);

查询申请的堆空间的地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362905.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python机器学习】自动化特征选择——迭代特征选择

在单变量测试中,没有使用模型;在基于模型的选择中,使用单个模型来选择特征。而在迭代特征选择中,将会构造一系列模型,每个模型都使用不同数量的特征。有两种基本方法: 1、开始时没有特征,然后逐…

Django使用

一、安装Django 可以在创建好的虚拟环境中下载包 pip install Django3.2.20 -i https://pypi.tuna.tsinghua.edu.cn/simple 查看对应的下载好的内容 1、在Lib的site-packages第三方包里:这就是django框架源码 2、在scripts中有个 这是个工具,帮助创建d…

Java nio 的线程通信机制线程通信Pipe

Java的Pipe是一种新的线程通信机制,传统的线程通信可以是通过共享内存的方式,socket等方式,而Pipe是通过Java NIO 通信的方式实现共享内存,优点类似于go语言的管道 先上代码 public static void main(String[] args) throws IOEx…

Java网络编程(JavaWeb的基础)

Java网络编程(JavaWeb的基础) 文章目录 Java网络编程(JavaWeb的基础)前言一、网络编程概述1.1 软件架构&网络基础1.2 网络通信要素:IP/端口/通信协议1.3 传输层协议:tcp/udp 二、网络编程API2.1 InetAddress类2.2 Socket类&am…

DELL:利用大语言模型(LLM)生成评论与解释,革新虚假信息检测

ACL 2024 DELL: Generating Reactions and Explanations for LLM-Based Misinformation Detection https://arxiv.org/abs/2402.10426https://arxiv.org/abs/2402.10426 1.概述 大型语言模型(LLM)虽在诸多领域显示出色性能,但在直接应用于新闻真实性鉴别时,面临两大核心挑…

uboot基本使用网络命令和从服务器端下载linux内核启动

网络命令ip地址设置: setenv gmac_debug 0; setenv mdio_intf rgmii; setenv bootdelay 1; setenv ethaddr 00:xxxx:81:70; // mac地址 setenv ipaddr xxx; //开发板 IP 地址 setenv netmask 255.255.255.0; setenv gatewayip xxx.1; setenv serverip xxxx; //服…

潮玩手办盲盒前端项目模版的技术探索与应用案例

一、引言 在数字化时代,随着消费者对个性化和艺术化产品的需求日益增长,潮玩手办和盲盒市场逐渐崭露头角。为了满足这一市场需求,前端技术团队需要构建一个功能丰富、用户友好的在线平台。本文旨在探讨潮玩手办盲盒前端项目模版的技术实现&a…

图像处理Python库--图片裁剪、缩放、灰度图、圆角等

图像处理Python库 py-img-processor1. 安装2. 使用(Usage)2.1 运行配置2.2 图像处理处理函数图像处理参数为字符串图像处理参数为JSON 命令行提取图像主色调 py-img-processor Image editor using Python and Pillow. 依赖Pillow开发的Python库,用于图像编辑处理。…

第6章 复制

文章目录 前言1.配置1.1建立复制1.2断开复制1.3 安全性1.4 只读1.5 传输延迟 2. 拓扑2.1.一主一从结构2.2.一主多从结构2.3.树状主从结构 3.原理3.1复制过程 前言 复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础,满足故障恢复和…

Redis 高可用 sentinel

简介 Sentinel提供了一种高可用方案来抵抗节点故障,当故障发生时Redis集群可以自动进行主从切换,程序可以不用重启。 Redis Sentinel集群可以看成是一个Zookeeper集群,他是Redis集群高可用的心脏,一般由3-5个节点组成&#xff0…

【STM32】GPIO复用和映射

1.什么叫管脚复用 STM32F4有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。 STM32F4系列微控制器IO引脚通过一个…

鸿蒙开发HarmonyOS NEXT (二) 熟悉ArkUI

一、构造函数 构造一个商品类Item,然后利用foreach函数循环渲染 class Item {name: stringimage: ResourceStrprice: numberdiscount: numberconstructor(name: string, image: ResourceStr, price: number, discount: number 0) {this.name name;this.image ima…

MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解

MoneyPrinterPlus可以使用大模型自动生成短视频,我们可以借助Azure提供的语音服务来实现语音合成和语音识别的功能。 Azure的语音服务应该是我用过的效果最好的服务了,微软还得是微软。 很多小伙伴可能不知道应该如何配置,这里给大家提供一…

API-元素尺寸与位置

学习目标: 掌握元素尺寸与位置 学习内容: 元素尺寸与位置仿京东固定导航栏案例实现bilibili点击小滑块移动效果 元素尺寸与位置: 使用场景: 前面案例滚动多少距离,都是我们自己算的,最好是页面滚动到某个…

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述 在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特…

企业数据治理必备工具:智能元数据管理平台

当下,企业拥有海量数据,但仅拥有数据并不能释放数据价值。我们还需要深入了解数据的各种属性、来源和关系等信息。这些信息被称为“元数据”,即用于描述数据的数据。 假设,把我们每个人的身份证、户口本都当做数据,那…

模拟实现string【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 构造函数默认构造拷贝构造 重载赋值拷贝函数析构函数迭代器和获取迭代器迭代器获取迭代器 resize【调整size】图解 reserve【调整capacity】empty【判断串是否为空】operator[]appendpus…

超详细的Pycharm使用虚拟环境搭建Django项目并创建新的虚拟环境教程

一、什么是虚拟环境? 通过软件虚拟出来的开发环境,不是真实存在的,一般在多套环境开发时会用到。 二、为什么要使用虚拟环境? 虚拟环境为不同的项目创建不同的开发环境,开发环境内所有使用的工具包互不影响。比如项…

Android笔记-adb keycode大全

使用方法 用adb发送按键事件时,可以使用下面表中的枚举值或者直接使用数值,比如 adb shell input keyevent KEYCODE_HOME 或者 adb shell input keyevent 3 下面按三种排序方法列出所有按键的 keycode, 分别是: 按功能分 按枚…

【Linux】高级IO——五种IO模型和基本概念 ,非阻塞IO,fcntl,实现非阻塞IO,同步通信和异步通信

文章目录 Linux高级IO1. 五种IO模型1.1 阻塞IO1.2 非阻塞IO1.3 信号驱动IO1.4 IO多路转接1.5 异步IO 2. 同步通信和异步通信3. 阻塞和非阻塞 Linux高级IO 1. 五种IO模型 IO是什么? IO是计算机领域中的缩写,指的是输入/输出(Input/Output&…