0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用极海APM32F427驱动QSPI XIP内存映射流程

Geehy极海半导体 来源:21ic论坛极海半导体专区 2025-12-29 11:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。

1. QSPI XIP 是个啥??

• QSPI(Quad SPI)和普通 SPI 的主要区别在于:

– 数据线从原本的 MOSI/MISO 升级为 IO0~IO3 四线,速度噌噌往上飙。传统SPI通信与QSPI通信对比图:

d754191a-dee8-11f0-8c8f-92fbcf53809c.png

控制器提供指令、地址阶段的自动管理以及内存映射模式,更加“省心”。

• XIP (eXecute In Place) 就是 QSPI 内存映射的“王牌功能”。

– 传统 SPI:读写外部 Flash 时,每次都要软件发送指令、配置地址。烦!

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

读取外部flash时,使用不同形式读取示意:

d7ae6dac-dee8-11f0-8c8f-92fbcf53809c.png

2.板载 W25Q16JV 外部 Flash

APM32F427 Tiny 板子上放了 W25Q16JV (16Mbit 容量),支持 Quad I/O、Fast Read 等多种读指令。只要采用正确的指令码、地址模式和 Dummy Cycle,就能高速访问它。

3.驱动QSPI XIP内存映射流程(代码示例)

下面这部分源自APM32F4xx_DAL_SDK_V1.3.0中的示例工程,并基于“QSPI_ReadWrite”例程进行修改,演示如何实现W25Q16JV的擦除、写入、读取,以及如何进入XIP内存映射模式。

3.1 基础读写操作

还没上 XIP,就先测试基本的擦写流程,保证外部 Flash 的读写通路 OK。大致就几步:

1. 擦除指定扇区。

2. 写入测试数据。

3. 再回读来对比。

4. Check 成功则万事俱备。

示例代码片段如下:

/* Erase sector */

FLASH_EraseSector(0);

LOG_Print("FLASH_EraseSector (Sector 0 erased). ");

LOG_Print("Data read from offset 0 via QSPI. Dump rxBuffer: ");

FLASH_ReadData(0, rxBuffer, BUFFER_SIZE);

PrintArray32((uint32_t *)rxBuffer, BUFFER_SIZE / sizeof(uint32_t));

/* Write data */

FLASH_WriteData(0, txBuffer, BUFFER_SIZE);

LOG_Print("Data written to offset 0 via QSPI. Dump txBuffer: ");

PrintArray32((uint32_t *)txBuffer, BUFFER_SIZE / sizeof(uint32_t));

/* Read data */

FLASH_ReadData(0, rxBuffer, BUFFER_SIZE);

LOG_Print("Data read from offset 0 via QSPI. Dump rxBuffer: ");

PrintArray32((uint32_t *)rxBuffer, BUFFER_SIZE / sizeof(uint32_t));

/* Compare data */

if (BufferCmp((uint8_t*)txBuffer, (uint8_t*)rxBuffer, BUFFER_SIZE) != true)

{

BOARD_LED_On(LED3);

LOG_Print("Data compare failed! Error_Handler. ");

Error_Handler();

}

LOG_Print("Data compare success! ");

3.2 一键切换 XIP 模式

基础读写没问题后,就可以开启 XIP。只需在 main.c 调用一个 FLASH_EnterXIPMode() 函数,它的核心是利用 QSPI 控制器的 MemoryMapped 功能:

void FLASH_EnterXIPMode(void)

{

QSPI_XIPTypeDef xipConfig = {0};

// 1) Instruction code: 0xEB (Quad I/O Fast Read)

xipConfig.Instruction = 0xEB;

// 2) WrapCode: if not using wrap, set 0

xipConfig.WrapCode = 0x00;

// 3) Address size: 24 bits, suitable for W25Q16JV

xipConfig.AddressSize = QSPI_XIP_ADDRESS_SIZE_24_BITS;

// 4) InstructionMode: how instruction and address are transmitted

// e.g. QSPI_XIP_INSTRUCTION_STANDARD_INS_ADDR, QSPI_XIP_INSTRUCTION_FRF_INS_ADDR

xipConfig.InstructionMode = QSPI_XIP_INSTRUCTION_STANDARD_INS;

// 5) Instruction bit length

xipConfig.InstructionSize = QSPI_XIP_INSTRUCTION_SIZE_8_BITS;

// 6) FrameFormat: QUAD

xipConfig.FrameFormat = QSPI_XIP_FRAME_FORMAT_QUAD;

// 7) DummyCycles: typically 6~10 cycles for 0xEB in W25Q16JV

xipConfig.DummyCycles = 6;

// 8) Endianness: little-endian

xipConfig.Endianness = QSPI_XIP_MEM_ACCESS_FORMAT_LITTLE_ENDIAN;

// 9) ContinuousMode / PrefetchMode

// For higher performance, can enable them if needed

xipConfig.ContinuousMode = ENABLE;

xipConfig.PrefetchMode = ENABLE;

// Enable chip select, then call the library function to enter memory-mapped mode

FLASH_ChipSelect(ENABLE);

if (DAL_QSPIEx_MemoryMapped(&hqspi, &xipConfig) != DAL_OK)

{

Error_Handler();

}

}

代码中的配置要点主要是根据连接的SPI flash参数所决定的:

d80c1740-dee8-11f0-8c8f-92fbcf53809c.png

如图所示我们需要使用的模式是

1.Fast Read Quad I/O:0xEB

2.地址是24Bit

等这个函数执行完,W25Q16JV 就“挂”在了地址 0x90000000。此后,对该地址的访问会自动触发 READ 指令+地址+数据返回,无需编写更多指令/地址逻辑。可以像这样验证:

FLASH_EnterXIPMode();

LOG_Print("XIP mode enabled. External flash is mapped at 0x90000000. ");

PrintArray32((uint32_t *)0x90000000, BUFFER_SIZE / sizeof(uint32_t));

只要打印出的数据和之前写进去的一样,就说明XIP成功啦!

4.如何根据实验现象判断XIP是否成功

1. 串口日志:read(0x90000000) 与原始写入数据完全吻合,妥妥的 XIP。

2. 调试器内存窗口(如 MDK、IAR):直接查看 0x90000000 区域,看到和 Flash 中相同的内容,毫无违和感。

d86de308-dee8-11f0-8c8f-92fbcf53809c.png

总结

APM32F427 通过 QSPI XIP,让外部 Flash 使用体验大幅提升:

– 免去频繁发送指令、设置地址的烦恼;

– 连续读速度快,代码逻辑简单。

当然,如果仅用于小数据量存储,XIP 可能不是必需。但一旦想实现就地执行代码(Execute In Place)或需要快速读取远超内部容量的数据,XIP 就能让项目如虎添翼。

注:文章作者在原帖中提供了代码文件,有需要请至原文21ic论坛

原文地址:https://bbs.21ic.com/icview-3496231-1-1.html?_dsign=206adb5a

或点击下方阅读原文跳转

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1762

    浏览量

    156157
  • 内存映射
    +关注

    关注

    0

    文章

    16

    浏览量

    7638
  • QSPI
    +关注

    关注

    0

    文章

    55

    浏览量

    13447
  • 极海半导体
    +关注

    关注

    0

    文章

    231

    浏览量

    4825

原文标题:APM32芯得 EP.69 | 给外部 Flash 安个家!——APM32F427 QSPI XIP 内存映射轻松就搞定!

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    APM32F427移植CherryUSB实现自定义USB HID设备

    最近需要使用到APM32F427枚举成Custom HID设备进行用户自定义通信,但我又不想要使用官方的USB中间件去做一个USB Custom HID设备。了解到Cherry USB这个开源
    的头像 发表于 01-20 09:52 4251次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b>移植CherryUSB实现自定义USB HID设备

    APM32F427如何实现自定义USB HID设备与PC进行通信

    最近需要使用到 APM32F427 枚举成Custom HID设备进行用户自定义通信,但是官方的例程只有提供的HID枚举为鼠标或者键盘类型的设备。这里记录一下,怎么使用Geehy官方的USB中间件,实现自定义的USB HID设备进行用户通信。
    的头像 发表于 03-30 09:30 2917次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b>如何实现自定义USB HID设备与PC进行通信

    APM32F427 MCU在RT-Thread系统上使用LwIP网络功能

    下面是基于RT-Thread的ENV命令行开发环境,在APM32F427上使用LwIP网络协议栈实现网络通信功能的。
    的头像 发表于 04-02 15:19 9363次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b> MCU在RT-Thread系统上使用LwIP网络功能

    半导体发布APM32F425/427系列高性能MCU 运算、ADC、Flash控制器与通信接口四大维度革新

    聚焦工业4.0及能源管理应用对主控MCU的高性能需求,正式发布APM32F425/427系列高性能拓展型MCU, 集合运算性能、ADC性能、Flash控制器性能与通信接口 四大维度
    的头像 发表于 08-27 18:14 3.8w次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b>半导体发布<b class='flag-5'>APM32F</b>425/<b class='flag-5'>427</b>系列高性能MCU 运算、ADC、Flash控制器与通信接口四大维度革新

    关于APM32F1与Sxx32F1的兼容性问题

    、范例程序:可以使用相同的库函数和范例程序,新增的功能通过添加对应驱动文件来完成 二、不同点1.APM32采用最新版本的M3内核,增加了独立的FPU单元,可以进行单精度浮点运算。2.QSPI接口
    发表于 01-07 16:29

    APM32F030R8 MINI开发板试用体验】+官方dma接收usart程序软件

    接【APM32F030R8 MINI开发板免费试用】+官方adc程序由于APM32F03
    发表于 12-24 12:34

    半导体新品上市—工业增强型APM32F091xC系列MCU

    半导体工业增强型APM32F091xC系列新品MCU,其在APM32F030xC的产品性能上实现增强优化,为用户提供丰富的通信方式。
    发表于 07-26 14:27 7492次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b>半导体新品上市—工业增强型<b class='flag-5'>APM32F</b>091xC系列MCU

    STM32CubeIDE XiP 和 BootROM介绍, XiP外部内存QSPI FLASH执行用户代码

    STM32CubeIDE XiP 和 BootROM介绍, XiP外部内存QSPI FLASH执行用户代码
    发表于 12-02 09:21 14次下载
    STM32CubeIDE <b class='flag-5'>XiP</b> 和 BootROM介绍, <b class='flag-5'>XiP</b>外部<b class='flag-5'>内存</b><b class='flag-5'>QSPI</b> FLASH执行用户代码

    APM32F407 MCU低压伺服驱动器应用方案

    同时提供低压伺服驱动器整个开发过程中的软硬件技术支持与demo板。整机模块工作过程如下:主控采用APM32F407高性能MCU,通过高级定时器,可输出3组互补PWM来控制PMSM电
    发表于 06-09 17:13 1246次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F</b>407 MCU低压伺服<b class='flag-5'>驱动</b>器应用方案

    推出首款电机控制专用芯片APM32F035系列MCU

    宣布正式推出首款高性能、高可靠性、高性价比的电机控制专用芯片—APM32F035系列MCU,覆盖多种电机应用。
    的头像 发表于 07-28 17:13 3059次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b>推出首款电机控制专用芯片<b class='flag-5'>APM32F</b>035系列MCU

    基于半导体APM32F407系列MCU的伺服控制器应用方案

    基于半导体APM32F407系列MCU的伺服控制器应用方案
    的头像 发表于 09-19 16:48 2609次阅读
    基于<b class='flag-5'>极</b><b class='flag-5'>海</b>半导体<b class='flag-5'>APM32F</b>407系列MCU的伺服控制器应用方案

    APM32F072xBT7硬件兼容ST电动车应用方案mcu

    APM32F072xBT7硬件兼容ST电动车应用方案MCU 随着电动车市场的不断发展,对于电动车控制器的要求也越来越高。而作为电动车控制器的核心部件,MCU的选择至关重要。
    的头像 发表于 03-04 21:30 1782次阅读

    基于APM32F035的屏蔽泵参考方案

    基于APM32F035电机控制专用MCU的屏蔽泵参考方案,可助力整机系统达到IE3的高效节能等级,同时电路设计更紧凑与稳定,成本效益相比传统设计更高。APM32F035作为此参考方
    的头像 发表于 01-18 09:50 1409次阅读

    APM32F425/427系列MCU荣获2025年度最能打的中国芯片奖

    近日,2025年度“最能打的中国芯”奖项评选正式公布。APM32F425/427系列高性能拓展型MCU脱颖而出,荣获2025年度“最能打的中国芯”工业领域MCU奖项。
    的头像 发表于 01-08 14:26 1587次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F</b>425/<b class='flag-5'>427</b>系列MCU荣获2025年度最能打的中国芯片奖

    APM32F427系列MCU荣获IEC 60730/60335功能安全认证

    近日,APM32F427系列工业级高性能拓展型MCU,成功通过IEC 60730/60335功能安全认证。这标志着该系列产品在功能安全设计上已达到国际领先水平,能够为客户提供符合Class B标准的功能安全库,并助力其高效缩
    的头像 发表于 02-09 09:15 1098次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32F427</b>系列MCU荣获IEC 60730/60335功能安全认证