当前位置: 首页 > news >正文

nrf52840 flash 分区

一个 nRF52840 Flash 分区 + DFU 升级区域示意,标明 Bootloader、SoftDevice、Settings 和 App 的位置,以及单应用升级和 Bootloader+SoftDevice 升级的区别。

nRF52840 Flash Layout (1 MB: 0x00000 - 0xFFFFF)
+---------------------------+
| 0x00000 - 0x0FFFF         |
| Bootloader (~64 KB)       | <- UF2 Bootloader / MCUboot
+---------------------------+
| 0x10000 - 0x25FFF         |
| SoftDevice (~150 KB)      | <- BLE stack (S140 or none)
+---------------------------+
| 0x26000 - 0xFF0FF         |
| Application (~796 KB)     | <- Zephyr / Arduino app
+---------------------------+
| 0xFF000 - 0xFFFFF         |
| Bootloader Settings (4 KB)| <- DFU metadata, swap flags
+---------------------------+

🔹 升级类型示意

1️⃣ 单纯应用升级 (application)
DFU 写入区域: 0x26000 - 0xFF0FF
Bootloader 完整无改动
SoftDevice 完整无改动
Settings 会更新应用 swap flags
2️⃣ Bootloader + SoftDevice 升级 (softdevice_bootloader)
DFU 写入区域: 0x00000 - 0x25FFF
Bootloader 被覆盖
SoftDevice 被覆盖
Application 区不动
Settings 会更新 swap flags
⚠️ 升级失败可能导致板子无法启动

要点总结

  • 如果你只是更新应用,用 application DFU → 安全,不触碰 Bootloader/SoftDevice。
  • 如果要升级 Bootloader 或 SoftDevice → 用 softdevice_bootloader DFU → 风险较高,必须保证 DFU 包正确。
  • Bootloader 设置区(0xFF000)总是安全更新,用于记录 DFU 状态。

application

你贴的这个 JSON 正是 nrfutil 生成的 DFU 包 (manifest.json) 的内容,描述了 DFU 升级所需的元数据。这个文件通常和 firmware.binfirmware.dat 一起打包进 .zip,用来告诉 bootloader 如何验证和写入固件。


📂 字段解析

{"manifest": {"application": {"bin_file": "firmware.bin","dat_file": "firmware.dat","init_packet_data": {"application_version": 4294967295,"device_revision": 65535,"device_type": 82,"firmware_crc16": 35009,"softdevice_req": [182]}},"dfu_version": 0.5}
}

🔹 manifest.application

应用固件的信息:

  • bin_file → 应用的二进制文件(原始固件)。
  • dat_file → 与 bin_file 匹配的 metadata(签名、校验信息等)。
  • init_packet_data → 初始化包(init packet),告诉 bootloader 如何验证固件。

🔹 init_packet_data 里各项

  • application_version: 固件版本号。

    • 这里是 4294967295 (0xFFFFFFFF),通常表示 “不限制版本”。
  • device_revision: 硬件修订版本。

    • 65535 (0xFFFF) = 通配符,表示所有版本都接受。
  • device_type: 设备类型 ID。

    • 这里是 82 (0x52),对应 nRF52840(Adafruit 在 Bootloader 里定义的 ID)。
  • firmware_crc16: 固件的 16 位 CRC 校验值。

    • Bootloader 用来检查固件完整性。
  • softdevice_req: 依赖的 SoftDevice 版本号。

    • [182] = 要求当前设备上存在 FWID=0x00B6 的 SoftDevice(对应 S140 v6.1.1)。

🔹 dfu_version

  • 0.5 → DFU 协议版本,和 bootloader 匹配。

📌 总结

这个 manifest.json 的作用是:

  1. 告诉 bootloader “我要升级的固件是谁”(bin + dat)。
  2. 声明对 硬件 / 版本 / SoftDevice 的要求。
  3. 提供 CRC 校验 确认固件是否完整。

所以:

  • 不会破坏 bootloader → 因为 manifest 只指向应用区(不会覆盖 bootloader 区域)。
  • 如果 device_type / softdevice_req 不匹配,bootloader 会拒绝升级,保证安全。

bootloader

你贴的这个 JSON 是 nrfutil DFU 包里的 manifest,这次它描述的是 SoftDevice + Bootloader 升级(而不是单纯应用固件)。我帮你详细解析一下。


🔹 JSON 内容

{"manifest": {"dfu_version": 0.5,"softdevice_bootloader": {"bin_file": "sd_bl.bin","bl_size": 39000,"dat_file": "sd_bl.dat","init_packet_data": {"application_version": 4294967295,"device_revision": 52840,"device_type": 82,"firmware_crc16": 32841,"softdevice_req": [65534]},"sd_size": 151016}}
}

🔹 字段解析

1. dfu_version

  • 0.5 → DFU 协议版本 0.5(与 Bootloader 协议一致)。
  • 旧版 Nordic DFU Bootloader / Adafruit UF2 Bootloader 使用 0.5。

2. softdevice_bootloader

说明这是 SoftDevice + Bootloader 的组合升级包,常用于 nRF52840 等带 BLE 的芯片。

内部字段:
  • bin_filesd_bl.bin,包含 SoftDevice + Bootloader 二进制镜像。

  • bl_size → Bootloader 大小(字节),这里 39,000 B (~38 KB)。

  • dat_file → 对应 metadata 文件 sd_bl.dat,包含校验、版本等信息。

  • init_packet_data → 初始化包,用于 Bootloader 校验升级合法性。

    • application_version: 4294967295 → 通配符版本
    • device_revision: 52840 → 芯片型号 nRF52840
    • device_type: 82 → Nordic 设备类型 ID
    • firmware_crc16: 32841 → 校验 CRC16
    • softdevice_req: [65534] → 当前设备无需 SoftDevice(65534 = 通配符)
  • sd_size → SoftDevice 大小(151,016 B ~ 148 KB)


🔹 升级逻辑

  1. Bootloader 接收到 DFU 包 (sd_bl.bin + sd_bl.dat)

  2. 校验 init_packet_data:确认芯片型号、CRC、SoftDevice 版本等符合要求

  3. 写入 Flash

    • SoftDevice 升级区域 → 起始地址通常在 0x1000 开始(避开 Bootloader)
    • Bootloader 升级区域 → 起始地址在 0x0000 ~ Bootloader_size
  4. 更新 settings → Bootloader 标记升级完成或失败

  5. 重启运行新固件

⚠️ 注意:这类 DFU 升级会 覆盖 Bootloader,所以必须确保:

  • 固件是正确的组合包(Bootloader + SoftDevice)
  • DFU 工具生成方式正确(nrfutil pkg generate --sd-req 0xFFFF

🔹 与单纯应用升级的区别

项目单纯应用升级SoftDevice + Bootloader 升级
DFU 包app.bin / app.datsd_bl.bin / sd_bl.dat
覆盖范围App 区Bootloader + SoftDevice 区
风险高(Bootloader 被覆盖)
manifest 字段applicationsoftdevice_bootloader

✅ 总结

  • 这个 manifest 用于 更新 Bootloader + SoftDevice
  • DFU 升级前一定要保证 .bin.dat 是由 nrfutil pkg generate 生成,避免写错 Bootloader 区导致板子变砖。
  • 如果你只是更新应用,不需要用 softdevice_bootloader,只用 application 就行,更安全。

目前 Adafruit、Arduino 和 Nordic 官方的一些开发板确实都是以 UF2 Bootloader 为主流,尤其是面向初学者和桌面 USB 更新的板子。这里给你梳理一下:


🔹 官方板子的 Bootloader 历史

厂商 / 平台Bootloader 类型更新方式特点
Adafruit (Feather nRF52840, CircuitPython)UF2 Bootloader拖拽 .uf2 文件支持 Windows/Mac/Linux,无需额外工具,安全可靠
Arduino nRF52840UF2 Bootloader拖拽 .uf2 文件Arduino IDE 也可以生成 .uf2
Nordic Semiconductor nRF5 DK / PCA10056nRF5 SDK DFU Bootloadernrfutil / J-Link / SWD面向开发者,可升级应用或 SoftDevice
Zephyr / MCUboot + nRF52840MCUboot DFU BootloaderSWD / UART / DFU更通用,可做 OTA 和安全升级

🔹 为什么官方现在更倾向 UF2

  1. 用户体验好

    • UF2 表现为 USB 大容量存储设备(拖拽文件即可升级固件),无需复杂工具。
  2. 跨平台

    • Windows / macOS / Linux 都能直接使用,无需安装 SDK 或 J-Link。
  3. 安全可靠

    • Bootloader 和应用分区隔离,固件升级失败也不会损坏 bootloader。
  4. 适合教学与快速原型

    • 像 CircuitPython、Arduino Nano/Feather 系列,UF2 简化了固件更新流程。

🔹 总结

  • 官方板子现在主要是 UF2 Bootloader(拖拽更新),特别是桌面 USB 连接的板子。
  • 对于专业开发、OTA 升级、SoftDevice 或 Bootloader 更新,还是用 Nordic DFU / MCUboot 较多。

1️⃣ CTRL-AP 全称

CTRL-AP = Control Access Port

  • nRF52 系列芯片内的一个专用访问端口
  • 主要功能是 安全访问与芯片恢复,而不是普通的 Flash 读写或调试寄存器访问。

2️⃣ CTRL-AP 的作用

  1. 解锁芯片(Recover)

    • 当 nRF52 上 UICR.APPROTECT = 1 时,SWD/JTAG 被锁住,普通调试器无法访问 CPU。

    • 此时,必须通过 CTRL-AP 的 Recover 命令

      • 全片擦除 Flash
      • 清除 UICR.APPROTECT
      • 恢复 SWD 调试接口可用
  2. 访问安全寄存器

    • CTRL-AP 内部有寄存器可以查询和控制保护状态:

      • APPROTECTSTATUS → 当前是否被锁
      • ERASEALL → 全片擦除
      • RESET → 芯片复位
  3. 和普通 SWD/AP 区别

    普通 SWD/APCTRL-AP
    读写 CPU 寄存器、Flash控制安全访问,解锁芯片
    可直接访问所有 Flash/寄存器(未上锁)必须用支持 CTRL-AP 的调试器
    ST-Link 无法访问J-Link / Nordic DK 可以访问

3️⃣ 触发条件

CTRL-AP 并不是平时调试就会用到,只有在特定情况下才会触发:

  • APPROTECT 已启用 → 普通 SWD 无法访问时必须使用 CTRL-AP
  • 执行 nrfjprog --recover 或 J-Link 的 Recover 命令
  • 芯片上电后发现 SWD 被锁死,需要解除保护

4️⃣ 直白总结

  • CTRL-AP = 芯片的“后门钥匙孔”

  • 用途:

    1. 全片擦除
    2. 清除调试保护(APPROTECT)
    3. 恢复 SWD/JTAG 调试
  • ST-Link 访问不到 CTRL-AP → 无法解锁

  • J-Link / Nordic 开发板可以访问 CTRL-AP → 支持 recover


如果你愿意,我可以画一张 nRF52 SWD vs CTRL-AP 的示意图,标出数据流和解锁路径,这样你一眼就能看懂 CTRL-AP 的作用。

你希望我画吗?

好的,我给你详细解释一下 CTRL-AP(Control Access Port)


1. 定义

CTRL-AP 是 nRF52 系列芯片内部的一个特殊访问端口(Access Port),全称 Control Access Port。它并不是普通的 SWD/AP 接口,而是专门设计用来处理 安全控制和芯片恢复 的。


2. 功能

  1. 解锁芯片(Recover)

    • 当芯片的 UICR.APPROTECT 位被设置时,普通 SWD 调试接口会被锁死。
    • CTRL-AP 提供“后门”命令,可以全片擦除 Flash、清除保护位,从而恢复 SWD 调试。
  2. 访问安全寄存器

    • 例如:

      • APPROTECTSTATUS:查询是否被锁
      • ERASEALL:全片擦除
      • RESET:复位芯片
  3. 区别于普通 SWD/AP

    普通 SWD/APCTRL-AP
    读写 CPU 寄存器和 Flash控制安全访问和恢复操作
    ST-Link 可以访问ST-Link 无法访问,需要 J-Link 或 Nordic DK

3. 触发条件

  • 芯片上锁(APPROTECT = 1)
  • 使用 nrfjprog --recover 或 J-Link 的 Recover 命令
  • 芯片上电时 SWD 接口被锁死,需要解除保护

4. 总结

  • CTRL-AP 是 芯片的“解锁钥匙孔”
  • 只有在芯片保护开启时才用到
  • 普通调试器(如 ST-Link)无法访问,必须使用支持 CTRL-AP 的调试器(J-Link / Nordic 开发板)

下载错版本不对应的uf2 bootloader 会导致芯片上锁

http://www.dtcms.com/a/359633.html

相关文章:

  • 3【鸿蒙/OpenHarmony/NDK】如何在鸿蒙应用中使用NDK?
  • 线阵相机和镜头选型案例介绍
  • 【不懂就问】-手机相关学习
  • 打开多个Excel文件后快速关闭所有的文档,并且退出Excel应用
  • Docker一小时快速上手(附报错解决方式)
  • 并发编程——11 并发容器(Map、List、Set)实战及其原理分析
  • deep seek的对话记录如何导出
  • CICD实战(1) - 使用Arbess+GitPuk+Docker快速实现项目打包构建、docker部署
  • 视频理解与行为识别全景综述
  • 计算机网络:(十六)TCP 的运输连接管理
  • 传统数据库out啦!KINGBASE ES V9R1C10 开启国产数据库“修仙”新纪元!
  • Redis六大常见命令详解:从set/get到过期策略的全方位解析
  • 大模型推理技术解析
  • AI热点周报(8.24~8.30):Grok 2.5开源,OpenAI Realtime正式商用,Meta或与OpenAI或Google合作?
  • 学习记录(二十二)--Overleaf中生成的PDF左上角1.5em问题
  • 【stm32】对射式红外传感器计次以及旋转编码器计次
  • 基于单片机智能大棚/温室大棚/智慧农业/智能栽培种植系统/温湿度控制
  • 使用VBA实现快速多重数据筛选
  • Flink部署实战:从入门到优化
  • 第 14 篇:K-Means与聚类思维——当AI在没有“标准答案”的世界里寻宝
  • python实现滤波器的简单案例
  • python如何打开显示svg图片
  • 阿里云-应用实时监控服务 ARMS
  • Unity笔记(九)——画线功能Linerenderer、范围检测、射线检测
  • AFSIM仿真脚本生成(三)脚本解析技术加速验证过程
  • Linux 系统都有哪些
  • HikariCP vs DBCP2 vs Tomcat JDBC:多场景数据库连接池方案对比与实践指南
  • 大模型RAG项目实战:Milvus向量数据库
  • 《SVA断言系统学习之路》【02】并发断言
  • C++11语言(三)