什么是QSPI XIP?
QSPI(Quad SPI)相比传统SPI的主要提升在于:
数据线从原来的MOSI/MISO两条,扩展为IO0~IO3四条线,数据传输速度显著提升。

QSPI控制器还支持自动管理指令和地址阶段,并提供内存映射模式,使用更加便捷。
XIP(eXecute In Place)是QSPI内存映射模式的核心功能:
传统SPI:每次读写外部Flash都需要软件发送指令、配置地址,操作繁琐。
QSPI+XIP:将外部Flash直接映射到MCU的地址空间,读取数据就像访问内部内存一样简单。

板载外部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地址的数据与原始写入数据完全一致。

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

极海APM32F427通过QSPI XIP功能,显著提升了外部Flash的使用体验:
无需频繁发送指令、设置地址;
连续读取速度快,代码逻辑更简洁;
特别适合需要“就地执行代码”或快速读取大量数据的场景。
虽然对于小数据量存储来说,XIP并非必须,但在需要扩展存储性能或简化访问逻辑的项目中,XIP无疑是一个强大的助力。
Copyrights© Shenzhen Linkchip Co.,LTD All Rights Reserved.