电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

595

主题

595

帖子

3727

积分

四级会员

Rank: 4

积分
3727
发表于 4 天前 | 显示全部楼层 |阅读模式

4gbu4jmew4p64017000930.gif

4gbu4jmew4p64017000930.gif

: v" k$ Y* K! d2 O/ J; |点击上方蓝色字体,关注我们- {7 D* P  I* _. g- M2 ?
STM32 系列的片上 RAM(内部 SRAM)通常在几十到几百 KB 范围内,对于需要大量内存的应用(例如图像处理、大量数据缓存、或复杂的数据结构管理等),这些片内 RAM 往往不够用。4 ~* K* z  Z; B# p
! w0 A& c% Y0 k/ I8 |* s

4zdzcnuzq1m64017001031.png

4zdzcnuzq1m64017001031.png

# _7 H' O2 x4 f而使用片外 RAM,可以让系统拥有更大容量的堆区域,满足内存需求。: o1 ~6 P2 ^& Q% t1 D

* Z3 p9 D$ v; O( p0 DSTM32 支持多种片外 RAM,如:+ S4 ]2 f$ ~6 j8 S+ q
  • SDRAM:速度快,容量大,适合频繁访问的应用,但相对较复杂,通常需要较多的引脚。
  • SRAM:相对较慢但结构简单,适合中小容量需求。
  • PSRAM:成本低、接口简单,适用于一些中等容量的需求。
    2 @6 p& K* ~- n) B# @
    6 V9 b/ i, ~8 b0 g
    选择合适的片外 RAM 类型取决于应用的具体需求、速度要求、预算及功耗要求等。
    2 K) J5 o# r& B2 y1/ j  b6 a! @# \: X0 n6 M: H4 E
    STM32片外RAM接口与配置2 Q5 e/ f8 g' B
    STM32 大多通过以下接口访问片外 RAM:
    # W, |! ]* G1 S+ b
  • FSMC(Flexible Static Memory Controller):适用于 STM32F1、STM32F4 系列,支持静态存储器(如 SRAM 和 PSRAM)。
  • FMC(Flexible Memory Controller):通常用于 STM32F4、STM32F7、STM32H7 系列,支持 SDRAM 和 SRAM 等。
    1 l( m, a  o( b' X3 V
    ) d+ \2 ]% K# \  D" W- Y
    配置流程:
    % x* ~/ {8 `3 O* P/ ~+ e
  • 引脚配置:将 RAM 的地址线、数据线与 STM32 的相应引脚连接,并通过 STM32CubeMX 或手动配置 GPIO。
  • 时钟配置:启用 FMC/FSMC 控制器的时钟。
  • 初始化配置:在程序中设置时序、控制器参数,初始化外部 RAM。% @, [+ N- @" |1 l

    * |) K1 H! M2 d; p7 P2
    ! H8 u% b! l+ ~' E+ U# h0 f配置堆到片外 RAM
    / x& W% X& S- E" y) p; A5 Y. X4 M( b  KSTM32 系统中堆的分配主要在链接文件(linker script)中进行。步骤如下:. g# M2 e! Z) B7 d' Y

    - U# `# K$ r  I" i0 R3 ]* M修改链接文件
    8 m5 l# g7 I/ ~1 _& X: R1 Y. {通常 .ld 文件(如 STM32F4xx.ld)定义了各个内存段位置和大小。在默认情况下,堆通常在 RAM 段内。
    , t# R' v! S: O) i7 Z, G, g2 r
    & O0 K0 P/ C" \+ k* p# y要将堆放到片外 RAM,可以新建一个内存段并修改相关配置。6 e5 R/ z! r  t7 n3 a- P
      P1 k: k5 X6 H: I
    定义片外 RAM 段
    - B4 h( G5 S# I$ M$ q' G& ]
  • MEMORY{    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K    EXTRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 8M}1 ?* k4 L8 P9 Z/ ~; C! q3 Z; {; @2 i
    分配堆到 EXTRAM 段:在链接文件中添加以下内容:
    $ r  p/ d) s. d1 I$ a2 u7 f9 h- m1 t" h+ i0 L) e
  • _estack = ORIGIN(RAM) + LENGTH(RAM);   /* 内部RAM的堆栈顶 */_heap_base = ORIGIN(EXTRAM);_heap_size = LENGTH(EXTRAM);
      f; r: g5 D3 Q) R2 ^  s* Y( a修改系统初始化代码" `% f+ p! s" C+ g/ k" q% V& f$ T: Z
    有些 STM32 平台会在启动文件(如 startup_stm32f4xx.s)或 C 文件中初始化堆位置。根据新的堆地址,确保系统初始化时设置正确的堆地址范围。$ p5 P( G: D4 I# H9 k
    + P* b& h, U2 w  t' ?
    在 STM32 的 AI 处理、图像处理、无线通信等对内存需求高的场景下,将堆放在片外 RAM 可以大幅度提升系统的可用内存,使 STM32 适应更复杂的任务。
    # P5 U) e. h' ~, _6 ]$ O" F( g" R1 _2 v1 A; l8 f3 L( D
    由于片外 RAM 的速度通常不如片内 RAM 快,建议使用片外 RAM 存储相对大而少频繁访问的数据,片内 RAM 存储实时性要求高的数据。
    2 \2 @) B; b* g5 x
    4 G4 T0 O+ k' E7 p可以通过 DMA 访问片外 RAM,降低 CPU 的负载,提高数据传输效率。4 H* e. J$ V5 G0 }: g1 [! H/ d

    3 v1 h( z1 B8 `$ x( o监控和调试外部 RAM 的分配情况(如 STM32CubeIDE 的实时内存监视器)可以确保分配正常、数据完整性良好。
    8 S* E7 M1 i5 A7 f6 U4 V+ T

    nalqmqygt0o64017001131.jpg

    nalqmqygt0o64017001131.jpg

    ( u' b* Q6 M# o4 R7 W( r: ^# Z

    z5ahzvhnznu64017001231.gif

    z5ahzvhnznu64017001231.gif

    , ~+ @7 [, h: ^* z& \点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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