STM32CubeMX配置SPI驱动W25Q64 Flash:从零到读写数据的完整避坑指南
第一次接触STM32的SPI外设和W25Q64 Flash芯片时,我踩了不少坑。从CubeMX的参数配置到驱动代码的编写,每一步都可能隐藏着意想不到的问题。这篇文章将带你完整走一遍配置和开发的流程,重点解决那些容易出错的关键环节。
1. SPI基础与W25Q64芯片特性
SPI(Serial Peripheral Interface)是一种高速全双工同步串行通信协议,在嵌入式系统中广泛应用。W25Q64是华邦电子推出的一款8MB容量NOR Flash存储器,采用SPI接口通信。
SPI通信的核心参数:
- CPOL(Clock Polarity):时钟空闲状态电平
- 0:时钟空闲时为低电平
- 1:时钟空闲时为高电平
- CPHA(Clock Phase):数据采样边沿
- 0:在时钟第一个边沿采样
- 1:在时钟第二个边沿采样
W25Q64的存储结构如下:
| 层级 | 大小 | 数量 | 备注 |
|---|---|---|---|
| 全片 | 8MB | 1 | 总容量 |
| 块(Block) | 64KB | 128 | 块擦除单位 |
| 扇区(Sector) | 4KB | 16/块 | 最小擦除单位 |
| 页(Page) | 256B | 16/扇区 | 编程单位 |
特别注意:W25Q64必须在擦除后才能写入数据,擦除后所有位变为1。未擦除直接写入会导致数据异常。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CubeMX配置关键步骤
2.1 SPI外设配置
在CubeMX中配置SPI1为全双工主模式:
- 打开CubeMX,选择对应STM32型号
- 在Connectivity选项卡中启用SPI1
- 配置参数如下:
c复制/* SPI1 parameter settings */
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 4分频
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
关键点说明:
- CPOL/CPHA:必须与W25Q64规格书一致(通常为0/0或1/1)
- 分频值:根据主频选择合适值,确保不超过W25Q64最大时钟频率
- NSS:建议使用软件控制,硬件NSS可能带来额外复杂度
2.2 GPIO配置
除了SPI引脚(SCK/MISO/MOSI),还需要配置一个GPIO作为片选信号(CS
