STM32H7 单片机使用DTCMRAM空间提升程序运行速度(STM32CubeIDE)

自己用的是STM32CubeIDE的开发环境,MCU型号是STM32H750,工程是STM32CubeMX生成的。为了提升程序运行速度,需要将程序运行空间从RAM_D1修改到DTCMRAM. 网上的资料都是keil MDK的开发环境配置的方法,所以只能自己看STM32CubeIDE用户手册(UM2609)。
下面是解决方法
在这里插入图片描述上图是原始的link文件,注意要用flash那个。目前是在RAM_D1空间。

在这里插入图片描述这是修改后的,分配到DTCMRAM,可以直接复制下面的内容替换*_FLASH.ld文件
/*


**
** File : LinkerScript.ld
**
** Author : STM32CubeIDE
**
** Abstract : Linker script for STM32H7 series
** 128Kbytes FLASH and 1056Kbytes RAM
**
** Set heap size, stack size and stack location according
** to application requirements.
**
** Set memory bank area and size if external memory is used.
**
** Target : STMicroelectronics STM32
**
** Distribution: The file is distributed as is, without any warranty
** of any kind.
**


** @attention
**
** Copyright © 2022 STMicroelectronics.
** All rights reserved.
**
** This software is licensed under terms that can be found in the LICENSE file
** in the root directory of this software component.
** If no LICENSE file comes with this software, it is provided AS-IS.
**


*/

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack /
_estack = ORIGIN(RAM_D1) + LENGTH(RAM_D1); /
end of RAM /
/
Generate a link error if heap and stack don’t fit into RAM /
_Min_Heap_Size = 0x2000 ; /
required amount of heap /
_Min_Stack_Size = 0x4000 ; /
required amount of stack */

/* Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K
RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K
ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
}

/* Define output sections /
SECTIONS
{
/
The startup code goes first into FLASH /
.isr_vector :
{
. = ALIGN(4);
KEEP(
(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH

/* The program code and other data goes into FLASH /
.text :
{
. = ALIGN(4);
(.text) / .text sections (code) /
(.text) /
.text
sections (code) */
(.glue_7) / glue arm to thumb code */
(.glue_7t) / glue thumb to arm code */
*(.eh_frame)

KEEP (*(.init))
KEEP (*(.fini))

. = ALIGN(4);
_etext = .;        /* define a global symbols at end of code */

} >FLASH

/* Constant data goes into FLASH /
.rodata :
{
. = ALIGN(4);
(.rodata) / .rodata sections (constants, strings, etc.) /
(.rodata) /
.rodata
sections (constants, strings, etc.) */
. = ALIGN(4);
} >FLASH

.ARM.extab : { (.ARM.extab .gnu.linkonce.armextab.*) } >FLASH
.ARM : {
__exidx_start = .;
(.ARM.exidx)
__exidx_end = .;
} >FLASH

.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP ((.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
} >FLASH

.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP ((SORT(.init_array.)))
KEEP ((.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
} >FLASH

.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP ((SORT(.fini_array.)))
KEEP ((.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
} >FLASH

/* used by the startup to initialize data */
_sidata = LOADADDR(.data);

/* Initialized data sections goes into RAM, load LMA copy after code /
.data :
{
. = ALIGN(4);
_sdata = .; /
create a global symbol at data start /
(.data) / .data sections /
(.data) /
.data
sections /
(.RamFunc) / .RamFunc sections /
(.RamFunc) /
.RamFunc
sections */

. = ALIGN(4);
_edata = .;        /* define a global symbol at data end */

} >DTCMRAM AT> FLASH

/* Uninitialized data section /
. = ALIGN(4);
.bss :
{
/
This is used by the startup in order to initialize the .bss section /
_sbss = .; /
define a global symbol at bss start */
bss_start = _sbss;
*(.bss)
(.bss)
*(COMMON)

. = ALIGN(4);
_ebss = .;         /* define a global symbol at bss end */
__bss_end__ = _ebss;

} >DTCMRAM

/* User_heap_stack section, used to check that there is enough RAM left */
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >DTCMRAM

/* Remove information from the standard libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}

.ARM.attributes 0 : { *(.ARM.attributes) }
}

修改后程序运行速度提升了好多倍不止,爽歪!

PS:DMA控制器不能访问DTCMRAM,用DMA要注意下。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值