前言:在嵌入式系统中,除了 MCU 内部自带的 Flash 和 SRAM 之外,开发者经常需要扩展额外的非易失性存储器,用于存放较大的数据集、配置表、图形资源或固件。对于基于 STM32F103C8T6(通常被称为 STM32C8T6)的项目而言,W25Qxx 系列 SPI Flash 是最常见的扩展存储器之一。
本篇文章基于 W25Q64 的原理信息展开讲解,同时结合 STM32 的使用特点,让你对外部串行 Flash 的结构、用途及操作注意事项有一个系统且深入的理解。
目录
[1. 为什么 STM32C8T6 需要外部 SPI Flash?](#1. 为什么 STM32C8T6 需要外部 SPI Flash?)
[2. W25Qxx 系列简介](#2. W25Qxx 系列简介)
[3. Nor Flash 与 W25Q64 的存储结构](#3. Nor Flash 与 W25Q64 的存储结构)
[4. W25Q64 的运行时序与通信方式](#4. W25Q64 的运行时序与通信方式)
[4.1 标准 SPI](#4.1 标准 SPI)
[4.2 Dual SPI(双线)](#4.2 Dual SPI(双线))
[4.3 Quad SPI(四线)](#4.3 Quad SPI(四线))
[5. W25Q64 的内部框图](#5. W25Q64 的内部框图)
[6. W25Q64 的操作机制与注意事项(重点)](#6. W25Q64 的操作机制与注意事项(重点))
[6.1 写操作必须先写使能(Write Enable)](#6.1 写操作必须先写使能(Write Enable))
[6.2 Flash 的位只能从 1 → 0,不能从 0 → 1](#6.2 Flash 的位只能从 1 → 0,不能从 0 → 1)
[6.3 写入前必须先擦除(Erase)](#6.3 写入前必须先擦除(Erase))
[6.4 写入跨页会导致覆盖](#6.4 写入跨页会导致覆盖)
[6.5 写入后进入忙状态(Busy)](#6.5 写入后进入忙状态(Busy))
[6.6 读取操作无须写使能](#6.6 读取操作无须写使能)
[7. W25Q64 在 STM32 项目中的常见应用](#7. W25Q64 在 STM32 项目中的常见应用)
[7.1 字体、图标、图片存储](#7.1 字体、图标、图片存储)
[7.2 数据记录](#7.2 数据记录)
[7.3 文件系统](#7.3 文件系统)
[7.4 OTA 固件升级](#7.4 OTA 固件升级)
[7.5 用户配置存储](#7.5 用户配置存储)
[8. 设计硬件时的注意事项](#8. 设计硬件时的注意事项)
[9. 总结](#9. 总结)
1. 为什么 STM32C8T6 需要外部 SPI Flash?
STM32F103C8T6 片内 Flash 仅 64KB,在简单项目中足够,但在以下场景中就显得不足:
-
存储大量图片、字体库(GUI 场景)
-
记录大量运行日志、传感器数据
-
OTA 升级需要双区固件存储
-
存储配置信息、文件系统(如 LittleFS/FATFS)
W25Qxx 系列为上述需求提供了一个低成本且非常易于使用的解决方案。
2. W25Qxx 系列简介
W25Qxx 是 Nor Flash,是一种典型的 SPI 外置闪存,具有以下特点:
-
成本低、结构简单
-
读写速度高
-
掉电不丢数据
-
支持标准 SPI / Dual SPI / Quad SPI
-
寿命长、可靠性高
PPT 中给出的典型存储容量如下(24 位地址):
型号 容量 (Mbit) 容量 (MByte) W25Q40 4 Mbit 0.5 MB W25Q80 8 Mbit 1 MB W25Q16 16 Mbit 2 MB W25Q32 32 Mbit 4 MB W25Q64 64 Mbit 8 MB W25Q128 128 Mbit 16 MB W25Q256 256 Mbit 32 MB
开发板最常见的型号为 W25Q64 ,可提供 8 MB 的存储空间,足以用于绝大部分图形项目和数据记录项目。
3. Nor Flash 与 W25Q64 的存储结构
W25Q64 属于 Nor Flash,其存储结构分层如下:
-
Page(页):256 bytes
-
Sector(扇区):4 KB
-
Block(块):64 KB
-
Chip(整片):8 MB
存储器的擦除、写入都基于这一结构进行。
4. W25Q64 的运行时序与通信方式
W25Q64 通过 SPI 工作,可分为三类接口:
4.1 标准 SPI
-
单线数据输入(MOSI)
-
单线数据输出(MISO)
-
时钟 SCLK
-
片选 CS
4.2 Dual SPI(双线)
部分命令允许使用两条数据线同时传输,读速提高到原来的 2 倍。
4.3 Quad SPI(四线)
四条数据线同时传输,读速可达数百 Mbps,用于高速图形项目。
W25Q64 的最高读取频率可达:
-
80 MHz(标准 SPI)
-
160 MHz(Dual SPI)
-
320 MHz(Quad SPI)
5. W25Q64 的内部框图
PPT 中的框图展示了 W25Q64 的核心结构,包括:
-
指令解析器(Instruction Decoder)
-
寄存器(状态寄存器、配置寄存器等)
-
闪存阵列(Memory Array)
-
地址/数据锁存器(Latch Registers)
-
写入/擦除控制器
-
SPI 接口模块
这些模块协同工作,完成外部 MCU 的读写、擦除、状态查询等操作。
6. W25Q64 的操作机制与注意事项(重点)
Flash 操作不像 RAM 那么自由,其读写存在规则和限制。以下内容对 STM32 访问 SPI Flash至关重要。
6.1 写操作必须先写使能(Write Enable)
Flash 为保护数据避免误写,写入前必须执行:
- 写使能指令(WREN)
这相当于告诉芯片:"我已经准备好要写数据,请开启写权限。"
6.2 Flash 的位只能从 1 → 0,不能从 0 → 1
Flash 的特性决定:
-
写入时只能把某一位从 1 变为 0
-
如果要从 0 变回 1,必须进行 擦除操作
这也是 Flash 不能像 EEPROM 那样随意修改任意字节的原因。
6.3 写入前必须先擦除(Erase)
擦除的最小单位是:
-
4KB 扇区擦除
-
32KB 块擦除
-
64KB 大块擦除
-
整片擦除
擦除后数据全部变为 0xFF(所有位 = 1)。
6.4 写入跨页会导致覆盖
Flash 的写入以 256 字节为一页:
-
只能在同一页内连续写入
-
如果写入数据超过页尾,会回到页首覆盖(即 Page Wrap)
因此在编写驱动时需要格外注意页边界。
6.5 写入后进入忙状态(Busy)
Flash 在执行写入/擦除时,会进入忙状态(Busy):
-
MCU 必须轮询状态寄存器,等待 Busy = 0
-
在 Busy 期间不能执行新的读写操作
否则会导致数据损坏。
6.6 读取操作无须写使能
读操作相比写要简单得多:
-
不需要写使能
-
不会进入忙状态(除了 Flash 正在执行写时无法读取)
-
不存在页大小限制
-
可以读取连续地址
这也是 SPI Flash 的读速度通常比写速度更高的原因。
7. W25Q64 在 STM32 项目中的常见应用
7.1 字体、图标、图片存储
适用于 GUI 项目(如 TFT 屏幕显示)。
7.2 数据记录
万用表、传感器记录仪、黑盒数据记录器。
7.3 文件系统
可挂载 FATFS 或 LittleFS,用作小型存储盘。
7.4 OTA 固件升级
可将新固件存储在外部 Flash,再写入 MCU 内部 Flash。
7.5 用户配置存储
参数、多段标定表、安全密钥等。
8. 设计硬件时的注意事项
在 STM32C8T6 + W25Q64 的电路设计中,需要确保:
-
SPI 信号线走线尽量短,减少干扰
-
加 0.1uF 去耦电容
-
CS 拉高电阻
-
若长线或高速设计,需加串联电阻(22Ω~100Ω)
-
若使用 Quad SPI,需确保 4 条 IO 都能正常连接
9. 总结
W25Q64 作为 STM32 项目中最常用的外部 Flash,具有容量大、速度高、成本低、使用简单等优势。理解其底层原理与操作限制,对于后续编写驱动、构建文件系统、实现 OTA、存储大规模数据等功能具有重要意义。
本篇文章侧重从原理层面总结 W25Q64 的结构、特性及操作注意点,适合作为 STM32C8T6 系列外扩存储器学习路径的基础篇。