STM32L4+HAL+QSPI+DMA读写W25Q64/128

本文详细介绍了如何在STM32L452CEUX单片机上,利用STM32 CubeMX配置QSPI和DMA,实现对W25Q64或128JV闪存的四线读写操作。内容涵盖配置步骤、API使用、擦除、写使能和写操作,以及中断和命令完成的等待机制。
摘要由CSDN通过智能技术生成

前言

本文程序运行于STM32L452CEUX系列单片机(适用于L4),使用MDK5.33、STM32CubeMX,实现QSPI通过DMA四线读写W25Q64或128JV。

参考资料:

STM32 CubeMX配置

  • QSPI 外设配置
    2^23 = 8MB(25Q64), 2^24 = 16MB(25Q128)。L452仅有一个Bank。
    QSPI外设配置

  • QSPI DMA配置
    CubeMX QSPI DMA配置

  • 中断配置QSPI 中断配置

  • 时钟配置时钟配置

API

W25QXX命令

用到的命令如下:

/* For W25Q64JV or W25Q128JV */
#define WRITE_STATUS_CFG_REG_CMD                            (0x01)
#define WRITE_ENABLE_CMD                                    (0x06)
#define READ_ID_CMD2                                        (0x9F)
#define READ_STATUS_REG_CMD                                 (0x05)
#define QUAD_INOUT_FAST_READ_CMD                            (0xEB)
#define QUAD_IN_FAST_PROG_CMD                               (0x32)
#define SUBSECTOR_ERASE_CMD                                 (0x20)

W25Q64JV数据手册中的描述如下:
W25Q64Read
左上角的(1-4-4)表示指令阶段使用 1 个 IO,地址阶段使用 4 个 IO,数据阶段也是使用 4 个 IO

void QSPI_ReadBuffer(uint8_t * _pBuf, uint32_t _uiReadAddr, uint32_t _uiSize) 
{
   
    uint8_t cnt = 0;
    QSPI_CommandTypeDef sCommand = {
   0};
    /* 基本配置 */ 
    sCommand.InstructionMode          = QSPI_INSTRUCTION_1_LINE;        /* 1 线方式发送指令 */
    sCommand.AddressSize              = QSPI_ADDRESS_24_BITS;           /* 24 位地址 */
    sCommand.AlternateByteMode        = QSPI_ALTERNATE_BYTES_NONE;      /* 无交替字节 */
    sCommand.DdrMode                  = QSPI_DDR_MODE_DISABLE;          /* W25Q64JV 不支持 DDR */
    sCommand.DdrHoldHalfCycle         = QSPI_DDR_HHC_ANALOG_DELAY;      /* DDR 模式,数据输出延迟 */
    sCommand.SIOOMode                 = QSPI_SIOO_INST_EVERY_CMD;       /* 每次传输要发指令 */

    /* 读取数据 */ 
    sCommand.Instruction  = QUAD_INOUT_FAST_READ_CMD;        /* 24bit 地址的 4 线快速读取命令 */ 
    sCommand.DummyCycles  = 6;                      /* 空周期 */
    sCommand.AddressMode  = QSPI_ADDRESS_4_LINES;   /* 4 线地址 */ 
    sCommand.DataMode     = QSPI_DATA_4_LINES;      /* 4 线数据 */
    sCommand.NbData       = _uiSize;                /* 读取的数据大小 */
    sCommand.Address      = _uiReadAddr;            /* 读取数据的起始地址 */

    if (HAL_QSPI_Command(&hqspi, &sCommand, 10000) != HAL_OK) 
    {
   
        Error_Handler(); 
    }
    /* 读取 */ 
    qspi_RxCplt = 0;
    if (HAL_QSPI_Receive_DMA(&hqspi, _pBuf
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值