上一期我们介绍了自主参照 ST 官方参考设计制作的 STM32N6 硬件板卡,板载 W25Q256 串行 Flash 作为外部程序存储器,搭配 APS6404 实现外部 PSRAM 扩展。
这里我们先介绍一下为什么STM32N6需要搭载一颗外部Flash。
STM32N6 拥有高达 4.2MB 的片上 RAM,但是没有内置 Flash,这意味着芯片上电之后,内部不存在可以直接存放固件的存储区域。上电复位瞬间,MCU 无法从片内加载程序执行,必须依靠外部存储介质存放固件镜像。
从启动机制上来说,STM32N6 内置了系统启动 ROM(BootROM)。芯片上电后首先运行 FSBL,按照FSBL配置,去外接存储器件读取固件,拷贝到片内 RAM 或者外部 PSRAM 中,或者直接在Flash中运行代码。
那么如何将代码通过STM32N6烧录到Flash中就要涉及到STM32的烧录算法实现,本期我们就来介绍一下如何自制STM32N6烧录算法用以将代码代码正确的烧录到我们的自制Flash芯片中。
1、烧录算法的用处
很多使用传统STM32芯片的开发者基本感受不到“烧录算法”的存在。因为常规带内部Flash的STM32,出厂自带完整片内Flash驱动,STM32CubeProgrammer、KEIL、STM32CubeIDE等工具可以直接识别芯片、一键烧录,不需要用户额外配置。
但STM32N6是完全无片内Flash架构,所有程序、固件、资源全部依赖外置SPI Flash存储。这就导致官方默认烧录工具无法直接适配我们的自制板载W25Q256 Flash,必须依靠自定义Flash烧录算法才能完成固件烧写。
在STM32CubeProgramer中外部加载器就是对应的烧录算法。
2、CubeMX配置
首先在CubeMX中我们必须要让XSPI2(对应我们的Flash)在ExtMemLoader域使能。
XSPI2配置为四线SPI,大小对应我们的W25Q256,其他条件不用更改没事。
EXTMEM_LOADER扩展包为我们制作烧录算法的核心包。EXTMEM_MANAGER管理我们的外部存储,我们首先进入EXTMEM_MANAGER指定一下外部Flash。
Memory1为XSPI2设置为NOR_SFDP,之后进入EXTMEM_LOADER设置外部加载器(烧录算法)
指定烧录工具,存储区域,加载器名称,块区数量、大小、页大小等。在创建工程界面开启ExtMemLoader之后创建工程。
可以看到ExtMemLoader工程成功创建,其中的Postbulid.sh脚本为编译脚本并将烧录算法拷贝到CubeProgramer工具目录中。包括底层的QSPI读写都已经配置好了,这里不需要我们单独来配置。
运行postbulid.sh后就可以看到烧录算法已经生成并可以在CubeProgramer中找到了。
3、测试
在CubeProgramer中选择刚才生成的烧录算法,烧录我们的一个文件:
代码能够烧录离线运行即代表烧录算法实现成功。
174