STM32 SPI-Flash片外存储详解|W25Q64读写分区、掉电永久保存、软件SPI适配(工控项目实测)

发布时间:2026/6/26 15:15:32
STM32 SPI-Flash片外存储详解|W25Q64读写分区、掉电永久保存、软件SPI适配(工控项目实测) 一、前言(项目存储痛点)现场项目硬性需求:设备断电重启后,保留校准参数、历史温湿度数据、通讯地址、设备ID。内置存储方案缺陷:STM32F1内部Flash仅64KB/128KB,容量不足以存储长期采集日志。内部Flash擦写寿命仅万次级别,高频采集极易损坏主控闪存。内部Flash操作复杂,需要偏移地址解锁,误操作直接卡死程序。选型方案:外置W25Q64 SPI-Flash,容量8M字节、10万次以上擦写寿命、断电永久保存,搭配软件SPI通信,无硬件SPI引脚冲突,适配全项目布线。二、W25Q64底层存储深度解析2.1 基础硬件参数通信方式:标准SPI模式0(CPOL=0 CPHA=0),完美复用前文软件SPI。存储总容量:8MB = 65536页,每页256字节。分区层级(读写核心):整片 块(32KB) 扇区(4KB) 页(256Byte)。电气特性:断电数据永久保存,保存年限可达20年。2.2 必懂读写规则Flash铁律:只能写0,不能直接写1;改写数据必须先擦除!出厂Flash全部默认电平为0xFF(1),写入数据仅能把1改成0;想要修改旧数据,必须提前擦除对应扇区,还原为0xFF空白区。2.3 三种擦除方式选型(项目按需选用)扇区擦除(4KB):日常参数修改首选,速度快、破坏数据少。块擦除(32KB):批量日志清空使用。整片擦除:出厂初始化、全部数据重置使用,耗时最长。2.4 常用指令码(硬件SPI/软件SPI通用)写使能:0x06 (每次写入前必须开启)页写入:0x02读取数据:0x03扇区擦除:0x20读取忙状态:0x05三、项目硬件架构主控:STM32F103C8T6 标准库。总线复用:共用专栏通用软件SPI总线 hspi1。引脚分配:SCK=PA13、MISO=PA14、MOSI=PA15、FLASH_CS=PA1。业务联动:SHT45采集温湿度 → SPI Flash定时存储 → 上电自动读取历史参数 → 485上传上位机、OLED本地显示。优势:和OLED共用一组SPI总线,独立片选分时通信,互不干扰。四、分层极简驱动代码(依赖前文soft_spi,零重构底层)新增文件:w25q64.h + w25q64.c,完全复用结构体软件SPI,不用改写时序代码。4.1 w25q64.h 头文件#ifndef __W25Q64_H#define __W25Q64_H#include “soft_spi.h”//Flash片选引脚#define