2025年w25q512芯片手册(25q32cs1g芯片)

w25q512芯片手册(25q32cs1g芯片)本章节为大家讲解标准 QSPI 接线方式驱动 W25QXX 实现了查询和 MDMA 两种方式 79 1 初学者重要提示 79 2 W25QXX 硬件设计 79 3 W25QXX 关键知识点整理 重要 79 4 W25QXX 驱动设计 79 5 W25QXX 板级支持包 bsp spi flash c 79 6 W25QXX 驱动移植和使用 79 7 使用例程设计框架 79 8

大家好,我是讯享网,很高兴认识大家。



​​​​

本章节为大家讲解标准QSPI接线方式驱动W25QXX,实现了查询和MDMA两种方式。

79.1 初学者重要提示

79.2 W25QXX硬件设计

79.3 W25QXX关键知识点整理(重要)

79.4 W25QXX驱动设计

79.5 W25QXX板级支持包(bsp_spi_flash.c)

79.6 W25QXX驱动移植和使用

79.7 使用例程设计框架

79.8 实验例程说明(MDK)

79.9 实验例程说明(IAR)

79.10 总结

 

 

 1、 学习本章节前,务必优先学习第79章。

 2、 W25Q256JV属于NOR型Flash存储芯片。

 3、 W25Q256JV手册下载地址:​​链接​​ (这是一个超链接),当前章节配套例子的Doc文件件里面也有存放。

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_数据
讯享网

 4、 本章第3小节整理的知识点比较重要,务必要了解下,特别是页编程和页回卷。

 5、 对QSPI Flash W25Q256JV的不同接线方式(1线,2线或者4线,这里的线是指的数据线),编程命令是不同的。

 6、 W25Q256JV最高支持133MHz。

 7、 STM32H7驱动QSPI Flash的4线DMA模式,读速度48MB/S左右。

 8、 内存映射模式下,最后一个字节无法正常读取的解决办法

 9、 本章配套例子的DMA是采用性能最强的MDMA。

STM32H7驱动W25Q256JV的硬件设计如下:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_#define_02

关于这个原理图,要了解到以下几个知识:

  • V7开发板实际外接的芯片是W25Q256JV。
  • CS片选最好接上拉电阻,防止意外操作。
  • W25Q256的WP引脚用于写保护,低电平有效性,当前是将其作为4方式的IO2。
  • HOLD引脚也是低电平有效,当前是将其接到高电平。此引脚的作用是CS片选低电平时,DO引脚输出高阻,忽略CLK和DI引脚上的信号。当前是将其作为4线方式的IO3。

驱动W25QXX前要先了解下这个芯片的相关信息。

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_数据_03

  • W25Q256JV是32MB(256Mbit)。
  • W25Q256JV支持标准SPI(单线SPI),用到引脚CLK、CS,DI和DO引脚。

支持两线SPI,用到引脚CLK、CS、IO0、IO1

支持四线SPI,用到引脚CLK、CS、IO0、IO1,IO2、IO3

(注:这里几线的意思是几个数据线)。

  • W25Q256JV支持的最高时钟是133MHz。
  • 每个扇区最少支持10万次擦写,可以保存20年数据。
  • 页大小是256字节,支持页编程,也就是一次编写256个字节,也可以一个一个编写。
  • 支持4KB为单位的扇区擦除,也可以32KB或者64KB为单位的擦除。

整体框图如下:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_引脚_04

W25Q256JV:

  • 有512个Block,每个Block大小64KB。
  • 每个Block有16个Sector,每个Sector大小4KB。
  • 每个Sector有16个Page,每个Page大小是256字节。

使用W25Q256的接线方式不同,使用的命令也有所不同,使用的时候务必要注意,当前我们使用的QSPI,即4线SPI,并且用的4字节地址模式,使用的命令如下:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_#define_05

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_数据_06

当前主要用到如下几个命令:

SPI Flash仅支持页编程(页大小256字节),所有其它大批量数据的写入都是以页为单位。这里注意所说的页编程含义,页编程分为以下三步(伪代码):

页编程的含义恰恰就体现在第3步了,如果用户设置的“起始地址+数据长度”所确定的地址范围超过了此起始地址所在的页,地址自增不会超过页范围,而是重新回到了此页的首地进行编写。这一点要特别的注意。如果用户不需要使用地址自增效果,那么直接指定地址进行编写即可。可以任意指定地址进行编写,编写前一定要进行擦除。

比如下面就是页内操作(使用前已经进行了扇区擦除,每次擦除最少擦除一个扇区4KB):

  • 从250地址开始写入10个字节数据 PageWrite(tempbuf,  250,  10);(因为一旦写入超过地址255,就会从0地址开始重新写)。
  • 向地址20写入1个字节数据:PageWrite(&temp1,  20,  1);
  • 向地址30写入1个字节数据:PageWrite(&temp2,  30,  1);
  • 向地址510写入1个字节数据:PageWrite(&temp3,  510,  1) (这里已经是写到下一页了)

下面是将从0地址到511地址读取出来的512个字节数据,一行32字节。

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_引脚_07

SPI Flash的擦除支持扇区擦除(4KB),块擦除(32KB或者64KB)以及整个芯片擦除。对于扇区擦除和块擦除,使用的时候要注意一点,一般情况下,只需用户给出扇区或者块的首地址即可。

如果给的不是扇区或者块的首地址也没有关系的,只要此地址是在扇区或者块的范围内,此扇区或者块也可以被正确擦除。不过建议使用时给首地址,方便管理。

这里我们主要了解擦写耗时和支持的时钟速度,下面是擦写时间参数:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_数据_08

  • 页编程时间:典型值0.4ms,最大值3ms。
  • 扇区擦除时间(4KB):典型值50ms,最大值400ms。
  • 块擦除时间(32KB):典型值120ms,最大值1600ms。
  • 块擦除时间(64KB):典型值150ms,最大值2000ms。
  • 整个芯片擦除时间:典型值80s,最大值400s。

 

支持的速度参数如下:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_#define_09

可以看到最高支持的读时钟(使用命令03H)速度是50MHz,其它命令速度可以做到133MHz。

W25QXX的程序驱动框架设计如下:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_引脚_10

有了这个框图,程序设计就比较好理解了。

QSPI总线配置如下:

QSPI这部分配置,要特别注意Flash大小的设置,这里做了特别处理,本来是应该填入QSPI_FLASH_SIZE-1,而我们实际上填入的是QSPI_FLASH_SIZE,主要是因为内存映射模式下,最后一个字节访问有问题。

本章提供了QSPI Flash的查询和MDMA两种方式的例子,驱动的区别是调用的API不同,查询方式调用的API是HAL_QSPI_Transmit和HAL_QSPI_Receive,而DMA方式使用的API是HAL_QSPI_Transmit_DMA和HAL_QSPI_Receive_DMA。

注:这里以查询方式的API进行说明,DMA方式是一样的。

W25QXX的读取功能是发送的4线快速读取指令0xEC,设置任意地址都可以读取数据,只要不超过芯片容量即可(如果采用的DMA方式,限制每次最大读取65536字节)。

此时函数使用的指令0xEC对应的W25Q256JV手册说明,注意红色方框位置:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_引脚_11

左上角的1-4-4就是指令阶段使用1个IO,地址阶段使用4个IO,数据阶段也是使用4个IO,并且采用的4字节地址方式,反映到程序里面就是:

sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.AddressMode = QSPI_ADDRESS_4_LINES;
sCommand.AddressSize = QSPI_ADDRESS_32_BITS;
sCommand.DataMode = QSPI_DATA_4_LINES;

注:这里以查询方式的API进行说明,DMA方式是一样的。

下面实现了一个页编程函数:

此时函数使用的指令0x34对应的W25Q256JV手册说明,注意红色方框位置:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_引脚_12

左上角的1-4-4就是指令阶段使用1个IO,地址阶段使用4个IO,数据阶段也是使用4个IO,并且采用的4字节地址方式,反映到程序里面就是:

sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.AddressMode = QSPI_ADDRESS_4_LINES;
sCommand.AddressSize = QSPI_ADDRESS_32_BITS;
sCommand.DataMode = QSPI_DATA_4_LINES;

注:这里以查询方式的API进行说明,DMA方式是一样的。

通过发送“扇区擦除命令+扇区地址”即可完成相应扇区的擦除,擦除的扇区大小是4KB。

此时函数使用的指令0x21对应的W25Q256JV手册说明,注意红色方框位置:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_数据_13

左上角的1-1-1就是指令阶段使用1个IO,地址阶段使用1个IO,数据阶段也是使用1个IO,并且采用的4字节地址方式,反映到程序里面就是:

sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;

 sCommand.AddressMode = QSPI_ADDRESS_1_LINES;

 sCommand.AddressSize = QSPI_ADDRESS_32_BITS;

sCommand.DataMode = QSPI_DATA_1_LINES;

注:这里以查询方式的API进行说明,DMA方式是一样的。

整个芯片的擦除可以通过擦除各个扇区来实现,也可以调用专门的整个芯片擦除指令实现。下面实现方法是发送整个芯片擦除命令实现:

此时函数使用的指令0xC7对应的W25Q256JV手册说明,注意红色方框位置:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_#define_14

左上角的1-1-1就是指令阶段使用1个IO,地址阶段使用1个IO,数据阶段也是使用1个IO,并且采用的4字节地址方式,反应到程序里面就是:

sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.AddressMode = QSPI_ADDRESS_1_LINES;
sCommand.AddressSize = QSPI_ADDRESS_32_BITS;
sCommand.DataMode = QSPI_DATA_1_LINES;

擦除用不到数据阶段,sCommand.DataMode  = QSPI_DATA_NONE即可。

注:这里以查询方式的API进行说明,DMA方式是一样的。

通过内存映射模式,就可以像使用内部Flash一样使用W25QXX,代码实现如下:

此时函数使用的指令0xEC对应的W25Q256JV手册说明,注意红色方框位置:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_#define_15

左上角的1-4-4就是指令阶段使用1个IO,地址阶段使用4个IO,数据阶段也是使用4个IO,采用的4字节地址方式,反应到程序里面就是:

sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.AddressMode = QSPI_ADDRESS_4_LINES;
sCommand.AddressSize = QSPI_ADDRESS_32_BITS;
sCommand.DataMode = QSPI_DATA_4_LINES;

如果使用MDMA方式的话,可以使用TCM RAM,此时不用考虑Cache问题。如果使用的是其它RAM空间,要考虑Cache问题。因为MDMA和CPU同时访问DMA缓冲造成的数据一致性问题,将这块空间关闭读Cache和写Cache,比如使用的AXI SRAM,这样可以方便大家做测试,测试通过后,再根据需要开启Cache。

W25QXX驱动文件bsp_qspi_w25q256.c主要实现了如下几个API供用户调用:

  • QSPI_ReadBuffer
  • QSPI_WriteBuffer
  • QSPI_EraseSector
  • QSPI_EraseChip
  • QSPI_MemoryMapped

函数原型:

void QSPI_ReadBuffer(uint8_t * _pBuf, uint32_t _uiReadAddr, uint32_t _uiSize);

函数描述:

此函数主要用于从QSPI Flash读取数据,支持任意大小,任意地址,不超过芯片容量即可(如果使用DMA方式,每次最大65536字节)。

函数参数:

  • 第1个参数用于存储从QSPI Flash读取的数据。
  • 第2个参数是读取地址,不可以超过芯片容量。
  • 第3个参数是读取的数据大小,读取范围不可以超过芯片容量。

函数原型:

uint8_t QSPI_WriteBuffer(uint8_t *_pBuf, uint32_t _uiWriteAddr, uint16_t _usWriteSize);

函数描述:

页编程,页大小256字节,任意页都可以写入。注意使用前,务必保证相应页已经做了擦除操作。

函数参数:

  • 第1个参数是源数据缓冲区。
  • 第2个参数是目标区域首地址,即页首地址,比如0, 256, 512等。
  • 第3个参数是数据个数,不能超过页面大小,范围1 – 256,单位字节个数。
  • 返回值,返回1表示成功,返回0表示失败。

函数原型:

void QSPI_EraseSector(uint32_t _uiSectorAddr)

函数描述:

此函数主要用于扇区擦除,一个扇区大小是4KB。

函数参数:

  • 第1个参数是扇区地址,比如擦除扇区0,此处填0x0000,擦除扇区1,此处填0x1000,擦除扇区2,此处填0x2000,以此类推。

函数原型:

void QSPI_EraseChip(void)

函数描述:

此函数主要用于整个芯片擦除。

函数原型:

void QSPI_MemoryMapped(void)

函数描述:

调用了此函数就可以像使用内部Flash一样使用外部Flash。

W25QXX移植步骤如下:

  • 第1步:复制bsp_qspi_w25q256.c, bsp_qspi_w25q256.h到自己的工程目录,并添加到工程里面。
  • 第2步:根据使用的QSPI引脚,时钟等,修改bsp_qspi_w25q256.c文件开头的宏定义。
  • 根据使用的QSPI命令不同,容量不同等,修改bsp_qspi_w25q256.h头文件
  • 第4步:如果使用MDMA方式的话,可以使用TCM RAM,此时不用考虑Cache问题。如果使用的是其它RAM空间,要考虑Cache问题。因为MDMA和CPU同时访问DMA缓冲造成的数据一致性问题,将这块空间关闭读Cache和写Cache,比如使用的AXI SRAM:
  • 第5步:初始化QSPI。
  • 第6步:QSPI Flash驱动主要用到HAL库的SPI驱动文件,简单省事些可以添加所有HAL库C源文件进来。
  • 第7步:应用方法看本章节配套例子即可。

通过程序设计框架,让大家先对配套例程有一个全面的认识,然后再理解细节,本次实验例程的设计框架如下:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_引脚_16

  第1阶段,上电启动阶段:

  • 这部分在第14章进行了详细说明。

  第2阶段,进入main函数:

  • 第1部分,硬件初始化,主要是MPU,Cache,HAL库,系统时钟,滴答定时器和LED。
  • 第2部分,应用程序设计部分,实现QSPI Flash的查询和MDMA方式操作。

配套例子:

V7-029_QSPI读写例程,四线DMA方式,读每秒48MB(V1.1)

V7-059_QSPI读写例程,查询方式

实验目的:

  1. 学习QSPI Flash的读写测试例程

实验操作:

  1. 支持以下7个功能,用户通过电脑端串口软件发送数字1-6给开发板即可
  2. printf(“请选择操作命令: “);
  3. printf(“【1 - 读QSPI Flash, 地址:0x%X,长度:%d字节】 “, TEST_ADDR, TEST_SIZE);
  4. printf(“【2 - 写QSPI Flash, 地址:0x%X,长度:%d字节】 “, TEST_ADDR, TEST_SIZE);
  5. printf(“【3 - 写QSPI Flash前10KB空间, 全0x55】 “);
  6. printf(“【4 - 读整个串行Flash, 测试读速度】 “);
  7. printf(“【Z - 读取前1K,地址自动减少】 “);
  8. printf(“【X - 读取后1K,地址自动增加】 “);
  9. printf(“【Y - 擦除整个串行Flash,整片32MB擦除大概300秒左右】 “);
  10. printf(“其他任意键 - 显示命令提示 “);

上电后串口打印的信息:

波特率 ,数据位 8,奇偶校验位无,停止位 1。

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_#define_17

程序设计:

  系统栈大小分配:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_#define_18

  RAM空间用的DTCM:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_数据_19

  硬件外设初始化

硬件外设的初始化是在 bsp.c 文件实现:

  MPU配置和Cache配置:

数据Cache和指令Cache都开启。配置了AXI SRAM区(本例子未用到AXI SRAM)和FMC的扩展IO区。

  每10ms调用一次按键处理:

按键处理是在滴答定时器中断里面实现,每10ms执行一次检测。

  主功能:

主程序实现如下操作:

  • 启动一个自动重装软件定时器,每100ms翻转一次LED2。
  • 支持以下7个功能,用户通过电脑端串口软件发送命令给开发板即可
  • printf(“【1 - 读QSPI Flash, 地址:0x%X,长度:%d字节】 “, TEST_ADDR, TEST_SIZE);
  • printf(“【2 - 写QSPI Flash, 地址:0x%X,长度:%d字节】 “, TEST_ADDR, TEST_SIZE);
  • printf(“【3 - 写QSPI Flash前10KB空间, 全0x55】 “);
  • printf(“【4 - 读整个串行Flash, 测试读速度】 “);
  • printf(“【Z - 读取前1K,地址自动减少】 “);
  • printf(“【X - 读取后1K,地址自动增加】 “);
  • printf(“【Y - 擦除整个串行Flash,整片32MB擦除大概300秒左右】 “);
  • printf(“其他任意键 - 显示命令提示 “);

配套例子:

V7-029_QSPI读写例程,四线DMA方式,读每秒48MB(V1.1)

V7-059_QSPI读写例程,查询方式

实验目的:

  1. 学习QSPI Flash的读写测试例程

实验操作:

  1. 支持以下7个功能,用户通过电脑端串口软件发送数字1-6给开发板即可
  2. printf(“请选择操作命令: “);
  3. printf(“【1 - 读QSPI Flash, 地址:0x%X,长度:%d字节】 “, TEST_ADDR, TEST_SIZE);
  4. printf(“【2 - 写QSPI Flash, 地址:0x%X,长度:%d字节】 “, TEST_ADDR, TEST_SIZE);
  5. printf(“【3 - 写QSPI Flash前10KB空间, 全0x55】 “);
  6. printf(“【4 - 读整个串行Flash, 测试读速度】 “);
  7. printf(“【Z - 读取前1K,地址自动减少】 “);
  8. printf(“【X - 读取后1K,地址自动增加】 “);
  9. printf(“【Y - 擦除整个串行Flash,整片32MB擦除大概300秒左右】 “);
  10. printf(“其他任意键 - 显示命令提示 “);

上电后串口打印的信息:

波特率 ,数据位 8,奇偶校验位无,停止位 1。

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_引脚_20

程序设计:

  系统栈大小分配:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_数据_21

  RAM空间用的DTCM:

【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)_#define_22

  硬件外设初始化

硬件外设的初始化是在 bsp.c 文件实现:

  MPU配置和Cache配置:

数据Cache和指令Cache都开启。配置了AXI SRAM区(本例子未用到AXI SRAM)和FMC的扩展IO区。

  每10ms调用一次按键处理:

按键处理是在滴答定时器中断里面实现,每10ms执行一次检测。

  主功能:

主程序实现如下操作:

  • 启动一个自动重装软件定时器,每100ms翻转一次LED2。
  • 支持以下7个功能,用户通过电脑端串口软件发送命令给开发板即可
  • printf(“【1 - 读QSPI Flash, 地址:0x%X,长度:%d字节】 “, TEST_ADDR, TEST_SIZE);
  • printf(“【2 - 写QSPI Flash, 地址:0x%X,长度:%d字节】 “, TEST_ADDR, TEST_SIZE);
  • printf(“【3 - 写QSPI Flash前10KB空间, 全0x55】 “);
  • printf(“【4 - 读整个串行Flash, 测试读速度】 “);
  • printf(“【Z - 读取前1K,地址自动减少】 “);
  • printf(“【X - 读取后1K,地址自动增加】 “);
  • printf(“【Y - 擦除整个串行Flash,整片32MB擦除大概300秒左右】 “);
  • printf(“其他任意键 - 显示命令提示 “);

本章节就为大家讲解这么多,实际应用中根据需要选择DMA和查询方式。

 

微信公众号:armfly_com 

讯享网

小讯
上一篇 2025-05-09 19:49
下一篇 2025-05-04 16:42

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/194137.html