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

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

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

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

[復制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-24 08:03:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
( L8 j0 c+ J' o3 ~7 L5 Q$ ]% J# N: k
點擊上方藍色字體,關(guān)注我們
$ g3 y! D+ L7 G: B8 B% TSTM32 系列的片上 RAM(內(nèi)部 SRAM)通常在幾十到幾百 KB 范圍內(nèi),對于需要大量內(nèi)存的應(yīng)用(例如圖像處理、大量數(shù)據(jù)緩存、或復雜的數(shù)據(jù)結(jié)構(gòu)管理等),這些片內(nèi) RAM 往往不夠用。& ^: V' ?2 f( A' j

4 s6 l  N* d+ _0 V: M4 D3 T # N/ L' W7 ?/ O8 S9 x! P$ g  T0 w
而使用片外 RAM,可以讓系統(tǒng)擁有更大容量的堆區(qū)域,滿足內(nèi)存需求。' V/ ]: B; ~& W: V+ O5 E

; r# Z5 d; u( `+ m4 I9 OSTM32 支持多種片外 RAM,如:
+ r( b. d" o3 H* Z8 W% B/ b
  • SDRAM:速度快,容量大,適合頻繁訪問的應(yīng)用,但相對較復雜,通常需要較多的引腳。
  • SRAM:相對較慢但結(jié)構(gòu)簡單,適合中小容量需求。
  • PSRAM:成本低、接口簡單,適用于一些中等容量的需求。, K, s( ^- r. r7 ^; \9 h: x( I
    % J0 K) g* I. @# ?! W- n0 R
    選擇合適的片外 RAM 類型取決于應(yīng)用的具體需求、速度要求、預(yù)算及功耗要求等。; K& Y& H% ?( _- Y7 v# T
    19 q( g/ J/ \) H1 K9 ~" R
    STM32片外RAM接口與配置7 Y8 ^/ u" {. D. y
    STM32 大多通過以下接口訪問片外 RAM:. Q# f; {+ U: d+ I
  • FSMC(Flexible Static Memory Controller):適用于 STM32F1、STM32F4 系列,支持靜態(tài)存儲器(如 SRAM 和 PSRAM)。
  • FMC(Flexible Memory Controller):通常用于 STM32F4、STM32F7、STM32H7 系列,支持 SDRAM 和 SRAM 等。/ j5 R; I. C7 U: Y, R- \( l
    , ?! P* K. V2 c+ \0 D5 S+ K
    配置流程:
    4 ]8 F: b5 Y# O$ i& B2 u. `
  • 引腳配置:將 RAM 的地址線、數(shù)據(jù)線與 STM32 的相應(yīng)引腳連接,并通過 STM32CubeMX 或手動配置 GPIO。
  • 時鐘配置:啟用 FMC/FSMC 控制器的時鐘。
  • 初始化配置:在程序中設(shè)置時序、控制器參數(shù),初始化外部 RAM。1 o: A. T) d4 D2 e

    2 i! A, e+ V6 W; `- k  e/ Y2
    ! j# I  o0 m: D! e9 f4 T$ j+ S配置堆到片外 RAM/ \; H/ W( X* {
    STM32 系統(tǒng)中堆的分配主要在鏈接文件(linker script)中進行。步驟如下:
    " [0 H# D8 U- W% n$ d
    " U. A) n! o6 v% K修改鏈接文件
    : F7 n5 @2 S8 V* i; H, G通常 .ld 文件(如 STM32F4xx.ld)定義了各個內(nèi)存段位置和大小。在默認情況下,堆通常在 RAM 段內(nèi)。
    5 [5 g" B8 H4 f2 s2 F. F" F; _! T  L7 k, Q8 O3 y
    要將堆放到片外 RAM,可以新建一個內(nèi)存段并修改相關(guān)配置。3 G/ }1 Z# f4 V: i6 G. C

    6 Q7 U# G8 c6 Y$ W3 w定義片外 RAM 段( O& h$ F8 b) @
  • MEMORY{    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K    EXTRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 8M}* e' f$ R1 `8 N7 L4 P
    分配堆到 EXTRAM 段:在鏈接文件中添加以下內(nèi)容:
    9 W" \" N0 C' ]* h9 ~2 @8 w( D8 N3 V" `  o
  • _estack = ORIGIN(RAM) + LENGTH(RAM);   /* 內(nèi)部RAM的堆棧頂 */_heap_base = ORIGIN(EXTRAM);_heap_size = LENGTH(EXTRAM);
    " \# P+ @  K- H7 w  |0 ]# g修改系統(tǒng)初始化代碼
    & z, I: y" d6 e" V, r% r0 N有些 STM32 平臺會在啟動文件(如 startup_stm32f4xx.s)或 C 文件中初始化堆位置。根據(jù)新的堆地址,確保系統(tǒng)初始化時設(shè)置正確的堆地址范圍。
    ' L& C: P2 M$ A7 r7 J+ I: Y0 M- Q/ A8 \) }+ E  V" Z3 h
    在 STM32 的 AI 處理、圖像處理、無線通信等對內(nèi)存需求高的場景下,將堆放在片外 RAM 可以大幅度提升系統(tǒng)的可用內(nèi)存,使 STM32 適應(yīng)更復雜的任務(wù)。9 k) n. i& z' d) ]6 g
    7 l; `6 ?9 G4 G, i
    由于片外 RAM 的速度通常不如片內(nèi) RAM 快,建議使用片外 RAM 存儲相對大而少頻繁訪問的數(shù)據(jù),片內(nèi) RAM 存儲實時性要求高的數(shù)據(jù)。
    $ _! I# t5 |& F8 u2 t& \7 m4 B- I" D8 m/ L
    可以通過 DMA 訪問片外 RAM,降低 CPU 的負載,提高數(shù)據(jù)傳輸效率。% `# y. b& L5 u  ?' I% ?3 \9 I3 l

    * x& A  Q6 ^! k% B6 O3 W監(jiān)控和調(diào)試外部 RAM 的分配情況(如 STM32CubeIDE 的實時內(nèi)存監(jiān)視器)可以確保分配正常、數(shù)據(jù)完整性良好。% ^6 E8 ^9 y& q. W) U' {
    & n  `0 R6 a" k- q3 ?7 d

    1 E0 w( P% B, t% P點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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