zephyr OS架构下构建Nordic MCU boot

目录

概述

[1. 软硬件环境](#1. 软硬件环境)

[1.1 软件开发环境](#1.1 软件开发环境)

[1.2 硬件环境](#1.2 硬件环境)

[2 MCU boot](#2 MCU boot)

[2.1 核心功能](#2.1 核心功能)

[2.2 关键术语](#2.2 关键术语)

[2.3 重要字段介绍](#2.3 重要字段介绍)

[3 VS-Code下创建MCU-BOOT项目](#3 VS-Code下创建MCU-BOOT项目)

[3.1 软件框架结构](#3.1 软件框架结构)

[3.2 创建测试项目](#3.2 创建测试项目)

[3.3 编译项目](#3.3 编译项目)

[3.3 固件在Flash中的分布](#3.3 固件在Flash中的分布)

[4 验证](#4 验证)

[4.1 烧写固件](#4.1 烧写固件)

[​ 4.2 代码实现原理](#4.2 代码实现原理)

[4.3 验证固件升级功能](#4.3 验证固件升级功能)


概述

本文主要介绍在 Zephyr RTOS 架构下为 Nordic MCU (如 nRF52/nRF53 系列) 构建 MCUboot 引导加载程序,需要遵循的主要步骤。包括MCU boot介绍,VS-Code下创建MCU-BOOT项目的方法,以及在nRF52840开发板上验证该程序。

1. 软硬件环境

1.1 软件开发环境

nordic提供了基于zephyr平台sdk, 其提供了大量的demo可供开发者参考和使用,同时nordi还提供一个集成的软件库工具,方便开发者安装相应的SDK和编译工具链。集成环境同时包含了其他的一些软件,非常便于进行项目开发。

|---------------------------|----------------------|----------|
| 软件工具 | 功能 | 版本信息 |
| nRF Connect SDK | nordic提供基于zephyr的代码库 | v2.9.0 |
| nRF Connect SDK Toolchain | 代码编译工具 | v2.9.1 |
| VS-CODE | 集成开发环境 | v1.99.3 |
| nRF Connect for Desktop | nordic集成工具链 | v5.1.0 |
| nRF Connect | 手机App | |

手机App下载地址:

bash 复制代码
https://nav.nordicsemi.com/search?query=nRF%20Connect

搭建编译环境的注意点

安装工具时,在D:\ncs\v2.9.0目录下执行如下语句,安装与编译器相关的工具链

bash 复制代码
pip3 install --user -r scripts/requirements.txt

运行该语句后,安装信息如下:

1.2 硬件环境

本案例是在nRF52840开发板(nRF52-DK)上实现的,该开发板nRF52840的主要特点如下:

1)板载j-link调试接口

2)引出所有 IO接口,用户可根据实际应用,外载其他设备

3)支持4个LED

4)支持4路Key接口

5)板载UART调试接口,方便打印调试信息

2 MCU boot

MCUboot 是一个开源的安全引导加载程序(Secure Bootloader),专为微控制器(MCU)设计,支持固件验证、安全更新和回滚保护等功能。以下是 MCUboot 的详细使用方法。

2.1 核心功能

  • 安全启动:验证固件签名后再执行

  • 固件更新:支持多种更新机制

  • 回滚保护:防止降级到不安全版本

  • 多镜像支持:A/B分区、升级/回滚机制

2.2 关键术语

  • Primary slot:主运行分区

  • Secondary slot:备用/升级分区

  • Image trailer:镜像尾部的元数据区

  • Swap type:交换类型(测试/永久)

2.3 重要字段介绍

以如下字段为例介绍,mcu boot 提供信息的字段解释:

bash 复制代码
Primary image: magic=good, swap_type=0x3, copy_done=0x1, image_ok=0x1 

字段解析:


magic=good

magic: 是一个固定值(例如 0x77d4b535),用于验证镜像头的有效性。

good: 表示该值匹配预期,说明镜像头部是合法的,可以被引导加载程序识别。


swap_type=0x3

表示镜像交换(swap)的类型,常见于支持固件双分区(A/B分区)的系统中。

0x3 可能对应某种特定的交换模式,例如:

**0x1:**测试镜像(测试后回滚或确认)。

**0x2:**永久性交换(确认更新)。

**0x3:**可能是"恢复模式"或"回滚操作"

(注:具体含义需结合具体引导加载程序的实现,例如 MCUboot 的 swap_type 定义。)


copy_done=0x1

标志位,通常表示"镜像已成功复制到目标分区"。

0x1: 表示完成,

0x0 :表示未完成。


image_ok=0x1

标志位,表示"当前镜像已验证且可启动"。

0x1 :表示镜像有效,系统可以安全启动;

0x0 :可能表示镜像损坏或需要回滚。

3 VS-Code下创建MCU-BOOT项目

3.1 软件框架结构

1) sysbuild.conf

使能和boot相关的配置信息,SB_CONFIG_BOOTLOADER_MCUBOOT=y用于使能mcuboot

bash 复制代码
SB_CONFIG_BOOTLOADER_MCUBOOT=y
SB_CONFIG_PARTITION_MANAGER=n
  1. \sysbuild\mcuboot.conf

设置boot编译选项

文件的内容如下:

bash 复制代码
CONFIG_MCUBOOT_LOG_LEVEL_INF=y

3.2 创建测试项目

分别创建两个测试项目,用于验证Boot之间的跳转

3.3 编译项目

完成以上配置后,就可以编译项目,具体编译结果如下:

上图有3个编译结果,其中mcuboot为bootloader的生成目录

3.3 固件在Flash中的分布

在nRF52840的设备树中已经分配了固件Image的空间,其具体内容如下:

boot_partition: mcu boot存储的位置

slot0_partition: image-0的地址

slot1_partition: image-1的地址

设备树已经计算出了所占Flash的空间大小:

4 验证

4.1 烧写固件

完成编译后,会在Build目录下分别生成3个编译项目,其对应3块固件

下面分别烧录3块固件,观察MCU的运行情况

1) 擦除整块Flash

  1. 烧写MCU boot

烧写完成后,MCU会复位,串口打印如下log:

查看Flash中的数据, MCU boot已经烧写到Flash中

3) 烧写Image-0

串上已经输出Image-0的log:

查看Flash中的数据信息:

4)烧写Image-1

串口终端上并没有打印Image-1运行的log:

查看Flash中的内容:

4.2 代码实现原理

1)固件升级实现代码

代码101行: 实现固件升级功能

代码106行: MCU复位

2)测试函数代码

代码第81行: 调用固件升级功能

代码第88行: 删除Image-1

固件升级后,可以通过该语句删除Image-0

4.3 验证固件升级功能

在通过使用DK-52840上的两个按键,选择是否升级或者删除Image-1

  1. 按下button-0:

log信息

*** Booting MCUboot v2.1.0-dev-12e5ee106034 ***

*** Using nRF Connect SDK v2.9.0-7787b2649840 ***

*** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
I: Starting bootloader
I: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Secondary image: magic=good, swap_type=0x3, copy_done=0x3, image_ok=0x1

I: Boot source: none

I: Image index: 0, Swap type: perm

I: Starting swap using move algorithm.

I: Bootloader chainload address offset: 0xc000

*** Booting nRF Connect SDK v2.9.0-7787b2649840 ***
*** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
Swapped application booted on nrf52840dk

相关推荐
学习噢学个屁30 分钟前
基于51单片机的红外人体感应报警器
c语言·单片机·嵌入式硬件·51单片机
技术干货贩卖机2 小时前
0基础 | STM32 | STM32F103C8T6开发板 | 项目开发
stm32·单片机·嵌入式硬件·源代码·项目开发·0基础
Leon_George3 小时前
GPIO引脚的上拉下拉以及转换速度到底怎么选
单片机·嵌入式硬件·引脚配置·上拉下拉·引脚速度
2401_888859714 小时前
STM32 USART串口
stm32·嵌入式硬件
zhugedz4 小时前
开关电源原理
单片机·嵌入式硬件
河湾边的一亩三分地5 小时前
STM32 PulseSensor心跳传感器驱动代码
stm32·单片机·嵌入式硬件
学生小羊5 小时前
[C++] 小游戏 决战苍穹
c++·stm32·单片机
百里东风5 小时前
STM32外设-GPIO输出(不含复用)
c语言·stm32·单片机·嵌入式硬件
菜只因C6 小时前
深入探索 51 单片机:从入门到实践的全面指南
单片机·嵌入式硬件