MCXN947板卡使用外部的QSPI FLASH 原理概述
FRDM-MCXN947有内部RAM512KB,2M的内部FLASH,板载容量大小为8MB的QSPI FLASH,但FRDM-MCXN947出厂默认使用内部的FALSH,在一些代码容量较大的工程里面内部的FLASH容量会不够,因此需要将代码放在外部的QSPI FASLH里面原地执行。
QSPI Flash 的通信基于命令 - 地址 - 数据的交互流程,由控制器(如 MCU、CPU)通过 QSPI 接口发送指令,实现对 Flash 的读写、擦除、状态查询等操作,具体步骤如下: l 片选激活:控制器拉低 CS(片选)信号,选中目标QSPI Flash 设备。 l 命令传输:控制器通过 DQ0 线发送 8 位命令(如读命令0x03、页写命令0x02),Flash 解析命令类型。 l 地址传输:根据命令需求,控制器通过数据线(DQ0-DQ3)发送存储单元的地址(通常为 24 位或 32 位,取决于 Flash 容量)。 l 数据传输: l 读操作:Flash 通过 DQ0-DQ3 将指定地址的数据传输给控制器。 l 写操作:控制器通过 DQ0-DQ3 将数据写入 Flash 的指定地址(需先擦除对应区块)。 l 片选释放:操作完成后,控制器拉高 CS 信号,结束本次通信。
因此本文基于FRDM-MCXN947平台,实现分散加载功能,并将程序运行到外部的QSPI FLASH中。
开发环境 适配开始之前,请确保已经准备好如下的环境: l Keil MDK5; l FRDM-MCXN947 SDK; l BLHost 2.6.7及以上版本。 技术实现 将下载的SDK进行解压缩操作,然后打开SDK里面的demo_app/hello_world_qspi_xip/cm33_core0,在这目录可以看到有两个boot引导的镜像,这两个镜像决定了FRDM-MCXN947使用的是内部的FLASH或者是使用外挂的QSPI FLASH(NXP出厂默认使用的是内部的FLASH)。 下载好BLHOST工具,打开命令提示符并导航到BLHost可执行文件文件夹(<BLHostroot>\bin\<OS environment>)。使用blhost配置CMPA@0x01004000中的BOOT_SRC。进入ISP模式,使blhost可以对CMPA进行编程。按住SW3(ISP键)=>按住SW1 (N9 RST键)=>释放SW3另一种进入ISP模式的方式。Nxpdebugmbox.exe-i pyocd ispmode -m 0
使用Blhost -p COMxx write-memory 0x01004000<SDK_root>\boards\<EVK name>\demo_apps\hello_world_qspi_xip\cm33_core0\bootfromflexspi.bin
注意:上述命令中的“xx”应替换为EVK的COM端口号。 回到MDK对工程进行编译然后使用板载的MCU-LINK将代码下载到板子当中,观察实验,选择hello_world_qspi_xip工程在MDK编译,编译成功之后点击下载开发板当中。
通过调试工具观察到,系统上电复位后,程序经复位向量表指引位(读取复位向量)并完成启动初始化流程后,最终跳转至main函数的地址经确认处于0x80003348 地址空间范围内。查阅该芯片数据手册的存储器映射章节,明确此地址范围(0x80000000 起始)为外部 QSPI Flash 的映射地址空间。 退出debug模式,将代码下载到FRDM-MCXN947板卡当中,观察实验现象,现象是否和程序预期效果一致。
官方的Demo只提供了HelloWorld_XIP的工程,如果想要将XIP迁移到其它工程则需要将配置Flash的源程序copy到相应的工程里面,本文基于SDK历程中的led blink历程迁移XIP,将程序改为在外部的Flash中。 打开led_blinky历程在目录下新建XIP文件夹,将Hello_World_XIP历程里面关于初始化的nor_flex_spid的文件和镜像引导的bootfromflash.bin和bootformflexspi.bin文件同步复制到copy到XIP文件夹下 打开MDK,将mcx_flexspi_nor_config.c和mcx_flexspi_nor_config.h添加到工程当中,也同时点击魔术棒在c/c++中将mcx_flexspi_nor_config.h添加到头文件目录当中。 在keil的linker阶段中添加预处理的指令--predefine="-D__qspi_xip__=1",这个指令是将keil分散加载的时候将程序挂在在外部的qspi flash里面,在FRDM-MCXN947的分散加载文件中可以看到。
在misc controls添加预处理的文件之后就可以进行编译下载,观察实验的现象了。 通过调试工具观察到,系统上电复位后,程序经复位向量表指引位(读取复位向量)并完成启动初始化流程后,最终跳转至main函数的地址经确认处于0x80003348 地址空间范围内。查阅该芯片数据手册的存储器映射章节,明确此地址范围(0x80000000 起始)为外部 QSPI Flash 的映射地址空间。 将程序下载到FRDM-MCXN947板卡,下载成功之后将程序进行复位操作,观察板卡上的LED灯是否和一致,1s闪烁一次。到此板卡完成了XIP的程序迁移。
|