一、前言
STM32H7S78-DK开发板跟常规开发板在工程配置上是有所不同的,主要是前者扮演着一个类MPU的角色,通常MCU已经集成有完备的Flash、RAM等资源,无需开发者进行Flash、RAM外设的初始化工作,在上电运行后程序会正常运行,能够进行程序调试、烧录。STM32H7S78-DK板载MCU Flash大小为64KB,超过这个容量的固件程序则无法烧录内部Flash。于是我们想到使用外部大容量Flash,如果使用外部Flash,则需要对外部Flash进行初始化并编写相应的Flash烧录算法。
二、
外挂的片外Flash如何能够Execute in place呢?这里需要满足以下几个条件:
片外Flash提供和RAM相似的数据交互接口;
和RAM有着一个数量级的读取速度;
存储空间连续即支持线性存储;
满足以上条件的Flash类型只能是、NOR Flash,而STM32H7S78-DK板载片外Flash正是1Gbit Octo-SPI NOR Flash,容量为128MB。
而NAND Flash不满足XIP需求的原因在于,它的读取速度相比NOR FLASH/RAM慢一个数量级,另外也需要额外提供驱动接口。
1.Nor Flash适用于需要快速启动和执行代码的场景,如嵌入式系统,
而Nand Flash适用于需要大容量数据存储的场景,如存储卡和固态硬盘。
2. 访问速度: Nor Flash的随机访问速度相对较快,而Nand Flash的顺序读取速度较慢
现在言归正传,MCU可以联合NOR Flash实现XIP,那么具体的XIP执行流程是怎么样的?
可以使用以下图片来说明:
在非XIP处理中,CPU的指令缓存、数据缓存单元通过内存来间接读取flash内的指令(代码)与数据。右边的XIP则是指令直接从FLash读取并就地开始执行指令,而数据块依旧是通过内存间接读取,这也对应了上述所述NOR Flash的写入速度慢的问题,RAM更适合于进行数据快速读写。
虚拟映射空间是为了操作系统/编译器进行内存管理而设置的,如Linux、windows等系统,当虚拟内存空间大于物理内存空间时,则先把数据存储到闪存中,这样可以使多任务运行能够充分利用有限的内存资源。
三、
3.1 STM32中的XIP实现
在STM32单片机中,XIP通常通过特定的存储器映射和启动配置来实现。以下是一些关键点:
存储器映射:STM32的存储器架构允许将外部或内部Flash存储器映射到CPU可以访问的地址空间。当使用XIP时,代码被存储在Flash中,并通过存储器映射直接由CPU访问和执行。
启动配置:STM32的启动配置可以通过设置BOOT引脚来选择不同的启动模式。例如,可以选择从主闪存(Flash)启动,或者从系统存储器(通常包含Bootloader)启动。在XIP模式下,通常是从包含代码的Flash区域启动。
中断向量表:在XIP模式下,中断向量表(IVT)通常也存储在Flash中。当CPU响应中断时,它会从IVT中读取中断处理程序的地址,并跳转到相应的处理程序执行。因此,在XIP模式下,IVT的地址必须与Flash中的代码地址相匹配。
3.2 XIP的优点
减少RAM需求:由于代码直接在Flash中执行,因此无需将代码复制到RAM中。这可以显著减少对RAM的需求,从而降低系统成本。
快速启动:由于代码已经存储在Flash中,并且可以直接执行,因此系统可以更快地启动并运行。
易于更新:由于代码存储在Flash中,因此可以通过简单的编程操作来更新代码,而无需拆卸硬件或更换存储器芯片。
3.3 XIP的应用场景
XIP技术特别适用于以下场景:资源受限的系统:在这些系统中,RAM的容量有限,而Flash存储器则相对充裕。使用XIP可以减少对RAM的需求,从而优化系统性能。
需要快速启动的系统:在这些系统中,启动时间是一个关键因素。使用XIP可以加快启动速度,从而缩短系统的响应时间。
打开STM32H7S78-DK模版XIP工程,位于C:\Users\quansirx\STM32Cube\Repository\STM32Cube_FW_H7RS_V1.1.0\Projects\STM32H7S78-DK\Templates\Template_XIP\STM32CubeIDE
boot、extMemLoader工程实现片外Flash的初始化及空间分配,最后将Application工程烧录至片外Flash,开发板复位后即进行XIP项目运行。
打开CubeIDE下App的“*.ld”链接文件可以看到系统Flash地址是映射在0x70000000,这是Octo-SPI NOR Flash的挂载地址,flash的大小为0x08000000(128MB),该Flash的执行功能设为XRW,即可读写、可执行。并且RAM也被映射至外部Octo-SPI RAM,不使用内部的620KB RAM。外部RAM挂载地址为0x90000000,划分使用的内存大小0x0040000(4MB)。外部RAM的执行功能设为RW,为可读写、不可执行,这说明该工程对于外部RAM的功能是用于数据高速读写,不用于执行指令代码