最近使用 i.MX RT1050 开发板,发现 SDK 中关于 Flexspi 的驱动例程:
evkbimxrt1050_flexspi_nor_polling_transfer 默认是运行在 RAM 里面的,一般情况下我们需要的是能运行在 Flash 上的代码,所以本篇博文将介绍如何将该例程修改在 Flash 上运行。
本文基于的硬件和软件如下:
IDE: MCUXpresso
SDK: 2.11.0
硬件: IMXRT1050-EVKB
一、硬件修改
EVK 和 SDK 默认都是从Hyper Flash 启动,所以需要先更换为 QSPI 启动,将以下电阻对应的断开和连接即可:
二、软件修改
打开 MCXPresso ,导出 evkbimxrt1050_flexspi_nor_polling_transfer 例程,编译后可以看到代码是运行在 RAM 当中的
现在我们开始按以下步骤对其修改:
(1)添加 XIP 相关宏定义
QSPI 相关:XIP_EXTERNAL_FLASH 、 XIP_BOOT_HEADER_ENABLE
SDRAM 相关:XIP_BOOT_HEADER_DCD_ENABLE 、SKIP_SYSCLK_INIT
添加这些宏定义后,工程目录下的 XIP 文件夹里面的内容就能编译进去,生成的执行文件会有 boot_config 内容,这样芯片才能正常识别启动(关于启动流程不清楚的,可以参考 痞子衡 RT 系列文章,或者参考 RT1050 的 RM );
可以看到这里的内容已经不是灰色的了:
(2)修改 XIP 启动配置文件
默认使用的是 hyperflash_config ,现在需要添加 qspiflash_config 以适配 qspi flash 启动;
(3)添加 Flash 定义
在工程属性中添加 Flash 的内容:
保存配置退出,先编译一遍工程(这里也需要先生成添加 Flash 之后的 .ld 文件方便后续使用),可以看到代码已经放在 Flash 中了:
(4)修改分散加载文件
对 Flash 擦写的代码需要放在 RAM 中运行,作以下修改即可;
在 .ld 文件中添加以下内容
(5)修改擦写的 sector
例程对 sector0 进行擦写,因为我们现在已经在 Flash 上存取代码了,擦除的话会破坏代码,所以这里改为 10 ;
(6)修改 MCUXpresso qspi jlink 下载算法
这里不理解的可以参考之前的文章,《i.MX RT1050 EVK 从 QSPI 启动》,这里不在赘述;
保存下载代码,查看串口信息,可以看到代码已经跑起来了,读取 ID 以及擦写正常。
参考资料:
《IMXRT1050RM》
评论