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

news2024/11/15 16:25:03

概述

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.coloradmin.cn/o/1869750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABAP开发:动态Open SQL编程案例介绍

动态Open SQL是Open SQL的扩展。它不是要求整个SQL语句都是动态指定的。通过熟悉的静态ABAP编码表达静态已知的部分,动态元素的部分通过动态标记指定。动态片段不明确包含在ABAP源代码中,而是源代码包含一个ABAP变量,用括号括起来作为占位符。…

Linux—进程与计划管理

目录 一、程序 二、进程 1、什么是进程 2、进程的特点 3、进程、线程、携程 3.1、进程 3.2、线程 3.3、携程 三、查看进程信息 1、ps -aux 2、ps -elf 3、top ​3.2、输出内容详解 3.2.1、输出第一部分解释 3.2.2、输出第二部分解释 4、pgrep 5、pstree 四、进…

从CVPR 2024看域适应、域泛化最新研究进展

域适应和域泛化一直以来都是各大顶会的热门研究方向。 域适应指:当我们在源域上训练的模型需要在目标域应用时,如果两域数据分布差异太大,模型性能就有可能降低。这时可以利用目标域的无标签数据,通过设计特定方法减小域间差异&a…

深入理解 Dubbo:分布式服务框架的核心原理与实践

目录 Dubbo 概述Dubbo 的架构Dubbo 的关键组件 服务提供者(Provider)服务消费者(Consumer)注册中心(Registry)监控中心(Monitor)调用链追踪(Trace) Dubbo 的…

减压电子陀螺MCU电子方案开发服务

指尖陀螺的功能主要是提供一种旋转的娱乐效果,其玩法包括单手拨转、花式旋转等。 指尖陀螺作为一种流行的小型玩具,其主要功能是利用轴承滚动原理达到旋转效果,为使用者提供视觉和触觉上的娱乐体验。玩指尖陀螺的基本方法是使用拇指和其他手…

网络流-EK算法(保姆级教学)

本文引用董晓算法的部分图片。 一些不能带入纸质资料的竞赛,网络流纳入考纲。 因为需要默写,想来也不会考默写dinic这种算法难倒大家,只需要快速敲对EK算法就行了。 EK算法能在O(n*m^2)的复杂度内解决最大流问题,其中最大流就是…

抖音外卖服务商有哪些,盘点这几家正规服务商!

当前,抖音外卖的关注度不断上涨,抖音外卖服务商也逐渐成为了众多创业者心中的理想创业赛道。在此背景下,抖音外卖服务商的入局途径多次引发创业者热议,以抖音外卖服务商有哪些公司为代表的相关话题更是长期位居创业者问题榜单的前…

WordPress Dokan Pro插件 SQL注入漏洞复现(CVE-2024-3922)

0x01 产品简介 WordPress Dokan Pro插件是一款功能强大的多供应商电子商务市场解决方案,功能全面、易于使用的多供应商电子商务平台解决方案,适合各种规模的电商项目。允许管理员创建一个多卖家平台,卖家可以注册账户并在平台上创建自己的店铺,展示和销售自己的产品。提供…

SecureCRT使用SSH登录服务器报错:Key exchange failed

SecureCRT使用SSH登录Ubuntu服务器报错:Key exchange failed 原因: ssh客户端与服务器的公钥协商失败,SecureCRT客户端所指定的秘钥交换算法(KexAlgorithms ),不在服务端支持范围内。可能是服务端的sshd版…

【代码随想录】【算法训练营】【第51天】 [115]不同的子序列 [583]两个字符串的删除操作 [72]编辑距离

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 51,周四,又是不能坚持的一天~ 题目详情 [115] 不同的子序列 题目描述 115 不同的子序列 解题思路 前提: 思路: 重点: 代码实现 …

微信公众平台扫码登录:Spring Boot与JustAuth的完美结合

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 微信公众平台扫码登录:Spring Boot与JustAuth的完美结合 前言前提什么是JustAuthJust…

kali下安装使用蚁剑(AntSword)

目录 0x00 介绍0x01 安装0x02 使用1. 设置代理2. 请求头配置3. 编码器 0x00 介绍 蚁剑(AntSword)是一个webshell管理工具。 官方文档:https://www.yuque.com/antswordproject/antsword 0x01 安装 在kali中安装蚁剑,分为两部分&am…

python获取快手账号列表数据

快手数据获取相对简单访问地址固定且不需要登录token 列表地址获取的固定接口 https://www.kuaishou.com/graphql 发送post请求注意每个快手账号对应的id import time from datetime import datetime import logging import json import pymysql import requests# 创建一个lo…

vue3 【提效】自动导入框架方法 unplugin-auto-import 实用教程

是否还在为每次都需要导入框架方法而烦恼呢? // 每次都需手动导入框架方法 import { ref } from vuelet num ref(0)用 unplugin-auto-import 来帮你吧,以后只需这样写就行啦! let num ref(0)官方示例如下图 使用流程 1. 安装 unplugin-au…

文物管理技术RFID技术

随着科技的不断发展,科技在各个领域都发挥着重要的作用。其中,在文物管理方面,RFID技术的应用正在逐渐引起人们的关注。RFID(Radio Frequency Identification)技术是一种通过无线电信号进行非接触式识别的技术&#xf…

【深度学习】Error: TensorBoard could not bind to port 6006 问题解决

问题描述 在启动TensorBoard时,遇到了端口冲突,如下图所示: 根据提示,出错原因是因为端口已经被占用了,因此我们要结束占用这个端口的进程。 我的系统是Windows系统,并不是Linux,网上大部分方…

基于springboot时装购物系统

设计技术: 开发语言:Java数据库:MySQL技术:SpringbootMybatisvue 工具:IDEA、Maven、Navicat 主要功能: 管理员:首页、个人中心、用户管理、商品分类管理、颜色管理、商品信息管理、商品评价…

以数治税时代来临,企业如何应对?

全电发票是数字经济时代发票的新形态,顺应了数字经济潮流。现如今,国家正全力推动行业数字化进程,预计,2025年将基本实现发票全领域、全环节、全要素电子化,实现税务执法、服务、监管与大数据智能化应用深度融合、高效…

数据库使用笔记

1.mysql数据库频繁访问导致连接超时 解决办法一: 优化查询:检查并优化SQL查询语句,减少不必要的数据库调用。增加连接池大小:如果应用程序使用连接池,可以考虑增加连接池的最大连接数。(注:不能…

Profibus协议转Modbus协议网关模块在船舶中的应用

一、背景 在当今数字化快速发展的时代,船舶作为重要的交通工具之一,也在不断追赶着科技的步伐,实现自身的智能化升级。而在这个过程中,Profibus转Modbus网关(XD-MDPB100)作为关键的一环,扮演着…