4gbu4jmew4p64017000930.gif
* e6 |# T* x8 _: P8 }% M
点击上方蓝色字体,关注我们5 r3 V$ w( v X# b# }& h0 c. m
STM32 系列的片上 RAM(内部 SRAM)通常在几十到几百 KB 范围内,对于需要大量内存的应用(例如图像处理、大量数据缓存、或复杂的数据结构管理等),这些片内 RAM 往往不够用。
) Y3 P: o+ T# |- _( P
8 b& \* Y3 p$ j; b# j+ A
4zdzcnuzq1m64017001031.png
, O" u9 S, q+ ?' `7 w0 R而使用片外 RAM,可以让系统拥有更大容量的堆区域,满足内存需求。- q. l; m3 T; o1 }; l
8 v6 v8 T: s8 FSTM32 支持多种片外 RAM,如:( G$ U' ]" e8 [6 J5 C; X
SDRAM:速度快,容量大,适合频繁访问的应用,但相对较复杂,通常需要较多的引脚。SRAM:相对较慢但结构简单,适合中小容量需求。PSRAM:成本低、接口简单,适用于一些中等容量的需求。& V. Z2 C* e( w( D: W: l6 b6 ^1 K
! r* i/ D5 p0 X选择合适的片外 RAM 类型取决于应用的具体需求、速度要求、预算及功耗要求等。' t' h( X- v+ C# l# w
1/ |9 |; w( ], R1 c
STM32片外RAM接口与配置
' s1 s" J) t: i# c* U FSTM32 大多通过以下接口访问片外 RAM:% C K+ |3 G# Q8 u' \) R, m
FSMC(Flexible Static Memory Controller):适用于 STM32F1、STM32F4 系列,支持静态存储器(如 SRAM 和 PSRAM)。FMC(Flexible Memory Controller):通常用于 STM32F4、STM32F7、STM32H7 系列,支持 SDRAM 和 SRAM 等。/ m' E. `6 x1 c" L
4 [2 {/ p1 R$ b2 y* X) j* y配置流程:, w8 a* o4 O$ I2 w$ l9 v: Y; e
引脚配置:将 RAM 的地址线、数据线与 STM32 的相应引脚连接,并通过 STM32CubeMX 或手动配置 GPIO。时钟配置:启用 FMC/FSMC 控制器的时钟。初始化配置:在程序中设置时序、控制器参数,初始化外部 RAM。" H. P; b: P0 ?1 t; Y; O
9 z& C, D/ {# c7 P2
! H/ Y; K) v8 g0 W配置堆到片外 RAM
5 o/ C; K/ T6 dSTM32 系统中堆的分配主要在链接文件(linker script)中进行。步骤如下:+ b* N5 c2 i8 e2 x. u8 X
1 F3 {/ X; U/ m3 L修改链接文件* k3 ^8 E2 y8 D5 g9 W
通常 .ld 文件(如 STM32F4xx.ld)定义了各个内存段位置和大小。在默认情况下,堆通常在 RAM 段内。
: C9 E- p; z! G( D
, e. y ]! U$ Y* C' \, r& b, G$ Q要将堆放到片外 RAM,可以新建一个内存段并修改相关配置。
v; g% y( Z q) L6 z* [4 H- W6 ]/ Z% w$ R! E$ F0 M
定义片外 RAM 段& K' d |2 H: J' T# g2 u: I
MEMORY{ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K EXTRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 8M}
# s% Q$ M+ b; g, ^, F4 `* O分配堆到 EXTRAM 段:在链接文件中添加以下内容:
& O6 b1 N* `8 o+ h6 A& J3 h- J
3 K" t2 ~( m3 z_estack = ORIGIN(RAM) + LENGTH(RAM); /* 内部RAM的堆栈顶 */_heap_base = ORIGIN(EXTRAM);_heap_size = LENGTH(EXTRAM);0 L' P7 z$ V" J8 S! i
修改系统初始化代码% K* u) q! l6 q& \6 V
有些 STM32 平台会在启动文件(如 startup_stm32f4xx.s)或 C 文件中初始化堆位置。根据新的堆地址,确保系统初始化时设置正确的堆地址范围。. S6 M# V2 E* u9 \2 p
6 j( r Z9 R& T5 c4 q) K
在 STM32 的 AI 处理、图像处理、无线通信等对内存需求高的场景下,将堆放在片外 RAM 可以大幅度提升系统的可用内存,使 STM32 适应更复杂的任务。# [( U, t$ n* y
, H. s+ C4 n9 W: C/ C
由于片外 RAM 的速度通常不如片内 RAM 快,建议使用片外 RAM 存储相对大而少频繁访问的数据,片内 RAM 存储实时性要求高的数据。9 m+ c5 ^4 @0 x! h- M
7 \- }7 {+ E p2 D, x. a: | N% I, K可以通过 DMA 访问片外 RAM,降低 CPU 的负载,提高数据传输效率。
' f+ c5 ~ k7 m8 y+ w$ r0 B2 n1 V3 U0 j7 M5 b7 X
监控和调试外部 RAM 的分配情况(如 STM32CubeIDE 的实时内存监视器)可以确保分配正常、数据完整性良好。
! ?, C) Y4 I$ E4 h7 b5 U8 E; U0 \( w
nalqmqygt0o64017001131.jpg
7 Z) Y6 n7 I9 P7 S w) {
z5ahzvhnznu64017001231.gif
& l. \2 [6 L$ ]# F
点击阅读原文,更精彩~ |