而使用片外 RAM,可以让系统拥有更大容量的堆区域,满足内存需求。
STM32 支持多种片外 RAM,如:
选择合适的片外 RAM 类型取决于应用的具体需求、速度要求、预算及功耗要求等。
1、STM32片外RAM接口与配置
STM32 大多通过以下接口访问片外 RAM:
配置流程:
2、配置堆到片外 RAM
STM32 系统中堆的分配主要在链接文件(linker script)中进行。步骤如下:
通常 .ld 文件(如 STM32F4xx.ld)定义了各个内存段位置和大小。在默认情况下,堆通常在 RAM 段内。
要将堆放到片外 RAM,可以新建一个内存段并修改相关配置。
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
EXTRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 8M
}
分配堆到 EXTRAM 段:在链接文件中添加以下内容:
_estack = ORIGIN(RAM) + LENGTH(RAM); /* 内部RAM的堆栈顶 */
_heap_base = ORIGIN(EXTRAM);
_heap_size = LENGTH(EXTRAM);
有些 STM32 平台会在启动文件(如 startup_stm32f4xx.s)或 C 文件中初始化堆位置。根据新的堆地址,确保系统初始化时设置正确的堆地址范围。
在 STM32 的 AI 处理、图像处理、无线通信等对内存需求高的场景下,将堆放在片外 RAM 可以大幅度提升系统的可用内存,使 STM32 适应更复杂的任务。
由于片外 RAM 的速度通常不如片内 RAM 快,建议使用片外 RAM 存储相对大而少频繁访问的数据,片内 RAM 存储实时性要求高的数据。
可以通过 DMA 访问片外 RAM,降低 CPU 的负载,提高数据传输效率。
监控和调试外部 RAM 的分配情况(如 STM32CubeIDE 的实时内存监视器)可以确保分配正常、数据完整性良好。