C++ 怎么配置外扩 QSPI 闪存的 XIP(eXecute In Place)模式直接在 Flash 中运行代码

浅丽吖_4230

浅丽吖_4230

2026-10-29

364人浏览

原创

QSPI XIP需Flash支持Quad Read(0xEB)和Continuous Read(0xE7)指令,并使能QE位;MCU端须配置Memory-mapped模式、ABR/FCONT、AHB映射地址与链接脚本一致,且向量表必须复制到RAM并更新VTOR。

c++ 怎么配置外扩 qspi 闪存的 xip(execute in place)模式直接在 flash 中运行代码

QSPI XIP 的硬件前提:Flash 必须支持 Quad Read 和 Continuous Read 模式

不是所有 QSPI Flash 都能开 XIP。关键看数据手册里是否明确标注支持 0xEB(Quad I/O Read)或 0xE7(Quad I/O Continuous Read)指令,且地址线和数据线在读取时能稳定维持信号完整性。常见兼容型号如 Winbond W25Q80、Macronix MX25L3233F,但 W25Q32JV 的某些批次因内部时序限制,默认不支持连续读,强行 XIP 会跳飞或取指错误。

实操建议:

  • 用示波器抓 IO0–IO3 和 SCLK,确认读取时是真正的四线并行传输,而非模拟 Quad 模式
  • 检查 Flash 的 CR2[1](或类似寄存器位)是否已使能 Quad Enable (QE) —— 很多芯片出厂默认关闭,需通过 Write Status Register 命令写入 0x40 或 0x02(依型号而异)
  • 确认 Flash 的 Reset Enable 位未被意外置位,否则上电后可能进入复位态,XIP 地址访问直接返回全 0xFF

MCU 端 QSPI 控制器配置:以 STM32H7 为例配 QSPI AHB 总线映射

STM32H7 的 QSPI 外设必须启用 Memory-mapped mode 并正确设置 ABR (Address Bit Rate) 和 FCONT (Flash Continuation),否则 CPU 访问 QSPI 地址空间时会触发 BusFault 或返回哑数据。

关键配置点:

  • QUADSPI->CR |= QUADSPI_CR_EN 必须在所有寄存器初始化完成后最后使能,否则部分寄存器写入会被忽略
  • QUADSPI->DCR &= ~QUADSPI_DCR_CKMODE —— 若 Flash 要求 DTR(Double Transfer Rate),此处不能清零,否则时钟相位错位导致取指乱码
  • AHB 映射起始地址(如 0x90000000)必须与链接脚本中 .text 段的 ORIGIN 完全一致;若 Flash 实际容量为 8MB,但映射窗口设成 16MB,末尾越界访问会回绕或触发错误响应
  • 务必调用 __DSB() + __ISB() 在使能映射后刷新流水线,否则 CPU 可能仍在执行旧 cache 中的指令

链接脚本与启动流程:把代码段放 Flash 地址,但向量表仍需复制到 RAM

XIP 不等于“完全不动 RAM”。Cortex-M 内核要求中断向量表必须位于可写内存(即 RAM),因为复位后内核会从 0x00000000(或 VTOR)读取向量,而 Flash 不可写。所以即使 .text 放在 QSPI 地址,.isr_vector 必须在 RAM 中初始化。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

典型处理方式:

  • 链接脚本中定义两个区域:MEMORY { FLASH (rx) : ORIGIN = 0x90000000, LENGTH = 8M; RAM (rwx) : ORIGIN = 0x30000000, LENGTH = 1M }
  • .isr_vector 段放在 RAM 区,并在 Reset_Handler 开头手动 memcpy 初始化:memcpy((void*)0x30000000, (const void*)0x90000000, 0x400);
  • 确保 VTOR 寄存器在 SystemInit() 后被设为 RAM 中向量表地址:SCB->VTOR = 0x30000000;
  • 不要在 QSPI 地址上放全局构造函数(.init_array)—— C++ 全局对象构造依赖 RAM 中的函数指针数组,XIP 下无法原地执行构造逻辑

调试与验证:用 GDB 直接反汇编 QSPI 地址确认指令真实性

烧录后看似运行正常,不代表真正在 Flash 中取指。常见假象是:QSPI 控制器实际工作在 indirect mode(比如调试器自动切换模式),或者 Flash 返回了缓存副本而非真实内容。

验证步骤:

  • GDB 下执行 x/4i 0x90000100,观察反汇编结果是否与你源码编译出的 .text 段二进制完全一致;若显示 undefined instruction 或全是 0xe7e7e7e7,说明映射失败或 Flash 未正确使能 QE
  • 暂停运行后,用 monitor qspi reset(OpenOCD)或直接读 QUADSPI->SR,确认 TCF (Transfer Complete Flag) 和 FSMF (FIFO Status Match Flag) 是否正常置位
  • 测量从跳转到 QSPI 地址开始,到第一条有效指令执行的时间差 —— XIP 应比 memcpy 到 RAM 后再跳转慢 3~5 个周期(因额外等待 Flash 延迟),若慢一个数量级,大概率是控制器降频到安全模式或走 fallback path

最易被忽略的一点:QSPI XIP 的性能对 Flash 的 Wrap Boundary 敏感。如果代码跨 4KB 边界(常见于函数末尾紧邻边界),而 Flash 不支持跨页连续读,控制器会插入额外等待周期甚至重发命令 —— 这种问题只能靠实际跑 benchmark 发现,仿真器看不到。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2268

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习