1. nRF54系列硬件架构与开发环境搭建

nRF54系列是Nordic在nRF52之后推出的新一代低功耗无线SoC,其核心变化不只是主频提升,而是从内核、总线、内存到外设访问路径的整体重构。理解这些硬件结构,是后续编写外设驱动和做板级适配的前提。本章先建立“芯片内部如何组织、程序如何被编译并落到芯片上”的完整认知,再完成第一个可烧录工程。

1.1 Cortex-M33内核与总线矩阵

nRF54系列采用Arm Cortex-M33内核,带FPU和DSP扩展,支持TrustZone安全隔离。与nRF52使用的Cortex-M4相比,M33在指令集、中断控制和安全性上都有升级。对驱动开发者而言,最直接的影响是:外设寄存器访问仍然通过内存映射地址完成,但不同外设挂载在不同的总线主/从端口上,访问延迟和并发能力存在差异。

芯片内部通过总线矩阵连接CPU、DMA、外设和内存。CPU取指、数据读写、DMA搬运可以并行进行,但若多个主设备同时访问同一从设备(如某段SRAM或某个外设总线),就会产生仲裁和等待。因此在高实时场景中,应尽量让DMA访问的内存区域与CPU频繁访问的栈区分离,减少总线争用。

nRF54系列内部总线与内存映射示意 Cortex-M33 FPU / DSP / TrustZone 总线矩阵 多主多从 / 仲裁 DMA / PPI 独立搬运通道 Flash 映射区 0x0000_0000 起 存放向量表与代码 SRAM 映射区 0x2000_0000 起 栈 / 堆 / 全局变量 外设寄存器区 0x4000_0000 起 GPIO / UART / SPI 等 关键约束 DMA 缓冲区与 CPU 栈区分离,减少总线争用;外设访问需使能对应时钟 TrustZone 下安全/非安全分区影响外设归属,驱动初始化前需确认属性

1.2 内存映射与启动流程

nRF54的地址空间遵循Cortex-M标准布局:Flash从0x0000_0000开始,SRAM从0x2000_0000开始,外设寄存器从0x4000_0000开始。上电后,CPU从Flash起始处读取向量表,取出初始栈指针和复位向量,跳转到启动代码。启动代码完成时钟初始化、数据段搬运、BSS清零,最后调用main函数。

在nRF Connect SDK中,这些启动细节由Zephyr的启动流程接管。开发者通常不需要手写启动汇编,但需要理解链接脚本如何把代码放到Flash、把变量放到SRAM。若使用TrustZone,还会涉及安全区与非安全区的地址划分,安全固件先启动,再跳转到非安全应用。

1.3 nRF Connect SDK安装与工具链配置

nRF Connect SDK基于Zephyr RTOS,包含协议栈、驱动、示例和构建系统。推荐使用nRF Connect for VS Code扩展或命令行工具链管理器安装。以下以命令行方式说明关键步骤,实际路径和版本号以安装时的工具链管理器输出为准。

# 1. 安装 nRF Connect Toolchain Manager(或使用 VS Code 扩展)
# 2. 在工具链管理器中安装指定版本的 nRF Connect SDK
#    例如选择 v2.x 系列,安装后记录 SDK 路径

# 3. 初始化 west 工作区(示例路径,需替换为实际路径)
west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.6.0 nrf54_ws
cd nrf54_ws
west update

# 4. 导出 Zephyr 环境
west zephyr-export

# 5. 查看可用板型,确认 nRF54 开发板名称
west boards | grep nrf54

工具链配置的核心是让构建系统找到三样东西:Zephyr基础、nRF Connect SDK扩展、以及交叉编译器。使用工具链管理器安装时,这些环境变量会自动配置;若手动安装,则需要设置ZEPHYR_BASE和PATH。配置完成后,用west --version和arm-zephyr-eabi-gcc --version验证。

工具链版本必须与SDK版本匹配。混用不同版本的Zephyr和nRF Connect SDK,常见结果是编译通过但链接失败,或运行时外设初始化异常。

1.4 首个工程:编译与烧录

选择SDK自带的hello_world示例作为第一个工程。进入示例目录后,使用west build指定板型进行编译。假设开发板为nrf54l15dk/nrf54l15/cpuapp,命令如下:

cd nrf54_ws/nrf/samples/hello_world
west build -b nrf54l15dk/nrf54l15/cpuapp

# 编译成功后,产物位于 build/zephyr/zephyr.hex
# 烧录
west flash

编译过程中,构建系统会依次完成:解析prj.conf和板级设备树、生成配置头文件、编译C源码、链接生成ELF和HEX。若编译报错,优先检查板型名称是否与west boards输出一致,以及SDK版本是否支持该板型。

烧录后,通过串口查看输出。nRF54开发板通常板载调试器提供虚拟串口,波特率默认115200。若看到Hello World! nrf54l15dk字样,说明工具链、构建、烧录、串口链路全部打通。若没有输出,依次检查:串口端口号是否正确、波特率是否匹配、板子是否处于复位状态、prj.conf中是否使能了串口驱动。

1.5 常见问题与判断依据

现象 可能原因 判断与处理
west build 报找不到板型 SDK版本不支持该板或板名拼写错误 用 west boards 确认可用板名,核对SDK版本
编译通过但链接报错 工具链与SDK版本不匹配 重新用工具链管理器安装匹配版本
烧录成功但串口无输出 串口未使能、端口错误或波特率不符 检查 prj.conf、设备管理器和波特率设置
程序运行后立即复位 栈溢出、时钟未初始化或安全区配置错误 查看复位原因寄存器,检查链接脚本和TrustZone配置

完成第一个工程后,建议立即做一次“最小改动验证”:在main中增加一行打印,重新编译烧录,确认改动生效。这一步能排除“烧录的是旧固件”这类低级问题,也为后续外设驱动调试建立可靠的反馈链路。

本章的关键不是记住某条命令,而是建立三层认知:芯片内部谁连谁(总线与内存映射)、程序如何从源码变成Flash中的镜像(构建与启动)、以及如何确认它真的在板子上跑起来(烧录与串口验证)。后续所有外设驱动,都在这三层之上展开。