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.bin
、firmware.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
的作用是:
- 告诉 bootloader “我要升级的固件是谁”(bin + dat)。
- 声明对 硬件 / 版本 / SoftDevice 的要求。
- 提供 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_file
→sd_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 → 芯片型号 nRF52840device_type
: 82 → Nordic 设备类型 IDfirmware_crc16
: 32841 → 校验 CRC16softdevice_req
: [65534] → 当前设备无需 SoftDevice(65534 = 通配符)
-
sd_size
→ SoftDevice 大小(151,016 B ~ 148 KB)
🔹 升级逻辑
-
Bootloader 接收到 DFU 包 (
sd_bl.bin
+sd_bl.dat
) -
校验 init_packet_data:确认芯片型号、CRC、SoftDevice 版本等符合要求
-
写入 Flash:
- SoftDevice 升级区域 → 起始地址通常在 0x1000 开始(避开 Bootloader)
- Bootloader 升级区域 → 起始地址在 0x0000 ~ Bootloader_size
-
更新 settings → Bootloader 标记升级完成或失败
-
重启运行新固件
⚠️ 注意:这类 DFU 升级会 覆盖 Bootloader,所以必须确保:
- 固件是正确的组合包(Bootloader + SoftDevice)
- DFU 工具生成方式正确(
nrfutil pkg generate --sd-req 0xFFFF
)
🔹 与单纯应用升级的区别
项目 | 单纯应用升级 | SoftDevice + Bootloader 升级 |
---|---|---|
DFU 包 | app.bin / app.dat | sd_bl.bin / sd_bl.dat |
覆盖范围 | App 区 | Bootloader + SoftDevice 区 |
风险 | 低 | 高(Bootloader 被覆盖) |
manifest 字段 | application | softdevice_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 nRF52840 | UF2 Bootloader | 拖拽 .uf2 文件 | Arduino IDE 也可以生成 .uf2 |
Nordic Semiconductor nRF5 DK / PCA10056 | nRF5 SDK DFU Bootloader | nrfutil / J-Link / SWD | 面向开发者,可升级应用或 SoftDevice |
Zephyr / MCUboot + nRF52840 | MCUboot DFU Bootloader | SWD / UART / DFU | 更通用,可做 OTA 和安全升级 |
🔹 为什么官方现在更倾向 UF2
-
用户体验好
- UF2 表现为 USB 大容量存储设备(拖拽文件即可升级固件),无需复杂工具。
-
跨平台
- Windows / macOS / Linux 都能直接使用,无需安装 SDK 或 J-Link。
-
安全可靠
- Bootloader 和应用分区隔离,固件升级失败也不会损坏 bootloader。
-
适合教学与快速原型
- 像 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 的作用
-
解锁芯片(Recover)
-
当 nRF52 上 UICR.APPROTECT = 1 时,SWD/JTAG 被锁住,普通调试器无法访问 CPU。
-
此时,必须通过 CTRL-AP 的 Recover 命令:
- 全片擦除 Flash
- 清除 UICR.APPROTECT
- 恢复 SWD 调试接口可用
-
-
访问安全寄存器
-
CTRL-AP 内部有寄存器可以查询和控制保护状态:
APPROTECTSTATUS
→ 当前是否被锁ERASEALL
→ 全片擦除RESET
→ 芯片复位
-
-
和普通 SWD/AP 区别
普通 SWD/AP CTRL-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 = 芯片的“后门钥匙孔”
-
用途:
- 全片擦除
- 清除调试保护(APPROTECT)
- 恢复 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. 功能
-
解锁芯片(Recover)
- 当芯片的
UICR.APPROTECT
位被设置时,普通 SWD 调试接口会被锁死。 - CTRL-AP 提供“后门”命令,可以全片擦除 Flash、清除保护位,从而恢复 SWD 调试。
- 当芯片的
-
访问安全寄存器
-
例如:
APPROTECTSTATUS
:查询是否被锁ERASEALL
:全片擦除RESET
:复位芯片
-
-
区别于普通 SWD/AP
普通 SWD/AP CTRL-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 会导致芯片上锁