STM32H750启动和内存优化(分散加载修改)

2024-06-10 05:12

本文主要是介绍STM32H750启动和内存优化(分散加载修改),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前些日子有个朋友一直给我推荐STM32H750这款芯片,说它的性价比,说它多么多么好。于是乎,这两天试了试,嚯,真香!我们先看看基本配置
请添加图片描述
请添加图片描述

这里简单总结下,cortex-m7内核,128k片内flash ,1M RAM,淘宝价格十几块,瞬间感觉1052没那么香了(价格二十多)。关键这个价格几乎跟imxrt1011差不多了,而1011只有128K RAM,无片内flash,导致做不了很复杂的项目。除此之外h750还能拓展出32bit sdram这点相比1052的16bit性能也进一步加强。好了,本章不是介绍h750性能多强的,主要介绍,上手h750后,ram 和 rom如何高效利用起来。

内存分布

先看看系统的ram分布结构请添加图片描述
请添加图片描述

内存设备地址区间大小
ITCM0x0000_0000~0x0000_FFFF64K
DTCM0x2000_0000~0x2001_FFFF128K
AXI SRAM (D1)0x2400_0000~0x2407_FFFF512K
SRAM1 (D2)0x3000_0000~0x3001_FFFF128K
SRAM2 (D2)0x3002_0000~0x3003_FFFF128K
SRAM3 (D2)0x3004_0000~0x3004_7FFF32K
SRAM4 (D3)0x3800_0000~0x3800_FFFF64K

结合上述矩阵图,结合其速度位宽,我们可以给这些RAM做一个优先级划分 TCM > AXI SDRAM > SRAM 1 2 3 > SRAM 4,当然像以太网和 USB 的缓冲是要求用于SRAM3中的,这类特殊外设,需要特别注意。另外我们应该尽量让代码在TCM中运行,这时候我们就需要修改其分散加载文件(也叫链接脚本)。分散加载文件,主要目的就是把想要的数据或者代码运行到指定区域,进而让系统更高效的运行。

修改启动文件

请添加图片描述
这里笔者将启动文件startup_stm32h750xx.s分为两段,RES_HANDLER 包含 Reset_Handler SystemInit__main 函数相关,OTHER_HANDLER 包含其他中断函数。将这两个段,一个就地执行,一个拷贝到tcm,除此之外链接脚本中,VECTOR_RAM 用于存放中断向量,并在main开始阶段执行拷贝

//中断向量拷贝函数 ROM 拷贝到 RAM, 更新 SCB->VTOR
void xBSP_VectorInit(void)
{extern uint32_t Image$$VECTOR_ROM$$Base[];extern uint32_t Image$$VECTOR_RAM$$Base[];void *pS = (void *)Image$$VECTOR_ROM$$Base;void *pT = (void *)Image$$VECTOR_RAM$$Base;uint32_t pRamVectorAddr = (uint32_t)Image$$VECTOR_RAM$$Base;memcpy(pT,pS,0x298);__asm("CPSID I");SCB->VTOR = pRamVectorAddr;__asm("CPSIE i");
}int main(void)
{xBSP_VectorInit();......
}
修改后的链接脚本

如下链接脚本,代码是下载到内部flash中的,如果下载到外部QSPI flash,那直接修改成0x9000_0000即可

LR_IROM1 0x08000000 0x00020000  
{    ; load region size_regionVECTOR_ROM 0x08000000 0x00020000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections)startup_stm32h750xx.o (RES_HANDLER)system_stm32h7xx.o (+RO)}VECTOR_RAM 0x00000000 0x00000298 {}RW_m_text 0x00000298 0x0000fd68 {  ; itcm 64kstartup_stm32h750xx.o (OTHER_HANDLER).ANY (+RO).ANY (+XO)}RW_DTCM 0x20000000 0x00020000  {  ; dtcm 128k.ANY (+RW +ZI)}RW_SRAM 0x24000000 0x00080000  {	;512k axi sram}
}
修改后的map映射请添加图片描述

补充:下载外部flash需要对应的下载算法,下载算法基于硬件设计(选择的IO)和flash品牌不同而有差异,所以在使用外部flash时候,需要制作其下载算法,下载算法如何制作,可以看看如下链接:

STM32H750片外Flash启动(W25Q64JVSIQ) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

这篇关于STM32H750启动和内存优化(分散加载修改)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047298

相关文章

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu