Flash 是什么?SRAM 是什么?它们的作用、特点、区别、在 STM32 中如何使用?

Flash 是什么?SRAM 是什么?它们的作用、特点、区别、在 STM32 中如何使用?


1. Flash 是什么?

Flash = 闪存(非易失性存储器)

→ 断电后内容不会丢失

→ 在 STM32 里主要存 程序代码 + 常量数据

Flash 的主要作用

  1. 保存程序代码(.text)

    • 你写的 C 语言生成的机器码,就存放在 Flash。
  2. 保存常量(const 变量)

    • 编译期已确定的常量也会放入 Flash。
  3. 保存用户数据(如配置)

    • 如果你需要保存参数(如 wifi 密码、配置信息),可以手动写入 Flash(擦写)。
  4. 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 信息时,你会:

  1. 解锁 Flash(HAL_FLASH_Unlock)

  2. 擦除一个扇区

  3. 写入数据(HAL_FLASH_Program)

  4. 上锁 Flash


2. SRAM 是什么?

SRAM = 静态随机存储器(易失性)

断电就丢数据

→ MCU运行过程中用于存放变量、堆栈、全局数据、运行时临时数据


SRAM 的主要作用

  1. 存放全局变量、静态变量(.data区)

  2. 存放未初始化全局变量(.bss区)

  3. 存放程序运行时的临时变量(栈 Stack)

  4. 存放动态分配的内存(堆 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 程序运行时的数据(变量、栈、堆) ✔ 丢
相关推荐
不能跑的代码不是好代码9 小时前
STM32窗口看门狗(WWDG)知识点及标准库使用指南
stm32·单片机·嵌入式硬件
bingquan33339 小时前
在 Ghidra 中分析STM32裸机固件
stm32·单片机·嵌入式硬件
羽获飞9 小时前
从零开始学嵌入式之STM32——11.STM32---USART串行通讯
stm32·单片机·嵌入式硬件
宵时待雨11 小时前
STM32笔记归纳9:定时器
笔记·stm32·单片机·嵌入式硬件
逐步前行11 小时前
STM32_新建工程(寄存器版)
stm32·单片机·嵌入式硬件
bai54593611 小时前
STM32 CubeIDE 通过PWM占空比控制舵机角度
stm32·单片机·嵌入式硬件
简单中的复杂13 小时前
【避坑指南】RK3576 Linux SDK 编译:解决 Buildroot 卡死在 host-gcc-final 的终极方案
linux·嵌入式硬件
上海合宙LuatOS14 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
LS_learner14 小时前
Snapd和Apt—Linux 上两种完全不同的软件包管理系统
嵌入式硬件
点灯小铭14 小时前
基于51单片机的双档交流电压表设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业