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

article/2025/10/14 1:45:50

随言:

目前的电子产品功能越来越多,随之而来的就是代码越来越庞大,代码所需要的存放空间也越来越大。

比如:用ST做GUI界面,面临最大的问题就是芯片内部flash最大才2M。在现在这个时代,2M其实也放不了几张图片。

故ST在某些M4 M7内核芯片上增加了QSPI外设,让用户把代码放在外部存储执行。

也同时提供了两种代码启动方式 XiP 和 BootROM模型。

STM32CubeIDE QSPI间接模式和内存映射模式 读写W25Q64:STM32CubeIDE QSPI间接模式和内存映射模式 读写W25Q64_sudaroot的博客-CSDN博客_qspi内存映射

MDK KEIL 下载算法外部存储QSPI FLASH:MDK KEIL 下载算法程序 外部存储QSPI FLASH_sudaroot的博客-CSDN博客

STM32CubeProgrammer STM32CubeIDE下载算法  外部存储QSPI Flash:STM32CubeProgrammer STM32CubeIDE下载算法 外部存储QSPI Flash_sudaroot的博客-CSDN博客

参考资料:

文档:

ST官网或者ST社区搜索文件索引号:AN5188 

《AN5188 Application note External memory code execution on STM32F7x0 Value line and STM32H750 Value line MCUs》

例程:

..\STM32Cube\Repository\STM32Cube_FW_H7_V1.8.0\Projects\STM32H750B-DK\Templates

正文:

刚才提到有两种启动代码方式: XiP 和 BootROM。

其实就是个bootloader,加上个用户APP。不知道的bootloader的IAP的文章写的好详细了。

而APP就是我们写的产品功能逻辑业务代码了。

1、XiP

XiP: 在从外部闪存(QSPI或FMC-NOR闪存)“就地执行”。 用户应用程序代码应与目标执行存储器地址(外部QSPI或FMC-NOR闪存)链接。

上面这1句话意思是:XiP是可以在外部闪存直接执行代码的,就像芯片在内部flash 的地址0x0800 0000直接执行一样,称为“就地执行”。

上面这2句话意思是:用户应用程序代码编译的时候链接地址要改成外部闪存的地址,如STM32 H7系统给QSPI Flash在系统总线分配的地址是0x9000 0000,那么代码的地址就要改成0x9000 0000。

XiP模型基于直接从用于代码存储的外部非易失性存储器中执行代码。 此执行模型需要内存映射支持,以授予CPU对已执行代码的用户应用程序的直接访问权。 XiP模型可通过FMC / QSPI接口在外部NOR / QSPI闪存上使用。

下面的流程图显示了XiP模型的操作流程(英文不好没关系,看中文)。

小结:首先你要知道XiP启动方式是一个bootloader,这个bootloader做了一件很与众不同的事情就是把QSPI FLASH映射到了系统总线0x9000 0000 这个地址上。

映射上去以后,只要我们访问0x9000 0000这个地址,系统总线就会自动去读QSPI FLASH 0地址的数据。记住是自动去读,

比如:uint32_t temp = *((uint32_t *)0x90000000)就能直接拿到QSPI FLASH第0~3地址数据。

当映射完成后自然是准备跳转到用户程序执行。准备工作就是关闭全部中断和cache。

2、BootROM

BootROM: 从内部闪存启动,配置外部RAM存储器(SDRAM或SRAM),从代码存储区复制用户应用程序二进制文件(SDCARD或SPI-Flash存储器)连接到外部SDRAM或外部SRAM,然后跳转到用户应用程序。 用户应用程序代码应与目标执行存储器地址(外部SDRAM或SRAM)链接。

BootROM模型基于从选定的易失性内存执行的代码。当二进制数据存储在没有内存映射接口的内存中时,这种执行模型是合适的(比如SDCARD)。当二进制数据存储在吞吐量较低的内存中(如用于SPI-NOR(使用具有一行的QSPI进行模拟)时,此模型也适用)。根据的用户配置,外部内存引导应用程序配置了以下两个易失性内存:SDRAM、SRAM、PSRAM或内部SRAM。在此模型中,在外部内存引导应用程序执行之前,二进制数据将从非易失性内存复制到一个易失性内存。第二个易失性存储器用于数据。

下面的流程图说明了BootROM模型的操作流程。

小结:这种模型就很通用了,适用于凡是有FMC能驱动外部RAM的任意一款ST芯片。细看流程图其实就是把外部的ROM复制到外部的RAM(如SRAM, SDRAM),然后在外部RAM上“就地执行”。

当然编译时的链接地址肯定是外部RAM的地址了。至于外部ROM随意都可以,什么SPI FLASH、TF卡、I2C存储器都可以,无非就是复制到外部RAM慢一点,启动慢一点。最后跳转到外部RAM运行用户程序。

比如:STM32F407ZG + SRAM(32MB) + TF卡,把程序编译成二进制放到TF卡里面,每当我把新的程序更新到TF卡,运行的程序就更新了,就有点像玩Linux TF卡启动的感觉了。

如果是SPI FLASH则需要重新写下载算法。这个模型很有意思...~!@#

3、XiP模型bootloader编写

首先,你要准备好一份测试过没有问题QSPI FLASH 代码,

我以前做过笔记,STM32CubeIDE QSPI间接模式和内存映射模式 读写W25Q64:STM32CubeIDE QSPI间接模式和内存映射模式 读写W25Q64_sudaroot的博客-CSDN博客_qspi内存映射

故我自己复制粘贴就好了,由于这次我用的是STM32H750VB + W25Q64硬件,还要微微调整一下。

static uint32_t QSPI_EnableMemoryMappedMode(QSPI_HandleTypeDef *QSPIHandle);这些函数在上面文章讲过了,这不讲了。

#include <stdio.h>
#include "w25qx_qspi.h"typedef  void (*pFunction)(void);#define APPLICATION_ADDRESS            QSPI_BASEstatic uint32_t QSPI_EnableMemoryMappedMode(QSPI_HandleTypeDef *QSPIHandle);pFunction JumpToApplication;int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* Enable I-Cache---------------------------------------------------------*/SCB_EnableICache();/* Enable D-Cache---------------------------------------------------------*/SCB_EnableDCache();/* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_QUADSPI_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf("Sudaroot XiP BootLoader\r\n");/* 1.W25Qx Init */W25Qx_QSPI_Init();/* 2.Enable MemoryMapped mode */QSPI_EnableMemoryMappedMode(&hqspi);/* 3.Disable CPU L1 cache before jumping to the QSPI code execution *//* Disable I-Cache */SCB_DisableICache();/* Disable D-Cache */SCB_DisableDCache();/* 4.Disable Systick interrupt */HAL_SuspendTick();/* 5.Initialize user application's Stack Pointer & Jump to user application */JumpToApplication = (pFunction) (*(__IO uint32_t*) (APPLICATION_ADDRESS + 4));__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);JumpToApplication();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief  Configure the QSPI in memory-mapped mode* @retval QSPI memory status*/
static uint32_t QSPI_EnableMemoryMappedMode(QSPI_HandleTypeDef *QSPIHandle)
{QSPI_CommandTypeDef      s_command;QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;/* Configure the command for the read instruction */s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;s_command.Instruction       = QUAD_INOUT_FAST_READ_CMD;s_command.AddressMode       = QSPI_ADDRESS_4_LINES;s_command.AddressSize       = QSPI_ADDRESS_24_BITS;s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;s_command.DataMode          = QSPI_DATA_4_LINES;s_command.DummyCycles       = 6;s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_HALF_CLK_DELAY;s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;/* Configure the memory mapped mode */s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;s_mem_mapped_cfg.TimeOutPeriod     = 0;return HAL_QSPI_MemoryMapped(QSPIHandle, &s_command, &s_mem_mapped_cfg);
}int __io_putchar(int ch)
{HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 1000);return ch;
}

4、BootROM模型bootloader编写

我有空就写,或者自己去看ST的例程。用的比较少。

5、经验分享

1、做这个bootloader的系统时钟一定要和APP的系统时钟一致,否则跳转到APP后在初始化时

系统时钟导致不一致,总线去读取QSPI FLASH的数据都是错的,程序必然跑飞卡死。其中主要是QSPI时钟。

2、在bootloader 中QSPI内存映射后,系统会把QSPI当做系统一部分。故不能在APP初始化或者使用关于QSPI外设的事物。

如不能使用QSPI flash的引脚   或者  不能重新初始化QSPI外设,否则则跑飞。切记~!!!

6、结束

在这里肯定有人疑惑哪个模型好运行速度快?

我只想说适合你的项目就好了,不用纠结。

非要说速度快的,还有一种模型,混合运行的模型。

把启动相关和想快速运行的代码链接地址设置内部flash上,把一些不重要的代码链接地址放在外部ROM上。

这样就没有bootloader和APP这个概念了,就是一个程序了,但是还是少不了定制下载算法。

 全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

 

 


http://chatgpt.dhexx.cn/article/Mv6DgAwv.shtml

相关文章

mac实用小技巧之解压.xip文件

Mac下解压(.xip)文件 在安装Xcode的时候&#xff0c;我从官网下载了一个Xcode的安装文件&#xff0c;但是这个文件是(.xip)压缩文件&#xff0c;我使用了很多解压软件&#xff0c;都没有解压成功&#xff0c;最后上网查看&#xff0c;大家推荐了一种方法 “通用”里有时没有“…

XIP技术介绍

转载&#xff1a;https://blog.csdn.net/wk_kuan/article/details/39692371 1&#xff1a;简介 XIP&#xff0c;executed in place&#xff0c;本地执行。操作系统采用这种系统&#xff0c;可以不用将内核或执行代码拷贝到内存&#xff0c;而直接在代码的存储空间直接运行。采…

XIP技术

转自https://blog.csdn.net/amberman/article/details/8122300 侵删 首先认识下nandflash和norflash&#xff1a; NOR Flash 和 NAND Flash 是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR Flash 技术&#xff0c;彻底改变了原先由EPROM(Electrically Pr…

XIP技术总结

1.XIP eXecute In Place XIP即芯片内执行&#xff0c;指应用程序可以在flash闪存内运行&#xff0c;不必再把代码读到系统RAM中。需要注意的是&#xff0c;片内执行不是说程序直接在flash内执行&#xff0c;CPU的基本功能就是取指、译码和执行。norflash能在芯片内执行&#x…

XIP简介

1、XIP是什么&#xff1f; XIP&#xff08;executed in place&#xff09;本地执行。操作系统采用这种系统&#xff0c;可以不用将内核或执行代码拷贝到内存&#xff0c;而直接在代码的存储空间直接运行。 XIP是一种能够直接在闪速存储器中执行代码而无须装载到RAM中执行的机…

XIP(eXecute In Place)

XIP&#xff08;eXecute In Place&#xff09; 1.什么是XIP ​ eXecute In Place&#xff0c;即芯片内执行、就地执行&#xff0c;是指CPU直接从存储器中读取程序代码执行&#xff0c;而不用再读到内存中。应用程序可以直接在flash闪存内运行&#xff0c;不必再把代码读到系统…

网页游戏设计(HTML5入门)--- 基础知识篇

01 1、网络游戏&#xff08;Online Game&#xff09; 指用户通过计算机互联网进行交互娱乐的电子游戏&#xff0c;通常以互联网为传输媒介&#xff0c;以游戏运营商和用户计算机作为处理终端&#xff0c;以专门的游戏客户端软件或浏览器为信息交互窗口。 2、客户端形式 这一…

计算机基础知识教程

计算机硬件Hardware系统 起源&#xff1a;十九世纪英国&#xff1b; 诞生&#xff1a;1946.2.15&#xff0c;美国宾州大学&#xff1b; 发展&#xff1a;电子管-》晶体管-》集成电路-》大规模集成电路-》超大规模集成电路&#xff1b; 目前&#xff1a;PC系列微型计算机&#x…

HTML5基础网页设计(加代码CSS)

简单网页的模板&#xff0c;多多支持&#xff0c;感谢。知识整理 目录 一、HTML5 简单网页设计&#xff1a; CSS修饰 一、HTML5 简单网页设计&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>简单网页测试…

vue基础知识汇总

一、简介 1.vue是一套用于构建用户界面的渐进式JavaScript框架 2.特点&#xff1a; 采用组件化模式&#xff0c;提高代码复用率、且让代码更好维护声明式编码&#xff0c;让编码人员无需直接操作DOM&#xff0c;提高开发效率使用虚拟DOM优秀的Diff算法&#xff0c;尽量复用DO…

计算机基础知识点总结

系列文章目录 文章目录 系列文章目录一、计算机系统知识计算机组成进制转换数据编码校验码Flynn分类CISC与RISC流水线cache输入输出技术总线结构内存信息安全计算机性能局部性原理 编译原理文法 操作系统基础知识 软件工程软件生存周期系统分析基础&#xff1a;软件测试 计算机…

【WEB前端开发】基础知识大总结(HTML5+CSS3)

本文共一万七千字&#xff0c;十六个内容点&#xff0c;七十个知识点 目录 一、转义字符二、表单标签1、form标签2、input元素3、label 标签4、select 标签5、button 元素 三、语义化标签四、Head标签1、title 标签2、link标签3、style标签4、script 标签5、mate 标签6、base 标…

web开发基础知识

web开发基础知识学习 一、网页开发三剑客 ​ 我们看到的网页通过代码来实现的 &#xff0c;这些代码由浏览器解释并渲染成你看到的丰富多彩的页面效果。 这个浏览器就相当于Python的解释器&#xff0c;专门负责解释和执行(渲染&#xff09;网页代码。写网页的代码是专门的语言…

HTML基础知识总结

原文 经过这段时间的学习&#xff0c;对于html的一些基础知识有了一定的了解。所谓好记性不如烂笔头&#xff0c;唯有一点点累积&#xff0c;才能汇聚成知识的海洋。现在&#xff0c;我对这段时间的学习做一个总结。 一、HTML的定义 HTML&#xff0c;超文本标记语言&#xf…

前端-HTML基础知识详解

每日分享&#xff1a; 不贪婪 凡事皆有度&#xff0c;把握好分寸&#xff0c;学会知足常乐。 目录&#xff1a; 初始常用的HTML标签资源路径列表标签表格标签表单标签表单提交 一、初始常用的HTML标签 小结 学习html语言就是学习标签的用法编写html标签一般用小写html标签…

html5基础知识第四章其他标签

以下内容是学习期间整理&#xff0c;有些语句是便于理解&#xff0c;便于快速入门写的。并不权威。 表格&#xff1a; <table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tb…

HTML5-基础知识

HTML5 author 鲁伟林 一直开发后端&#xff0c;现在开始全栈培养自己。 学习html的网址是&#xff1a;http://www.runoob.com/html/html5-intro.html gitHub地址: https://github.com/thinkingfioa/Notes/tree/master/front-developer/html5 1 HTML5特性 HTML5中的一些有趣的新…

【基础html5 基础知识点】(全)

一、新特性 1. Doctype更简单<!DOCTYPE html> 2. 简单的编码类型 <meta charset”utf-8″ /> 3. 大小写都可 <input tYPe"text" name"" id""> 4. 布尔值 <input type"radio" checked> 5. 可以省略…

HTML5前端知识图谱

HTML5知识图谱 前端知识必备概要HTML5知识概要前端开发知识库体系1. HTML5知识库2. CSS3知识库3. JavaScript知识库4. jQuery知识库5.Node.js知识库6.AngularJS知识库7.React知识库 前端开发知识库细分HTML知识图谱CSS知识图谱1. css 内容排版2. css 布局模型3. css 盒子模型4.…

html5 基础知识总结

W3C的建立 伯纳斯李1994年建立万维网联盟&#xff08;W3C&#xff09; W3C的出现为了制订网页开发的标准&#xff0c;以使同一个网页在不同的浏览器中有相同的效果。 所以&#xff0c;我们需要制订我们编写的网页都需要遵循W3C的规范&#xff01; 网页的结构思想 根据W3C标…