Flash 是什么?SRAM 是什么?它们的作用、特点、区别、在 STM32 中如何使用?
✅ 1. Flash 是什么?
Flash = 闪存(非易失性存储器)
→ 断电后内容不会丢失
→ 在 STM32 里主要存 程序代码 + 常量数据
Flash 的主要作用
-
保存程序代码(.text)
- 你写的 C 语言生成的机器码,就存放在 Flash。
-
保存常量(const 变量)
- 编译期已确定的常量也会放入 Flash。
-
保存用户数据(如配置)
- 如果你需要保存参数(如 wifi 密码、配置信息),可以手动写入 Flash(擦写)。
-
Bootloader / 应用区分存放
Flash 的特点
| 特性 | Flash |
|---|---|
| 是否掉电消失 | ❌ 不会 |
| 读取速度 | 中等 |
| 写入方式 | 必须"先擦再写" |
| 擦写粒度 | 页(Page)或扇区(Sector) |
| 寿命 | 有限(约 1万 次擦写) |
| 用途 | 保存程序和长期数据 |
闪存结构例子(STM32F4)
以 STM32F439ZIY6S 为例(你的项目有用到):
-
Flash 总容量:2MB
-
分成多个 Sector(扇区)
-
程序一般写在 Sector 0 开始
🧩 Flash 在 STM32 程序中的使用方式
一般你不用手动操作 Flash:
-
Keil / GCC 链接脚本自动把程序写到 Flash。
-
烧录程序时,ST-Link/JLink 就会把编译好的 bin/hex 烧到 Flash。
手动写入 Flash 的典型场景:
例如保存 WiFi 密码、ID 信息时,你会:
-
解锁 Flash(HAL_FLASH_Unlock)
-
擦除一个扇区
-
写入数据(HAL_FLASH_Program)
-
上锁 Flash
✅ 2. SRAM 是什么?
SRAM = 静态随机存储器(易失性)
→ 断电就丢数据
→ MCU运行过程中用于存放变量、堆栈、全局数据、运行时临时数据
SRAM 的主要作用
-
存放全局变量、静态变量(.data区)
-
存放未初始化全局变量(.bss区)
-
存放程序运行时的临时变量(栈 Stack)
-
存放动态分配的内存(堆 Heap)
- malloc/new 分配的内存都在 SRAM
SRAM 特点
| 特性 | SRAM |
|---|---|
| 是否掉电消失 | ✔ 会 |
| 读取速度 | 非常快 |
| 写入速度 | 非常快 |
| 擦写需求 | 不需要(直接写) |
| 用途 | 程序运行时数据 |
SRAM 大小例子(你给的芯片)
● STM32F439ZIY6S
-
256KB SRAM
-
有 TCM(高速 RAM),可作为数据缓存
● STM32F103VET6
- 64KB SRAM
⚠️ SRAM 比 Flash 少得多,所以你要小心使用内存,尤其是大数组、动态内存。
🆚 Flash 与 SRAM 的对比总结
| 比较项 | Flash(程序存储) | SRAM(运行内存) |
|---|---|---|
| 断电后数据 | ❌ 保存 | ✔ 丢失 |
| 速度 | 中 | 快 |
| 作用 | 存代码、常量、配置 | 存变量、栈、堆 |
| 擦写方式 | 需"擦除扇区"后写 | 随写随用 |
| 典型大小 | 几百 KB ~ 几 MB | 几十 KB ~ 几百 KB |
| 使用方式 | 烧录程序进去 | 运行时自动分配 |
⭐ 直观理解举例
假设你写程序控制一个智能手环:
Flash:
-
手环固件代码
-
提示语句:"Hello GearFit"
-
保存的蓝牙配对 ID
-
用户设置(亮度、语言)
SRAM:
-
程序运行的局部变量
-
接收缓冲区
-
计算用的临时变量
-
显示数据缓存(帧缓存)
🔧 实际使用示例(STM32 中)
Flash 布局
0x08000000 ← 程序代码(Text)
0x080xxxxxx ← 常量数据(const)
0x080FC000 ← 用户数据(参数存储区)
SRAM 布局
0x20000000 ← 全局变量(.data)
0x2000xxxx ← 未初始化变量(.bss)
0x2001xxxx ← 堆 (malloc/new)
0x2002xxxx ← 栈(stack)
📌 小结(10 秒理解版本)
| 名称 | 作用 | 是否掉电丢失 |
|---|---|---|
| Flash | 放程序、配置、常量 | ❌ 不丢 |
| SRAM | 程序运行时的数据(变量、栈、堆) | ✔ 丢 |