|
前言 STM32N6作为意法半导体推出的首款集成自研神经处理单元的STM32产品以“MCU+NPU”的异构架构重新定义了边缘AI的算力边界,是意法半导体的MCU最前沿技术栈,不过由于其高难度技术应用以及需要的极其深厚的STM32使用经验以及神经网络基础概念,因此上手难度非常的高。
自从STM32N6发布以来,博主有幸获得一块STM32N657-DK开发板,闲暇之余陆陆续续折腾如何开发。因此将会陆陆续续发表一些使用STM32N6的使用笔记,以供将来的使用者参考。 回顾学习历程,主要是使用人群不多,导致踩了很多很多的坑,在后续使用STM32N6的文章中也会像大家陆续介绍这些点。 本期我们介绍STM32N657DK开发板的烧录方式以及如何实现FSBL_XIP即烧录FSBL(第一阶段引导程序)跳转到到外部Flash所在地址,进行第二阶段(Application)应用程序开发。
1 FSBL_XIP的启动模式 由于STM32N6并没有内置Flash,因此所有的程序都要烧录到外部Flash中,外部Flash会被划分成两个功能区:
外部Flash的前512KB被划归为FSBL功能区,FSBL的前1K内容被用于数据签名,因此最多511K空间用于第一阶段引导程序代码。 接下来我们开始使用STM32CubeMX,STM32CubeIDE以及STM32CubeProgramer实现FSBL+XIP程序。 1 CubeMX配置
在STM32CubeMX中选择STM32N657X0型号,安全域配置推荐选择下方Secure domain only。
设置高速时钟和低速时钟,调高时钟主频(此步骤非必要)
观察原理图,两颗LED灯分别是PO1和PG10,同时需要注意配置GPIO的作用域,我们的主要代码在Application,串口则使用串口1,TXD和RXD分别为PE5和PE6,对其进行初始化。
观察芯片原理图,OCTOSPI(外部FLASH)连接到XSPI2,例如图中PN1(对应XSPIM_P2_NCS1)。
同样的观察到SPRAM连接到XSPI1,所以可以推断XSPI1对应SPRAM,XSPI2对应Flash。
在XSPIM管理中,我们将模式选择直接连接模式XSPI1 连接到Port1;XSPI2连接到Port2,XSPI3不使用。
根据参考手册定义,可以知道XSPI1对应地址0x90000000、XSPI2对应地址0x70000000;即Flash对应首地址为0x70000000、SPRAM对应首地址为0x90000000;
参考官方配置外部Flash(XPI2)参数如上图所示,尤其注意Mode栏别设置错了。
配置外部SPRAM的XSPI1参数如上图所示。
在存储管理界面,我们要设置FSBL的启动模式为在外部程序运行,存储选择为Memory1,偏移量为0x100000。由于有0x100000作为偏移,因此FSBL首地址烧录在0x70000000,Application用户程序首地址下载在0x100000处。
Memory配置为PSRAM.
同时需要注意控制一下XSPI1和XSPI2的时钟频率(200MHZ需要改IO配置,这里官方推荐50MHZ,但是实测100MHZ并没有问题,拉高到200MHZ就会异常),创建STM32CubeIDE工程。 2 代码编写
CubeMX创建代码后,可以看到整个STM32N6的工程被分成了两个独立工程,分别是Appli和FSBL,对应用户程序和第一阶段引导程序。
FSBL工程的主要内容是初始化XSPI和内存管理,初始化完成后,BOOT_Application函数调用跳转到指定的Flash位置。
Application工程中的main.c为我们的用户代码工程文件,我们在这里设置两个LED翻转。
修改STM32N6 Appli工程的编译链接文件为:STM32N657X0HXQ_ROMxspi2_RAMxspi1.ld,即程序存储在XSPI2,SPRAM为XSPI1。
分别编译两个工程后,都没有问题。 3 程序烧录 在上一步编译完程序后获得了:工程名_FSBL.bin和工程名_Appli.bin两个文件,但是我们不能直接烧录这两个文件,需要使用STM32CubeProgram插件对其进行数字签名。
可以在命令行用上述代码对二进制文件进行签名,需要注意的是,STM32_SigningTool_CLI.exe的路径必须添加在系统路径中,否则找不到。 当然我们也可以在STM32CubeIDE中设置一个命令,让程序在编译完之后自动进行签名:
这里注意的是,FSBL和Appli两个工程都要添加这个命令和进行签名。
接着我们需要打开STM32CubeProgrammer,将开发板的BOOT1拨到右边(1),BOOT0在左边(0)进入开发者模式。
连接到STM32N6570-DK开发板上后,我们需要选择外部Flash下载算法:
分别将签名后的FSBL代码和Appli代码烧录到地址0x70000000和0x70100000,之后将BOOT0和BOOT1拨回左边,复位板子:
文章出处:实在太懒于是不想取名 |
STM32N6的开发日记(3):如何利用CubeMX快速部署我们的神经网络模型
STM32N6的开发日记(1):上手难度拉满的N6有哪些不同?
【经验分享】LAT1491 STM32N6 的 FSBL 基本流程介绍
【经验分享】LAT1494 STM32N6 平台如何使用 MCO2 输出 Clock
STM32N6 PSRAM 代码调试实操:Attach模式实现外部存储器调试
实战经验 | STM32N6x勘误手册解读:开发避坑核心指南
STM32 开发者指南:ST.com 全新 MCU 产品阵容视觉布局深度解析
STM32N6 Helium 指令集:MVE 向量运算性能翻倍秘籍(基于 FIR 测试)
STM32N6 调试利器:SWV-ITM printf 重定向全流程拆解
实战经验 | 如何在STM32N6上验证AI模型
微信公众号
手机版