目录

文章目录

前言

一、STM32N647是什么?

二、BOOTLOADER是什么?

1、自编bootloader

二、使用流程

1.cubemx配置(参考正点原子的教程)

2.启动流程理解

2.1 development 模式启动

2.2 flash 模式启动

所以最终工作流应该是

总结


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

由于课题需要,博主将使用STM32N647核心板(正点原子)进行开发,但是原子官方以及网上资源较少,因此博主需要自己摸索进行开发。

一、STM32N647是什么?

STM32N6 系列是 ST 推出的第一款内嵌 AI 加速器的高性能 STM32 MCU,它基于运行频率达 800MHz 的 ARM Cortex-M55 内核推出的高性能系列 MCU,是首款引入 Arm Helium 向量处理技术的 CPU,为标准 CPU 增添 DSP 处理能力。

STM32N6 是内嵌的 AI 加速器是 ST 自主研发的神经处理单元(ST Neural-ART accelerator™),专为节能型边缘 AI 应用而设计,其时钟频率高达 1GHz,计算性能可达 600GOPS,可为计算机视觉和音频应用提供实时神经网络推理能力。

二、BOOTLOADER是什么?

由于之前我不太懂这一块,我详细总结了一下便于理解!

BOOT1 引脚 BOOT0 引脚 启动模式 描述
X (任意) 0 从主闪存 (Main Flash memory) 启动 这是最常用的模式。芯片复位后,会从内部 Flash 的起始地址 0x08000000 开始执行用户程序。
0 1 从系统存储器 (System memory) 启动 芯片会运行 ST 官方固化在内部的一段 Bootloader 程序。这个程序可以通过 USART、I2C、SPI、USB 等接口接收数据,用于烧写或更新 Flash 中的用户代码,无需外部调试器。
1 1 从内置 SRAM 启动 芯片会从内部 SRAM 的起始地址 0x20000000 开始执行代码。这个模式通常用于快速调试,或者一些需要将代码动态加载到 RAM 中运行的特殊应用。

从系统存储器 (System Memory) 启动,主要是为了执行 ST 官方固化在芯片内部的一段引导加载程序 (Bootloader),从而实现对芯片的“在系统编程”(In-System Programming, ISP),日常我们使用都是从内部Flash(也就是常说的ROM)读取之前保存的数据,在设备的正常工作模式下,每次开机都根本不会用到 Bootloader,当我们自定义的BootLoader出错时,需要使用出厂BootLoader来对自定义的BootLoader程序进行修复更新(被锁定到flash某一块区域)。我们也可以自己编写bootloader程序,但是需要写到0x08000000,实际上是把 Bootloader 程序 和 Application 程序 这两个编译好的二进制文件,先后烧录到 Flash 的不同区域。

1、自编bootloader

Bootloader的核心逻辑:一个 “IF...ELSE...” 结构

让我们把Bootloader的工作流程想象成一个简单的伪代码:

// Bootloader 程序开始运行
void Bootloader_Main()
{
    // 1. 进行最基础的系统初始化 (时钟等)
    Initialize_Minimal_System();

    // 2. 检查“升级条件”是否满足?  <-- 这是最关键的一步!
    if ( Is_Update_Required() == TRUE )
    {
        // 条件满足,进入“升级模式”
        // 这里的代码才是实现“更新”的魔法所在
        Perform_Firmware_Update();
    }
    else
    {
        // 条件不满足,进入“正常启动模式”
        // 这才是您提到的“把程序引向App部分”
        Jump_To_Application();
    }
}

升级条件可以类似于串口收到一个特定指令进入升级,当“升级条件”满足时,Bootloader根本不会去跳转到旧的App,进入一下流程:

  1. 准备接收新固件: 初始化用于接收固件的通信接口(比如打开串口、挂载SD卡文件系统、启动网络服务等)。

  2. 接收新的App固件: 通过上述接口,开始接收新的、在电脑上编译好的 .bin 文件数据流。

  3. 擦除旧的App: 这是决定性的一步!Bootloader会调用STM32的底层驱动,将存放旧App的那片Flash区域(例如从 0x08010000 开始的区域)完全擦除掉! 这时,旧的App已经从芯片里消失了。

  4. 写入新的App: 将刚刚接收到的新固件数据,一点一点地写入到刚才被擦除的那片空白的Flash区域。

  5. 校验与重启: 写入完成后,进行CRC校验或哈希校验,确保固件没有损坏。校验成功后,程序控制Bootloader进行一次系统复位。

二、使用流程

我使用的是Stm32cubeide+stm32cubemx(6.15)

警告:尽量软件都用最新版,我之前用的ide是旧版就一直build报错,很多旧版并没有兼容n6系列!!!

1.cubemx配置(参考正点原子的教程)

开发流程 Step-by-Step | 正点原子在线文档

2.启动流程理解

STM32N6有三种启动模式,分别是开发者模式(development)启动、FLASH模式启动、串行启动

对于初学者来说一般接触的都是前两种模式启动,不同模式就需要看他的BOOT0、BOOT1引脚电平,详细电平如图1所示。

我是自己简单做了个底板,直接通过切换BOOT1的电平进行两种模式的切换。

上电
 └→ BootROM(ROM,厂家固化)
      └→ 判断BOOT1引脚
           ├→ HIGH: Developer模式 → 等待烧录FSBL到外部Flash(正点原子教程有说明通过Stm32cubeide烧录FSBL固件,一般只需要烧录一次即可,后面直接烧录自己的Appli程序即可),等待烧录Appli到外部Flash
           └→ LOW:  Flash模式 → 从外部Flash加载FSBL
                         └→ FSBL执行:初始化XSPI/外部RAM
                               └→ 跳转到主应用程序

2.1 development 模式启动

BOOT1 = HIGH(Developer模式)
 └→ BootROM启动
             └→ BootROM直接进入等待烧录状态
                   └→ ST-Link的External Loader初始化XSPI
                         └→ 将Appli烧录到外部Flash
                               └→ Debug时ST-Link直接设置PC执行

2.2 flash 模式启动

BootROM → FSBL(初始化XSPI等) → Appli → 流水灯等

我们需要注意的是FSBL会把XSPI等都初始化好,我们在配置cubemx的时候,尽量吧XSPI配置一下,因为后面会用到。

我们在development模式下烧录的时候不要开启MX_XSPI1_Init();可以这样。

#ifdef DEBUG
  MX_XSPI1_Init();
#endif

因为只能在development模式下进行debug,而我们的ST-Link调试时,程序依然烧录到外部Flash(0x70100400),不是内部RAM,但是执行方式不同:

ST-Link连接芯片
 └→ ST-Link通过DAP协议直接控制CPU
       └→ 强制设置PC指针到 0x70100400
             └→ CPU直接从外部Flash取指执行
                   └→ 不经过BootROM,不经过FSBL

Debug模式下没有FSBL,所以ST-Link自己承担了这个职责

  • ST-Link连接时会加载一个External Loader
  • 这个External Loader负责初始化XSPI,让外部Flash可以被访问
  • 然后ST-Link才能把程序烧进去,并且CPU才能从那里取指执行

所以说我们去flash模式下验证的时候并不需要在开启XISP了,因为FSBL已经初始化过,否则会乱掉,直接注释掉我们就可以实现功能。

Development模式下的两种运行方式

在标准的 IDE Debug(开发调试)模式下,真正的 FSBL 通常是“被绕过”或“被替代”的,它不会像芯片正常上电那样去完整运行

在插着仿真器的 Development(开发联机状态) 下,IDE 的 Debug(调试) 功能并不是让芯片自然启动,而是通过调试器脚本越过了原本的 Bootloader (FSBL),直接强行初始化硬件并劫持 PC 指针跳转到 main() 函数,这是一种为了方便找错而存在的、高度受控的独特运行方式

自己Run(烧录完自动Run):

ST-Link烧录完 → 触发Run → 直接跳转PC到Appli地址
→ 没有经过FSBL初始化
→ XSPI、HyperRAM等外设没有初始化
→ 程序大概率跑飞或卡死

Debug运行:

ST-Link烧录完 → 先走FSBL初始化流程(或External Loader初始化)
→ 然后ST-Link接管CPU,设置PC到Appli地址
→ 外设已经初始化好
→ 程序正常运行 ✅

所以最终工作流应该是

目的 操作
调试代码、打断点 Development模式 + CubeIDE Debug
验证最终运行效果 Flash模式 + 断电重启

总结

以上就是今天要讲的内容,本文仅仅简单介绍了N6的使用,后续我将会继续更新。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐