電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 120|回復(fù): 0
收起左側(cè)

如何在STM32開發(fā)中將堆配置到片外RAM?

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-24 08:03:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
* q/ B  B5 X% F1 n
點擊上方藍色字體,關(guān)注我們, \+ `* U& i" B) e9 u( N$ ~
STM32 系列的片上 RAM(內(nèi)部 SRAM)通常在幾十到幾百 KB 范圍內(nèi),對于需要大量內(nèi)存的應(yīng)用(例如圖像處理、大量數(shù)據(jù)緩存、或復(fù)雜的數(shù)據(jù)結(jié)構(gòu)管理等),這些片內(nèi) RAM 往往不夠用。
0 r! m; E8 h! a% g) x
1 K" n* @* F  w' Q# K1 U) E 8 v+ ?! k8 A6 {* O7 y1 p4 _0 O$ }# s
而使用片外 RAM,可以讓系統(tǒng)擁有更大容量的堆區(qū)域,滿足內(nèi)存需求。
+ G- M  h$ v5 v
8 b& o" ^0 D' WSTM32 支持多種片外 RAM,如:( ~8 n( w( R& K+ K- V* \
  • SDRAM:速度快,容量大,適合頻繁訪問的應(yīng)用,但相對較復(fù)雜,通常需要較多的引腳。
  • SRAM:相對較慢但結(jié)構(gòu)簡單,適合中小容量需求。
  • PSRAM:成本低、接口簡單,適用于一些中等容量的需求。
    1 u; g# t5 C4 x6 v/ k6 R# f
    6 Y  _1 i$ B% o2 O* ?4 |
    選擇合適的片外 RAM 類型取決于應(yīng)用的具體需求、速度要求、預(yù)算及功耗要求等。7 N+ x, `6 A9 Y
    1& B. ?# o3 S- i$ o* e! g4 n0 V7 ^
    STM32片外RAM接口與配置: Y/ b: \2 a0 i
    STM32 大多通過以下接口訪問片外 RAM:
    - p) e" r1 ^5 F/ ?
  • FSMC(Flexible Static Memory Controller):適用于 STM32F1、STM32F4 系列,支持靜態(tài)存儲器(如 SRAM 和 PSRAM)。
  • FMC(Flexible Memory Controller):通常用于 STM32F4、STM32F7、STM32H7 系列,支持 SDRAM 和 SRAM 等。
    6 |, X: T: }* A4 c

    6 E) A& I0 t; c$ ]1 X7 @配置流程:% S: H, u. v7 Y6 a% v; Q0 G& L
  • 引腳配置:將 RAM 的地址線、數(shù)據(jù)線與 STM32 的相應(yīng)引腳連接,并通過 STM32CubeMX 或手動配置 GPIO。
  • 時鐘配置:啟用 FMC/FSMC 控制器的時鐘。
  • 初始化配置:在程序中設(shè)置時序、控制器參數(shù),初始化外部 RAM。! L& A8 k( g" E8 u$ b: v$ I

    7 u5 K5 l4 K2 l1 m  m5 r; W9 P/ B2
    . k; u1 i3 `7 U配置堆到片外 RAM3 T5 ]4 t" l* v& M* }
    STM32 系統(tǒng)中堆的分配主要在鏈接文件(linker script)中進行。步驟如下:
    1 |$ S1 H1 ], H& U5 |0 X5 f4 v1 p4 W3 Z
    修改鏈接文件4 i& b# T/ l" @5 x: n$ f7 x' U, I
    通常 .ld 文件(如 STM32F4xx.ld)定義了各個內(nèi)存段位置和大小。在默認(rèn)情況下,堆通常在 RAM 段內(nèi)。. i* Z/ K" s/ q2 T5 Z$ M# L+ R

    - @  `) N/ J! t  W' a. J1 P要將堆放到片外 RAM,可以新建一個內(nèi)存段并修改相關(guān)配置。
    $ z6 A/ J5 p: S/ t# I" S7 y* w8 ?# ]8 U: i! ]' p0 ]
    定義片外 RAM 段
    8 H. C' e' u# o3 |1 u
  • MEMORY{    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K    EXTRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 8M}
    - k: i4 E9 v3 h9 q分配堆到 EXTRAM 段:在鏈接文件中添加以下內(nèi)容:9 C' G4 I& Z0 ?/ \& A) X% ?

    3 i  f* Y5 v6 j0 z
  • _estack = ORIGIN(RAM) + LENGTH(RAM);   /* 內(nèi)部RAM的堆棧頂 */_heap_base = ORIGIN(EXTRAM);_heap_size = LENGTH(EXTRAM);
    2 O7 t, M# o6 \修改系統(tǒng)初始化代碼
    8 u9 U  Z; z# T6 s; m有些 STM32 平臺會在啟動文件(如 startup_stm32f4xx.s)或 C 文件中初始化堆位置。根據(jù)新的堆地址,確保系統(tǒng)初始化時設(shè)置正確的堆地址范圍。7 H4 U2 w* ]7 K2 z
    " E: a( I% W  E& ?. y0 K( N: k
    在 STM32 的 AI 處理、圖像處理、無線通信等對內(nèi)存需求高的場景下,將堆放在片外 RAM 可以大幅度提升系統(tǒng)的可用內(nèi)存,使 STM32 適應(yīng)更復(fù)雜的任務(wù)。
    8 C) m0 }3 I+ j$ K
    6 S" m2 n6 f9 f0 \由于片外 RAM 的速度通常不如片內(nèi) RAM 快,建議使用片外 RAM 存儲相對大而少頻繁訪問的數(shù)據(jù),片內(nèi) RAM 存儲實時性要求高的數(shù)據(jù)。
    , d6 r: z, T9 M
    0 u5 U# _4 k* [1 f5 c# L可以通過 DMA 訪問片外 RAM,降低 CPU 的負載,提高數(shù)據(jù)傳輸效率。
    : k  u, L  w' T6 O5 k) R, ]+ p* a8 p9 ]
    監(jiān)控和調(diào)試外部 RAM 的分配情況(如 STM32CubeIDE 的實時內(nèi)存監(jiān)視器)可以確保分配正常、數(shù)據(jù)完整性良好。2 u0 s+ A4 Z" a- i4 u# u3 U& G/ t
    - D, o$ X/ O" T+ {; A8 D
    . ]8 x! x" z  Q
    點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表