STM32H7有64KB的ITCM RAM、128KB的DTCM RAM、D1域512KB的AXI SRAM、D2域128KB SRAM1+128KB SRAM2+32KB SRAM3以及D3域64KB SRAM4和4KB备份SRAM。(具体详情请参考STM32H7x3编程参考手册P96)我们可以自由地分配这些内存。目前,MDK与IAR均支持这种内存使用方式。
-
MDK管理各个D域SRAM及TCM RAM的方法与步骤:
通常情况下我们都是通过编译器分配内存区:
但这种操作方法具有局限性,只能使用两个连续的内存区,若要充分利用所有的内存资源,可通过修改后缀为.sct文件,该文件是通过选中on-chip中的IRAM1和IRAM2,编译器自动生成的脚本文件YS-H7Multi.sct。内容如下:
此代码中只定义了两个RAM内存区域:DTCM RAM(0x20000000-0x20020000)与AXI RAM(0x24000000-0x24080000)。现在我们使用其它D域的RAM.
现在我们定义了5块内存区,注意分号“;”在这里是屏蔽的作用。接着,如下图,点击Linker,再把”Use Memory Layout from Target Dialog”这一选项的勾勾去掉,最后加载编辑好的脚本文件YS-H7Multi.sct。
那我们如何使用这个脚本呢?
使用起来还是蛮简单的。验证实验:KEY1~KEY4操控着D1域的AXI RAM、D2域的SRAM1~SRAM3、D3域的SRAM4以及D3域备份RAM。打印出定义在各个内存区变量的地址,是否位于各内存区的地址。
由此得到验证。 -
IAR管理各个D域SRAM及TCM RAM的方法与步骤:
IAR相比MDK的设置要简单一些,仅需在IAR的配置文件stm32h743xx_flash.icf中添加如下代码即可, stm32h743xx_flash.icf文件位于如下下图所示:
打开stm32h743xx_flash.icf文件,并添加代码:
用户使用的话如下:
补充:如果用MDK时,想把堆栈放置不同D域的SRAM1中,可以这样:
先在YS-H7Multi.sct设置好堆栈使用哪块区域的内存,
再在startup_stm32h743xx.s文件设置堆栈大小,务必与第一步的堆栈大小一致。
最后打开YS-H7Multi.map文件核对堆栈起始地址是否一致
下载例程连接:https://download.csdn.net/download/Jaken5213/15467599