2. nRF芯片启动与存储架构

在nRF生产测试与自动化烧录中,最先要建立的一个认知是:烧录器写入的不是“一个固件文件”,而是若干具有不同地址、不同权限、不同生命周期的存储区域。nRF52、nRF53、nRF91虽然内核与安全架构不同,但存储模型有共同骨架:Flash用于存放代码与常量,RAM用于运行时数据,UICR用于用户配置,FICR用于出厂信息,协议栈或SoftDevice占用一段受保护区域。理解这些区域的边界,才能正确设置烧录地址、判断校验失败原因、避免误擦关键数据。

一、存储区域的基本分工

以nRF52832为例,其Flash为512 KB,地址范围0x0000_0000~0x0007_FFFF;RAM为64 KB,地址范围0x2000_0000~0x2000_FFFF。nRF5340应用核Flash为1 MB、网络核为256 KB,两者拥有独立地址空间;nRF9160则把应用与调制解调器固件分区管理,并引入更严格的安全域。无论哪一款,烧录工具看到的都是“地址+长度”的连续空间,但各段含义完全不同。

  • Flash主区:存放应用程序、协议栈、Bootloader。可擦写,但擦除以页为单位,nRF52页大小为4 KB,nRF53/nRF91为4 KB或更大。
  • RAM:掉电即失,不参与烧录内容校验,但链接脚本中的RAM起止地址会影响协议栈与应用的内存分配。
  • UICR:用户信息配置寄存器区,位于Flash高端附近,常用于写Bootloader起始地址、NFCT引脚、REG0/REG1稳压器配置、PSEL引脚等。它只能按字写、按页擦,写错会导致芯片启动异常。
  • FICR:工厂信息配置寄存器,只读,包含器件ID、加密密钥、校准值、RAM/Flash容量等。生产测试中常用它读取唯一ID做追溯。

二、协议栈与SoftDevice分区

在nRF52经典蓝牙方案中,SoftDevice是一段预编译的二进制协议栈,必须烧录到Flash起始地址0x0000_0000,应用程序紧随其后。例如S132 v7.2.0占用约152 KB,应用起始地址通常设为0x0002_6000。若应用链接地址与SoftDevice占用区重叠,运行时会直接HardFault。nRF53和nRF91使用更现代的协议栈组织方式,网络核固件与应用核固件分别烧录,但同样存在“协议栈区不可被应用擦除”的约束。

生产烧录时若使用全片擦除,会同时清除UICR和协议栈区。对于已量产校准过的板卡,全片擦除后必须重新写入UICR配置,否则可能出现引脚功能丢失或Bootloader无法启动。

三、对烧录与测试的直接影响

第一,烧录地址必须与链接脚本一致。nRF Connect SDK中通过CONFIG_FLASH_LOAD_OFFSET或分区管理器定义应用偏移;Keil/IAR中通过IROM1起始地址设置。若烧录器把应用写到0x0000_0000而SoftDevice也在该处,二者互相覆盖,设备表现为无法广播或反复复位。

第二,校验策略要区分区域。生产测试通常只校验应用区与协议栈区的CRC,不校验FICR;UICR则按写入值逐字比对。若把UICR纳入全片CRC,不同批次的校准值差异会导致误判。

第三,RAM不参与烧录,但影响测试项。例如协议栈需要保留一段RAM给射频中断和连接上下文,应用若把堆栈设得过大,运行时会出现内存分配失败。产测中可通过读取__StackTop或运行内存自检来间接判断。

# nRF52832 典型分区示例(S132 v7.2.0)
0x00000000 - 0x00025FFF  SoftDevice (152 KB)
0x00026000 - 0x0003FFFF  应用程序 (104 KB)
0x00040000 - 0x0007FFFF  Bootloader / DFU / UICR 预留
0x10001000 - 0x100010FF  UICR (256 B)
0x10000000 - 0x100000FF  FICR (256 B)

四、启动流程与存储区域的对应关系

上电后,CPU先从0x0000_0000读取初始栈指针,再从0x0000_0004读取复位向量。若该处是SoftDevice,则先由SoftDevice初始化射频与时钟,再跳转到应用复位向量;若使用Bootloader,则Bootloader先判断DFU条件,再决定是否跳转应用。UICR中的NRF_BOOTLOADERADDR决定Bootloader起始地址,写错会导致启动直接进入DFU或死循环。FICR中的DEVICEID和INFO_PART则用于识别芯片型号与容量,自动化烧录脚本常据此选择对应固件。

nRF52 存储映射与启动路径 Flash 512 KB SoftDevice / 协议栈 0x0000_0000 起,约152 KB 应用程序 0x0002_6000 起,链接脚本决定 Bootloader / DFU 地址由 UICR 指定 UICR 用户配置 0x1000_1000,256 B BOOTLOADERADDR / PSEL / REG0 FICR 只读 0x1000_0000 DEVICEID INFO_PART / 容量 校准值 / 加密密钥 产测用于追溯与选型 RAM 64 KB 0x2000_0000 起 协议栈保留区 应用堆 / 栈 掉电丢失,不烧录 影响运行时测试项 启动路径 上电复位 读 0x0000_0000 栈顶 读复位向量跳转 SoftDevice 初始化 跳转应用 / DFU 容量识别 ID追溯 配置读取

五、生产烧录中的关键检查点

基于上述结构,自动化烧录脚本至少应完成以下判断:读取FICR确认芯片型号与Flash容量,避免把512 KB固件烧进256 KB器件;读取UICR中的Bootloader地址,确认与待烧录Bootloader一致;烧录后分别校验SoftDevice区、应用区、UICR区的CRC或逐字比对;对已校准板卡,禁止无差别全片擦除。nRF91还需额外关注安全域与调制解调器固件分区,其烧录顺序和签名校验要求比nRF52更严格。

一个实用的产测习惯:把“芯片型号—Flash容量—协议栈版本—应用起始地址—UICR关键字段”做成一张对照表,烧录前由脚本自动比对,可拦截大部分因分区错位导致的批量故障。

总结来看,nRF芯片的存储架构不是简单的“Flash+RAM”,而是由Flash主区、协议栈区、UICR、FICR共同构成的分层体系。烧录地址、擦除范围、校验策略、启动跳转都直接受这些区域边界约束。把这张存储地图建立清楚,后续的自动化烧录脚本、产测工位配置和故障排查才有可靠依据。