【STM32H743IIT6 系列】理清 xxRAM、xxROM、xxFlash 的核心作用,附 H7 系列五種內存詳解,以及超便捷的內存區域管理方法
引言
在這里會較為詳細的闡述各種類型的存儲器的特點及其之間的差別,以及我們會在STM32單片機上面使用一種超級便捷的方式來管理我們所使用到的內存。
理清 xxRAM、xxROM、xxFlash 的核心作用
三種不同存儲器:RAM、ROM、Flash
這三個總的概括,就使用一個表格來說明吧,表格如下:
| 內存 | 存儲類型 | 核心功能 | 數據保持 | 單片機對應硬件 | 典型存儲內容 |
|---|---|---|---|---|---|
| RAM | 易失性 | 存放動態數據、臨時變量 | 掉電丟失 | DTCM/AXI SRAM / 普通 SRAM | 全局變量、局部變量、棧 / 堆 |
| ROM(概念) | 非易失性 | 只讀存儲(功能) | 掉電不丟 | 由 Flash 實現 | 無獨立硬件,功能同 Flash |
| Flash | 非易失性 | 存放程序代碼、常量 | 掉電不丟 | 片上 Flash(一般0x08000000 起) | 代碼段、const 常量、復位向量表 |
四種 RAM:DRAM、SRAM、SDRAM、MRAM
DRAM
(Dynamic RAM,動態隨機存取存儲器)
- 原理: 利用電容存儲電荷來表示數據(0/1),但電容會漏電,需要定期 “刷新”(每隔幾毫秒充電一次)才能保持數據。
- 特點: 結構簡單(一個晶體管 + 一個電容),密度高(相同體積下容量更大);速度中等(比 SRAM 慢),功耗較高(刷新需要耗電);價格便宜(單位容量成本低)。
- 應用 : PC 的內存(DDR4/DDR5 都是 DRAM 的改進型)、智能手機的運行內存(RAM)等需要大容量臨時存儲的場景。
SRAM
(Static RAM,靜態隨機存取存儲器)
- 原理: 利用觸發器(由多個晶體管組成)存儲數據,無需刷新,只要供電就能保持數據。
- 特點: 速度極快(訪問時間納秒級,比 DRAM 快 10~100 倍);結構復雜(一個 bit 需要 6~8 個晶體管),密度低(容量小);價格高(單位容量成本是 DRAM 的幾倍),功耗中等(無需刷新但晶體管本身耗電)。
- 應用 : CPU 內部的高速緩存(L1/L2/L3 Cache)、STM32 片上 RAM(如 DTCM、SRAM1~4 都是 SRAM)等需要高速訪問的場景。
SDRAM
(Synchronous DRAM,同步動態隨機存取存儲器)
- 原理: 屬于 DRAM 的一種,工作時與 CPU 時鐘同步(數據讀寫按時鐘節拍進行),需要定期刷新。
- 特點: 速度比傳統異步 DRAM 快,容量大(常見 128MB~2GB);需外部控制器(如 STM32 的 FMC 接口),時序配置復雜。
- 應用 : 嵌入式系統擴展大容量臨時存儲,如 STM32 H7 系列外接 SDRAM 用于存放視頻幀、大型緩存數據等。
MRAM
(Magnetoresistive RAM,磁阻式隨機存取存儲器)
- 原理: 利用磁阻效應存儲數據(通過磁場變化改變電阻狀態表示 0/1),非易失性,無需刷新。
- 特點: 速度接近 SRAM,容量接近 DRAM,非易失性(掉電不丟數據);功耗低(無需刷新和電荷維持),壽命長(理論無限次擦寫);成本高(目前還未大規模普及)。
- 應用 : 高端嵌入式系統(如工業控制、汽車電子)需要 “高速 + 非易失” 的場景,替代部分 SRAM 和 Flash 的組合使用
對比
| 特性 | DRAM | SRAM | SDRAM | MRAM |
|---|---|---|---|---|
| 易失性 | 掉電丟失 | 掉電丟失 | 掉電丟失 | 掉電不丟失 |
| 速度 | 中等(幾十納秒) | 極快(幾納秒,接近 CPU 速度) | 比 DRAM 快(同步時鐘優化) | 接近 SRAM(幾納秒) |
| 大小 | GB 級 | MB 級 | 數百 MB~ 數 GB | 目前可達 GB 級,逐步提升 |
| 功耗 | 較高 | 中等 | 略低于 DRAM | 低 |
| 成本 | 低 | 高 | 與 DRAM 接近 | 高(未大規模普及) |
| 應用 | 早期 PC 內存、低端嵌入式設備 | CPU 緩存、STM32 片內 RAM | 嵌入式擴展內存 | 工業控制、汽車電子 |
兩種 Flash:NAND Flash、NOR Flash
NOR Flash
(或非閃存)
原理: 同樣基于浮柵晶體管,非易失性,但內部結構與 NAND 不同。
特點: 隨機訪問速度快(可直接 “按地址讀取”,類似 RAM),支持 “代碼在 Flash 中直接運行”(XIP,eXecute In Place);密度低(容量小),價格高(單位容量成本高),擦寫速度慢(尤其大容量擦除)。
應用: 嵌入式系統的 “程序存儲器”,如 STM32 片上 Flash 幾乎都是 NOR Flash(用于存儲程序代碼、啟動程序),路由器、交換機的固件存儲等;STM32 中片內 Flash(如 0x08000000 起始地址的存儲區域)均為 NOR Flash,支持程序直接在 Flash 中運行(無需加載到 RAM)。
NAND Flash
(與非閃存)
原理: 基于浮柵晶體管存儲電荷,通過電荷是否存在表示數據,屬于非易失性存儲(掉電不丟數據)。
特點: 結構簡單,密度極高(相同體積下容量遠大于 NOR Flash);讀寫速度 “頁級快、隨機慢”(適合連續讀寫,隨機訪問速度差);價格低(單位容量成本是 NOR Flash 的 1/5~1/10),但有 “壞塊” 和 “擦寫次數限制”(通常 10 萬次以上)。
應用: 大容量存儲場景,如 U 盤、SD 卡、固態硬盤(SSD)、嵌入式系統的 “硬盤”(如存儲固件、日志、用戶數據);STM32 中部分型號支持外接 NAND Flash(如 F4/F7/H7 系列),用于擴展大容量非易失性存儲。
對比
| 特性 | NOR Flash | NAND Flash |
|---|---|---|
| 存儲結構 | 并行結構,地址線可直接尋址單個字節 | 串行 / 頁式結構,需按 “塊 - 頁” 層級尋址 |
| 速度 | 隨機訪問快(10~100ns),支持按地址讀單個字節;連續讀寫速度慢 | 隨機訪問慢(需先找塊、再找頁);連續讀寫快(頁級操作,幾十 MB/s) |
| 執行能力 | 支持 XIP(就地執行):程序可直接在 Flash 中運行,無需加載到 RAM | 不支持 XIP:代碼需先加載到 RAM 才能運行 |
| 擦寫特性 | 支持小粒度擦除(扇區級,如 4KB/8KB),部分支持字節級修改 | 必須 “先擦除再寫入”,擦除粒度大(塊級,如 128KB/256KB),僅支持頁級寫入 |
| 容量與密度 | 密度低,單芯片容量小(通常 1MB~1GB) | 密度高,單芯片容量大(通常 8GB~1TB,甚至更高) |
| 成本 | 單位容量成本高(約為 NAND 的 5~10 倍) | 單位容量成本低,性價比高 |
| 引腳與接口 | 引腳多(需地址線、數據線分離),接口復雜 | 引腳少(地址 / 數據復用),接口簡單(如 SPI/NAND、ONFI 接口) |
| 應用 | 小型嵌入式設備的程序存儲、交換機 | 硬盤、手機、平板的內置存儲 |
EEPROM
原理: 通過電信號擦除和寫入數據,非易失性,可字節級擦寫(無需按塊擦除)。
特點: 擦寫方便(支持單個字節修改,無需整塊擦除);容量小(通常 KB 級,最大幾 MB),速度慢(擦寫時間毫秒級),壽命有限(通常 10 萬次擦寫)。
應用: 存儲少量需要頻繁修改的非易失性數據,如設備參數(波特率、地址)、校準數據(傳感器零點)、用戶配置等;STM32 中部分型號內置 EEPROM(如 F1/F4 系列),或通過 “Flash 模擬 EEPROM” 功能實現類似效果(如 H7 系列無獨立 EEPROM,需用 Flash 特定區域模擬)。
H7 系列內存詳解
參考文章:[ST] STM32H7的TCM,SRAM等五塊內存基礎知識
H7的內部內存分為了ITCM,DTCM,AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4和備份SRAM。下圖中分為了三個域:D1 Domain,D2 Domain和D3 Domain。

TCM 區
(Tightly-Coupled Memory 緊密耦合內存)
- ITCM:用于運行指令,也就是程序代碼。
- DTCM:用于數據存取,特點是跟內核速度一樣,而片上RAM的速度基本都達不到這個速度,所以有降頻處理。
AXI SRAM 區
位于D1域,數據帶寬是64bit,掛在A線上。除了D3域中的BDMB主控不能訪問,其它都可以訪問此RAM區。
AXI SRAM
地址:0x2400 0000。
速度:200MHz。
大小:512KB。
用途:用途不限,可以用于用戶應用數據存儲或者LCD顯存。
SRAM1,SRAM2和SRAM3 區
位于D2域,數據帶寬是32bit,掛在AHB總線上。除了D3域中的BDMB主控不能訪問這三塊SRAM,其它都可以訪問這幾個RAM區。
SRAM1
地址:0x3000 0000。
速度:200MHz。
大小:128KB。
用途:用途不限,可用于D2域中的DMA緩沖,也可以當D1域斷電后用于運行程序代碼。
SRAM2
地址:0x3002 0000。
速度:200MHz。
大小:128KB。
用途:用途不限,可用于D2域中的DMA緩沖,也可以用于用戶數據存取。
SRAM3
地址:0x3004 0000。
速度:200MHz。
大小:32KB。
用途:用途不限,主要用于以太網和USB的緩沖。
SRAM4 區
位于D3域,數據帶寬是32bit,掛在AHB總線上,大部分主控都能訪這塊SRAM區。
地址:0x3800 0000。
速度:200MHz。
大小:64KB。
用途:用途不限,可以用于D3域中的DMA緩沖,也可以當D1和D2域進入DStandby待機方式后,繼續保存用戶數據。
Backup SRAM 區
備份RAM區,位于D3域,數據帶寬是32bit,掛在AHB總線上,大部分主控都能訪問這塊SRAM區。
SRAM4
地址:0x3880 0000。
速度:200MHz。
大小:4KB。
用途:用途不限,主要用于系統進入低功耗模式后,繼續保存數據(Vbat引腳外接電池)。
內存時鐘問題
AXI SRAM,SRAM4,ITCM和DTCM可以在上電后直接使用。而SRAM1,SRAM2,SRAM3是需要使能的,但是實際測試發現,不使能也可以正常使用。不過,建議用到時候開啟下時鐘,防止意想不到的問題發生。

RAM 的 DMA 問題
Bus Master總線主控端和Bus Slave設備端的控制互聯:

加粗字體是64位總線(ITCM,DTCM,Flash A,Flash,AXI SRAM,FMC等),普通字體是32位總線。
訪問通路(每個小方塊里面的字符)
任何有數字的表示有訪問通路。
短橫杠“-”表示不可訪問。
有灰色陰影的表示有實用價值的訪問通路。
表格中具體數值所代表的含義
D=direct,
1=via AXI bus matrix,
2=via AHB bus matrix in D2,
3=via AHB bus matrix in D3,
4=via AHB/APB bridge in D1,
5=via AHB/APB bridge in D2,
6=via AHB/APB bridge in D3,
7=via AHBS bus of Cortex-M7,
多個數值組合 = 互連路徑以數字的順序經過多個矩陣或/和橋。
總線訪問類型
普通字體表示32位總線。
斜體表示32位總線主機端/ 64位總線從機端。
粗體表示64位總線。
超便捷的內存區域管理方法
參考文章:【STM32H7教程】第26章 STM32H7的TCM,SRAM等五塊內存的超方便使用方式
一般的內存管理方式
不太注意的話,一般都是在"target dialog"這里簡單管理內存。這種情況下,所有管理工作都是編譯來處理的。

分散加載式管理內存區域
使用分散加載的方式來管理內存,會超級靈活,想用哪一塊就用哪一塊。下面就是超級教程:
在魔術棒的"OutPut"配置中,會生成一個相同名字的 .sct 文件,這個就是這個方法的關鍵,找到它。

第一步
- 取消勾選"Use Memiry Layout from Target Dialog"。
- 點擊"..."找到與輸出文件同名的 .sct 文件(假如你這里沒有顯示的話)。
- 點擊"Edit"打開這個 .sct 文件。

第二步
使用 STM32H7 系列的可以直接將以下程序復制進去。其他系列的單片機則需要稍加修改。
假如不同,你需要修改的有:
- 內存(ROM 或者 RAM)首地址
- 內存大小
點擊查看代碼
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
; 定義加載區域LR_IROM1:起始地址0x08000000,大小0x00200000(2MB)
; 這是整個程序的加載區域,通常對應Flash存儲器
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
; 定義執行區域ER_IROM1:起始地址與加載地址相同(0x08000000),大小2MB
; 存放程序的只讀代碼和常量
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
*.o (RESET, +First) ; 所有目標文件的RESET段,放在最前面(復位向量)
*(InRoot$$Sections) ; 根區域必要的特殊段(如異常向量表)
.ANY (+RO) ; 任何文件的只讀代碼和常量(RO段)
.ANY (+XO) ; 任何文件的可執行代碼(XO段)
}
; 定義DTCM內存區域:起始地址0x20000000,大小0x00020000(128KB)
; DTCM是內核緊密耦合的數據存儲器,訪問速度快
RW_DTCM 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI) ; 任何文件的讀寫數據(RW)和未初始化數據(ZI)
;*(.RAM_D0) ;段選擇器,若不手動選擇,則完全不會被分配到此
}
; 定義AXI SRAM區域:起始地址0x24000000,大小0x00080000(512KB)
; AXI接口的SRAM,通常用于高性能數據訪問
RW_AXI_SRAM 0x24000000 0x00080000 {
.ANY (+RW +ZI) ; 任何文件的讀寫數據和未初始化數據
;*(.RAM_D1) ;段選擇器,若不手動選擇,則完全不會被分配到此
}
; 定義SRAM1~SRAM3區域:起始地址0x30000000,大小0x00048000(288KB)
; 片上靜態存儲器區域1-3
RW_SRAM1_SRAM3 0x30000000 0x00048000 {
.ANY (+RW +ZI) ; 任何文件的讀寫數據和未初始化數據
;*(.RAM_D2) ;段選擇器,若不手動選擇,則完全不會被分配到此
}
; 定義SRAM4區域:起始地址0x38000000,大小0x00010000(64KB)
; 片上靜態存儲器區域4
RW_SRAM4 0x38000000 0x00010000 {
.ANY (+RW +ZI) ; 任何文件的讀寫數據和未初始化數據
;*(.RAM_D3) ;段選擇器,若不手動選擇,則完全不會被分配到此
}
}
; 段選擇器使用案例:
; __attribute__((section (".RAM_D1"))) uint32_t AXISRAMBuf[10];
; __attribute__((section (".RAM_D2"))) uint16_t AXISRAMCount;
;
; 若沒使用段選擇器,其實也可以使用__attribute__來選擇某一內存起始地址進行存儲,不過的話就是不方便管理。
; 若沒有使用段選擇器,那么就會按照分散加載文件中內存區域的定義順序依次分配,
; 直到前面的區域被占滿后才會 “溢出” 到后面的區域。
;
注意:STM32H743系列的單片機的RAM都是992KB的,故AXI SRAM區域最終計算出來只有288KB,并非512KB。

可以看出,RW區也是要存儲到ROM/Flash里面的,在執行映像之前,必須將已初始化的 RW 數據從 ROM 中復制到 RAM 中的執行地址并創建ZI Section(初始化為0的變量區)。
上面的程序注釋中已經詳細說明了這一段程序的作用,其中的加載區域就是程序在Flash中的實際存儲,而運行區域是芯片上電后的運行狀態,通過下面的框圖可以有一個感性的認識:

博客導航
本文來自博客園,作者:膝蓋中箭衛兵,轉載請注明原文鏈接:http://www.rzrgm.cn/Skyrim-sssuuu/p/19141988

浙公網安備 33010602011771號
https://orcid.org/0000-0001-5102-772X