自己用的是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要注意下。