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

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

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

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

[復(fù)制鏈接]

586

主題

586

帖子

3544

積分

四級會員

Rank: 4

積分
3544
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 昨天 08:03 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
0 ]" s+ t, T1 Q2 Y. s6 s# D! _
點擊上方藍(lán)色字體,關(guān)注我們
7 l2 K2 y- ?$ j; g/ }. fSTM32 系列的片上 RAM(內(nèi)部 SRAM)通常在幾十到幾百 KB 范圍內(nèi),對于需要大量內(nèi)存的應(yīng)用(例如圖像處理、大量數(shù)據(jù)緩存、或復(fù)雜的數(shù)據(jù)結(jié)構(gòu)管理等),這些片內(nèi) RAM 往往不夠用。( ~$ h6 @6 K8 S4 o
0 V2 }- p) w5 \" X/ Q" P- I

/ q* w' H. J- X' ]0 Q  r而使用片外 RAM,可以讓系統(tǒng)擁有更大容量的堆區(qū)域,滿足內(nèi)存需求。
0 g2 ?2 f2 J. S3 `! i( d
4 N# p4 D& _& Q- e( g- p0 mSTM32 支持多種片外 RAM,如:
. X) Y' }5 k; E4 C7 j
  • SDRAM:速度快,容量大,適合頻繁訪問的應(yīng)用,但相對較復(fù)雜,通常需要較多的引腳。
  • SRAM:相對較慢但結(jié)構(gòu)簡單,適合中小容量需求。
  • PSRAM:成本低、接口簡單,適用于一些中等容量的需求。2 [& q9 o0 E3 R; G8 Y9 X; z
    / z  a" b( J, d& M& N
    選擇合適的片外 RAM 類型取決于應(yīng)用的具體需求、速度要求、預(yù)算及功耗要求等。
    % Q' a  L- Y; T! D& N8 `4 D4 y1; U# D* y, R3 ^. d
    STM32片外RAM接口與配置. z, e) B4 O& s0 d. D$ V) y
    STM32 大多通過以下接口訪問片外 RAM:+ z' `0 L+ X$ T
  • FSMC(Flexible Static Memory Controller):適用于 STM32F1、STM32F4 系列,支持靜態(tài)存儲器(如 SRAM 和 PSRAM)。
  • FMC(Flexible Memory Controller):通常用于 STM32F4、STM32F7、STM32H7 系列,支持 SDRAM 和 SRAM 等。  W: o) U, z" g

      ]( S$ m/ o0 O: o4 Y5 Y9 {配置流程:2 w# @! L5 {& p( M' b
  • 引腳配置:將 RAM 的地址線、數(shù)據(jù)線與 STM32 的相應(yīng)引腳連接,并通過 STM32CubeMX 或手動配置 GPIO。
  • 時鐘配置:啟用 FMC/FSMC 控制器的時鐘。
  • 初始化配置:在程序中設(shè)置時序、控制器參數(shù),初始化外部 RAM。
    & K8 A, i  }! c" ^

    & m0 d" @: t' @0 p9 N: d2! ~4 R# \1 D+ x; \! e8 D% P0 {
    配置堆到片外 RAM3 ^/ ^; ]! ^. k: X5 h0 [& |7 J( N" I
    STM32 系統(tǒng)中堆的分配主要在鏈接文件(linker script)中進(jìn)行。步驟如下:
    " z3 s- i, Q" }- r4 I, h1 v& x& P$ H: L$ a; s6 v) ?
    修改鏈接文件
    # I: y% h7 I. _- l  U5 J& T通常 .ld 文件(如 STM32F4xx.ld)定義了各個內(nèi)存段位置和大小。在默認(rèn)情況下,堆通常在 RAM 段內(nèi)。- k# }! ]5 c' n
    6 `5 b4 r, t% w. q; J  Z# V
    要將堆放到片外 RAM,可以新建一個內(nèi)存段并修改相關(guān)配置。
    / x/ k$ S7 w9 V7 T: H/ p# n4 K$ A  w7 \
    定義片外 RAM 段
    . l1 k( R" S  c7 q, Z7 S5 F) Z
  • MEMORY{    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K    EXTRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 8M}8 X1 p- w9 b$ F9 u
    分配堆到 EXTRAM 段:在鏈接文件中添加以下內(nèi)容:# d, `/ m3 n! L4 v6 i
    5 N2 \$ J. f/ O( E& S
  • _estack = ORIGIN(RAM) + LENGTH(RAM);   /* 內(nèi)部RAM的堆棧頂 */_heap_base = ORIGIN(EXTRAM);_heap_size = LENGTH(EXTRAM);
      y# ~( w8 h" S2 i, g8 H修改系統(tǒng)初始化代碼4 ~, u+ j" z; q3 P6 J& o
    有些 STM32 平臺會在啟動文件(如 startup_stm32f4xx.s)或 C 文件中初始化堆位置。根據(jù)新的堆地址,確保系統(tǒng)初始化時設(shè)置正確的堆地址范圍。8 Y& A, p' b* i( c) d8 t0 |4 X: Q9 A+ i

    7 }& T7 I& J0 I. L在 STM32 的 AI 處理、圖像處理、無線通信等對內(nèi)存需求高的場景下,將堆放在片外 RAM 可以大幅度提升系統(tǒng)的可用內(nèi)存,使 STM32 適應(yīng)更復(fù)雜的任務(wù)。
      C% r: R3 X0 R  R# T1 U* p8 Q2 i' W; y
    由于片外 RAM 的速度通常不如片內(nèi) RAM 快,建議使用片外 RAM 存儲相對大而少頻繁訪問的數(shù)據(jù),片內(nèi) RAM 存儲實時性要求高的數(shù)據(jù)。6 ]8 Z7 U. L3 D

    * ^+ q* m4 J& @! M' t0 T& V可以通過 DMA 訪問片外 RAM,降低 CPU 的負(fù)載,提高數(shù)據(jù)傳輸效率。4 v3 e$ z5 c; t
    6 ^# g* H* v! n$ c, W
    監(jiān)控和調(diào)試外部 RAM 的分配情況(如 STM32CubeIDE 的實時內(nèi)存監(jiān)視器)可以確保分配正常、數(shù)據(jù)完整性良好。7 K6 q) R+ D, {9 f5 H
    2 _# z0 v! o9 }8 n+ @& y
    - I  N% u* v1 Z7 n! m! B% y
    點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

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

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

    本版積分規(guī)則


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