电子产业一站式赋能平台

PCB联盟网

搜索
查看: 139|回复: 0
收起左侧

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

[复制链接]

724

主题

724

帖子

5176

积分

四级会员

Rank: 4

积分
5176
发表于 2024-11-24 08:03:00 | 显示全部楼层 |阅读模式

4gbu4jmew4p64017000930.gif

4gbu4jmew4p64017000930.gif
2 E& m- w, m- ^/ v: z  u- W+ ^
点击上方蓝色字体,关注我们' i9 L8 ]' r: k$ t& Z
STM32 系列的片上 RAM(内部 SRAM)通常在几十到几百 KB 范围内,对于需要大量内存的应用(例如图像处理、大量数据缓存、或复杂的数据结构管理等),这些片内 RAM 往往不够用。9 \* q- l' b& }/ o" y
; h7 L. B* o) L" L: V  W" H; H

4zdzcnuzq1m64017001031.png

4zdzcnuzq1m64017001031.png
6 `0 D+ A3 D" {4 n  c6 m
而使用片外 RAM,可以让系统拥有更大容量的堆区域,满足内存需求。$ c6 E) e- H) g# J
& t/ W- C" T% ]
STM32 支持多种片外 RAM,如:  e' _7 X9 i1 [9 K! R: n
  • SDRAM:速度快,容量大,适合频繁访问的应用,但相对较复杂,通常需要较多的引脚。
  • SRAM:相对较慢但结构简单,适合中小容量需求。
  • PSRAM:成本低、接口简单,适用于一些中等容量的需求。4 F0 E/ C6 l  D2 `4 [& z8 t

    * X8 ]4 i3 |3 |选择合适的片外 RAM 类型取决于应用的具体需求、速度要求、预算及功耗要求等。
    9 F. ~5 D7 |& J5 l1 N! _; t18 f2 V# @3 L1 ^
    STM32片外RAM接口与配置* ^$ ?+ d; q( f7 T) g) M
    STM32 大多通过以下接口访问片外 RAM:* j& X. [9 n$ G8 q* z
  • FSMC(Flexible Static Memory Controller):适用于 STM32F1、STM32F4 系列,支持静态存储器(如 SRAM 和 PSRAM)。
  • FMC(Flexible Memory Controller):通常用于 STM32F4、STM32F7、STM32H7 系列,支持 SDRAM 和 SRAM 等。
    ( q/ w* G; O9 p/ K9 d
    6 p. s7 {& G- [
    配置流程:& X# Y9 ?/ F5 `" r$ V( {4 S& P
  • 引脚配置:将 RAM 的地址线、数据线与 STM32 的相应引脚连接,并通过 STM32CubeMX 或手动配置 GPIO。
  • 时钟配置:启用 FMC/FSMC 控制器的时钟。
  • 初始化配置:在程序中设置时序、控制器参数,初始化外部 RAM。- L' y- ?- I! N5 D, g& g8 H$ r/ O

    ; I9 H, c( t$ x7 }4 }1 L% H* ~8 {2
    6 u( G# q3 Y* @$ ?. O配置堆到片外 RAM0 [1 h' U+ C  E; L
    STM32 系统中堆的分配主要在链接文件(linker script)中进行。步骤如下:
    ( t  U0 P" \0 c' s* F' _  z' y) N5 f, }" y* x% u
    修改链接文件1 m) A* F, T6 `' Y( T
    通常 .ld 文件(如 STM32F4xx.ld)定义了各个内存段位置和大小。在默认情况下,堆通常在 RAM 段内。* G8 W  i; d2 e+ t; d
    ( m8 j0 Q* \& W9 @  K( @: N- e( y, X
    要将堆放到片外 RAM,可以新建一个内存段并修改相关配置。: o  U' J6 R! z  D5 M  ~: k5 t
    , f$ B5 T4 H/ h* o
    定义片外 RAM 段
    ) O" c8 T/ q$ ~  S
  • MEMORY{    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K    EXTRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 8M}
    ' \5 y/ _: p* ^+ @/ i! M9 I# D分配堆到 EXTRAM 段:在链接文件中添加以下内容:" a- d, N; C6 l2 i0 C

    % E/ h( u3 Z4 O5 z4 N
  • _estack = ORIGIN(RAM) + LENGTH(RAM);   /* 内部RAM的堆栈顶 */_heap_base = ORIGIN(EXTRAM);_heap_size = LENGTH(EXTRAM);5 v) _# ?; y+ ~/ J
    修改系统初始化代码
    1 p" {% `' O$ z$ a$ z/ \有些 STM32 平台会在启动文件(如 startup_stm32f4xx.s)或 C 文件中初始化堆位置。根据新的堆地址,确保系统初始化时设置正确的堆地址范围。
    ( t: z1 U/ d. E0 p% j" }3 w. A0 j& n+ Z) \' I
    在 STM32 的 AI 处理、图像处理、无线通信等对内存需求高的场景下,将堆放在片外 RAM 可以大幅度提升系统的可用内存,使 STM32 适应更复杂的任务。
    3 y2 }4 U5 q# m8 |- q* p/ |" g: [+ ~7 w
    由于片外 RAM 的速度通常不如片内 RAM 快,建议使用片外 RAM 存储相对大而少频繁访问的数据,片内 RAM 存储实时性要求高的数据。
    : n- X1 C  w! d  [& a# B7 @$ ]3 G& f# S9 h
    可以通过 DMA 访问片外 RAM,降低 CPU 的负载,提高数据传输效率。
    6 G  y2 a/ N+ G" Z' X9 S) I9 n: `& f
    监控和调试外部 RAM 的分配情况(如 STM32CubeIDE 的实时内存监视器)可以确保分配正常、数据完整性良好。
    - w9 H7 \2 C1 u9 X( N: o

    nalqmqygt0o64017001131.jpg

    nalqmqygt0o64017001131.jpg
    ! \" `* e4 G6 @- x% j

    z5ahzvhnznu64017001231.gif

    z5ahzvhnznu64017001231.gif
    : \7 i8 ]6 ?4 A$ r: P: k
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表