STM32G474单片机开发入门(二十四)华邦W25Q32 SPI FLASH实战含源码
本文对W25Q32 SPI FLASH的原理,指令,通讯时序等进行讲解,通过STM32G474RET6单片机对W25Q32 进行数据读写实验。采用硬件SPI通讯方式。
文章目录
一.概要
前面我们介绍过FLASH,是单片机内部的FLASH,只有512K字节大小,我们如果要存大量的数据,就需要用到外部的FLASH。FLASH是一种存储芯片,通过程序可以修改数据,即平时所说的“闪存”。
FLASH闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何FLASH器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
SPI Flash使用SPI接口进行数据传输,采用一种主从模式。主控制器通过发送命令和地址来访问SPI Flash,然后接收或写入数据。SPI Flash在接收到命令后,将相应的数据返回给主控制器。
SPI Flash的读取速度相对较慢,不支持直接执行代码。因此,它更适合用于存储配置数据、固件升级或数据存储等需要大容量存储但不需要频繁读取的应用。
本文对W25Q32 SPI FLASH的原理,指令,通讯时序等进行讲解,并通过STM32G474RET6单片机对W25Q32 进行数据读写实验。

二.W25Q32 SPI FLASH主要参数
FLASH芯片型号:W25Q32JVSSIQ
制造商:Winbond
产品种类:SPI NOR FLASH
封装 :SOIC-8
系列:W25Q32JV
存储容量:32 Mbit
最大时钟频率:133 MHz
接口类型:SPI
数据总线宽度:8 bit
电源电压: 2.7~3.6 V
电源电流—最大值: 25 mA
最小工作温度: - 40°C~85°C
模块接口说明:
1.VCC 供电电源 3.3V
2.CS SPI通讯CS引脚
3.DO SPI通讯MISO引脚
4.GND 电源地
5.CLK SPI通讯CLK引脚
6.DI SPI通讯MOSI引脚

三.W25Q32 SPI FLASH芯片介绍
引脚定义

1.W25Q32 芯片内部框图

如上图所示:
W25Q32的存储单位
Page(页)
256字节,编程最小单位(向FLASH写入内容),一次最多编程256字节。
Sector(扇区)
擦除的最小单位,1个Sector一般包含16个Page,即4KB。
Block(块)
包含16个Sector,块擦除可以32KB(半块)、64KB(整块)两种擦除方式。
2.W25Q32 芯片指令表格
下图是指令表格,每个不同的指令所发的字节数量是不同的,第一个字节发送的都是命令号,比如擦除指令,擦除第0个Sector,SPI所发送的内容是0x20,0x00,0x00,0x00这四个字节。

3.W25Q32 芯片通讯时序
我们以读数据为例,解析下通讯时序,根据SPI通讯规则,CPOL为0,CPHA为0,MCU提供CLK,跟CS控制。
根据指令表格,读的命令4字节内容,是0x03+3字节地址,就能获取到对应地址的数据内容,数据内容是1字节。

四.STM32G474RET6驱动W25Q32 SPI FLASH读写实验
1. 硬件准备
STLINK接STM32G474RET6开发板,STLINK接电脑USB口,用6根杜邦线把开发板3.3V 与模块VCC,开发板GND与模块GND,开发板PA4 与模块CS, 开发板PA6 与模块DO,开发板PA7与模块DI,开发板PA5与模块CLK相连。
2.创建CubeMX工程
如下图所示,打开STM32CubeMX软件,新建工程。
如下图所示,Part Number处输入STM32G474RE,再双击就创建新的工程。
如下图所示,配置下载口引脚,PA13为SWD的SWDIO脚,PA14为SWD的SWCLK脚。
如下图所示,配置SPI1,PA5,PA6,PA7为SPI引脚,速度2.6MHZ左右,CS片选采用PA4引脚软件方式。
如下图所示,PA4配置成输出。
如下图所示,配置系统主频170Mhz,使用外部8MHZ晶振。
配置工程文件名,保存路径,KEIL5工程输出方式,生成工程。

如下图所示,增加FLASH驱动代码,向FLASH的0地址写入数据0x55,再从FLASH的0地址读取数据。
如下图所示,FLASH的数据读写驱动,采用SPI硬件驱动代码。
主要代码如下
uint32_t FlashJedecid,FlashDeviceid;//存储ID变量
extern void Flash_TestDataInit(void);
extern uint32_t spi_flash_read_id(void);
extern uint16_t SFLASH_ReadID(void);
uint8_t ReadBuff[10],WriteBuff[10]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};//数据存储数组
extern void Flash_ReadSomeBytes(uint8_t *ucpBuffer, uint32_t _ulReadAddr, uint16_t _usNByte);
extern void Flash_WriteSomeBytes(uint8_t *ucpBuffer, uint32_t _ulWriteAddr, uint16_t _usNByte);
extern void Flash_WriteSR(uint8_t _ucByte);
extern uint8_t Flash_ReadSR(void);
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//8M外部晶振,170MHZ系统主频
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();//PA4配置成输出
MX_SPI1_Init();//SPI1配置,PA5:SPI1_SCK,PA6:SPI1_MISO,PA7:SPI1_MOSI
/* USER CODE BEGIN 2 */
FlashJedecid = spi_flash_read_id();//读取Jedecid
FlashDeviceid=SFLASH_ReadID();//读取Device ID
/* USER CODE END 2 */
Flash_ReadSomeBytes(ReadBuff,0,8);//从FLASH 0地址读取8字节内容放入ReadBuff数组
Flash_WriteSR(0x42);//解除保护
HAL_Delay(100);
Flash_ReadSR();//读状态寄存器
Flash_WriteSomeBytes(WriteBuff,0,8);//把WriteBuff数组中的内容写入FLASH 0地址
HAL_Delay(100);
Flash_ReadSomeBytes(ReadBuff,0,8);//从FLASH 0地址读取8字节内容放入ReadBuff数组
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.实验结果
在Keil5环境下全速运行,查看程序ReadBuff数组8字节内容,从FLASH中读出来的内容是0x55,说明FLASH读写没问题。
五.小结
SPI Flash广泛应用于各种产品中,如智能手机、平板电脑、路由器、网络设备、工业控制系统、汽车电子、穿戴设备等。由于其灵活性和可靠性,SPI Flash成为许多嵌入式系统首选的存储解决方案之一。
更多推荐



所有评论(0)