前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >如何在STM32开发中将堆配置到片外RAM?

如何在STM32开发中将堆配置到片外RAM?

作者头像
不脱发的程序猿
发布2024-11-26 08:57:43
发布2024-11-26 08:57:43
34300
代码可运行
举报
文章被收录于专栏:AIoT技术交流、分享
运行总次数:0
代码可运行
STM32 系列的片上 RAM(内部 SRAM)通常在几十到几百 KB 范围内,对于需要大量内存的应用(例如图像处理、大量数据缓存、或复杂的数据结构管理等),这些片内 RAM 往往不够用。

而使用片外 RAM,可以让系统拥有更大容量的堆区域,满足内存需求。

STM32 支持多种片外 RAM,如:

  • SDRAM:速度快,容量大,适合频繁访问的应用,但相对较复杂,通常需要较多的引脚。
  • SRAM:相对较慢但结构简单,适合中小容量需求。
  • PSRAM:成本低、接口简单,适用于一些中等容量的需求。

选择合适的片外 RAM 类型取决于应用的具体需求、速度要求、预算及功耗要求等。

1、STM32片外RAM接口与配置

STM32 大多通过以下接口访问片外 RAM:

  • FSMC(Flexible Static Memory Controller):适用于 STM32F1、STM32F4 系列,支持静态存储器(如 SRAM 和 PSRAM)。
  • FMC(Flexible Memory Controller):通常用于 STM32F4、STM32F7、STM32H7 系列,支持 SDRAM 和 SRAM 等。

配置流程:

  • 引脚配置:将 RAM 的地址线、数据线与 STM32 的相应引脚连接,并通过 STM32CubeMX 或手动配置 GPIO。
  • 时钟配置:启用 FMC/FSMC 控制器的时钟。
  • 初始化配置:在程序中设置时序、控制器参数,初始化外部 RAM。

2、配置堆到片外 RAM

STM32 系统中堆的分配主要在链接文件(linker script)中进行。步骤如下:

修改链接文件

通常 .ld 文件(如 STM32F4xx.ld)定义了各个内存段位置和大小。在默认情况下,堆通常在 RAM 段内。

要将堆放到片外 RAM,可以新建一个内存段并修改相关配置。

定义片外 RAM 段

代码语言:javascript
代码运行次数:0
复制
MEMORY
{
    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
    EXTRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 8M
}

分配堆到 EXTRAM 段:在链接文件中添加以下内容:

代码语言:javascript
代码运行次数:0
复制
_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 的实时内存监视器)可以确保分配正常、数据完整性良好。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 美男子玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 修改链接文件
  • 定义片外 RAM 段
  • 修改系统初始化代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档