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 程序运行时的数据(变量、栈、堆) ✔ 丢
相关推荐
Lester_11016 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元6 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133976 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315206 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书6 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang6 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟6 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126916 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315206 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘6 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动