APM32F427是否支持QSPI XIP?一起来玩转外部Flash的内存映射模式

2026-05-07 18:32:05/ By Admin

  什么是QSPI XIP?

  QSPI(Quad SPI)相比传统SPI的主要提升在于:

  数据线从原来的MOSI/MISO两条,扩展为IO0~IO3四条线,数据传输速度显著提升。

    1 (3)

  QSPI控制器还支持自动管理指令和地址阶段,并提供内存映射模式,使用更加便捷。

  XIP(eXecute In Place)是QSPI内存映射模式的核心功能:

  传统SPI:每次读写外部Flash都需要软件发送指令、配置地址,操作繁琐。

  QSPI+XIP:将外部Flash直接映射到MCU的地址空间,读取数据就像访问内部内存一样简单。

       2

  板载外部Flash:W25Q16JV

  APM32F427 Tiny开发板上集成了W25Q16JV(16Mbit容量)。该芯片支持Quad I/O、Fast Read等多种读取指令,只需配置正确的指令码、地址模式和Dummy Cycle,即可实现高速访问。

  QSPI XIP内存映射流程(代码示例)

  以下代码基于APM32F4xx_DAL_SDK_V1.3.0中的QSPI_ReadWrite示例修改,演示了W25Q16JV的擦除、写入、读取以及进入XIP模式的过程。

  1.基础读写操作

  在启用XIP之前,先测试基本的擦写流程,确保Flash读写通路正常:

  擦除指定扇区

  写入测试数据

  回读数据并比对

  示例代码:

void FLASH_EnterXIPMode(void) {
    QSPI_XIPTypeDef xipConfig = {0};

    xipConfig.Instruction = 0xEB;  // Quad I/O Fast Read
    xipConfig.WrapCode = 0x00;     // 不使用 wrap
    xipConfig.AddressSize = QSPI_XIP_ADDRESS_SIZE_24_BITS; // 24位地址
    xipConfig.InstructionMode = QSPI_XIP_INSTRUCTION_STANDARD_INS;
    xipConfig.InstructionSize = QSPI_XIP_INSTRUCTION_SIZE_8_BITS;
    xipConfig.FrameFormat = QSPI_XIP_FRAME_FORMAT_QUAD;
    xipConfig.DummyCycles = 6;     // W25Q16JV 使用 0xEB 指令时的 Dummy 周期
    xipConfig.Endianness = QSPI_XIP_MEM_ACCESS_FORMAT_LITTLE_ENDIAN;
    xipConfig.ContinuousMode = ENABLE;
    xipConfig.PrefetchMode = ENABLE;

    FLASH_ChipSelect(ENABLE);
    if (DAL_QSPIEx_MemoryMapped(&hqspi, &xipConfig) != DAL_OK) {
        Error_Handler();
    }
}

  若以上操作顺利完成,说明Flash的擦写和读取功能正常。

  2.切换到XIP模式

  基础读写验证通过后,即可启用XIP。只需调用FLASH_EnterXIPMode()函数,其核心是通过QSPI控制器的MemoryMapped功能实现:

void FLASH_EnterXIPMode(void) {
    QSPI_XIPTypeDef xipConfig = {0};

    xipConfig.Instruction = 0xEB;  // Quad I/O Fast Read
    xipConfig.WrapCode = 0x00;     // 不使用 wrap
    xipConfig.AddressSize = QSPI_XIP_ADDRESS_SIZE_24_BITS; // 24位地址
    xipConfig.InstructionMode = QSPI_XIP_INSTRUCTION_STANDARD_INS;
    xipConfig.InstructionSize = QSPI_XIP_INSTRUCTION_SIZE_8_BITS;
    xipConfig.FrameFormat = QSPI_XIP_FRAME_FORMAT_QUAD;
    xipConfig.DummyCycles = 6;     // W25Q16JV 使用 0xEB 指令时的 Dummy 周期
    xipConfig.Endianness = QSPI_XIP_MEM_ACCESS_FORMAT_LITTLE_ENDIAN;
    xipConfig.ContinuousMode = ENABLE;
    xipConfig.PrefetchMode = ENABLE;

    FLASH_ChipSelect(ENABLE);
    if (DAL_QSPIEx_MemoryMapped(&hqspi, &xipConfig) != DAL_OK) {
        Error_Handler();
    }
}

  配置完成后,外部Flash被映射到地址0x90000000。此后,直接访问该地址即可读取Flash内容,无需再手动发送指令或地址:

FLASH_EnterXIPMode();
LOG_Print("XIP mode enabled. External flash is mapped at 0x90000000.\r\n");
PrintArray32((uint32_t *)0x90000000, BUFFER_SIZE / sizeof(uint32_t));

  如果打印出的数据与之前写入的数据一致,说明XIP配置成功。

  如何判断XIP是否成功?

  串口日志:读取0x90000000地址的数据与原始写入数据完全一致。

        5 (1)

  调试器内存窗口(如MDK、IAR):观察0x90000000区域,内容与Flash中的数据相同。

          4

  极海APM32F427通过QSPI XIP功能,显著提升了外部Flash的使用体验:

  无需频繁发送指令、设置地址;

  连续读取速度快,代码逻辑更简洁;

  特别适合需要“就地执行代码”或快速读取大量数据的场景。

  虽然对于小数据量存储来说,XIP并非必须,但在需要扩展存储性能或简化访问逻辑的项目中,XIP无疑是一个强大的助力。

icon_up
close_white