• 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_region
    	VECTOR_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 64k
    		startup_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)

  • 相关阅读:
    Java从零学起(九)----集合
    【Netty 的设计与应用】
    Dubbo之多协议、多注册中心、多版本。
    CH573-09-BLE蓝牙安卓应用二次开发——RISC-V内核BLE MCU快速开发教程
    机器学习笔记之线性分类——高斯判别分析(二)最优参数求解
    S32K144时钟学习
    java毕业生设计高校教材征订管理系统计算机源码+系统+mysql+调试部署+lw
    藏品新塑 | 聚沙数藏携手Metaboard元乐达成战略联盟 聚沙官方全方位战略扶持
    css 盒模型
    CAS:385437-57-0 DSPE-PEG-Biotin 磷脂-聚乙二醇-生物素 常用生物活性分子
  • 原文地址:https://blog.csdn.net/weixin_38426553/article/details/139565431