- 操作系统
- 嵌入式
- RTOS
- 物联网
【免费下载链接】zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
导读
本文以 Zephyr 仓库中的 MCX-N9XX-EVK 板级文档 为主线,系统讲解在 NXP MCX-N9XX-EVK 评估板上使用 Zephyr RTOS 进行开发的全流程:从硬件资源认知、双核(CPU0/CPU1)镜像构建,到 LinkServer/J-Link 调试、QSPI 外部 Flash XIP 启动与 MCUboot 集成。读完本文,你将能够独立完成该板卡的工程配置、双核与外部 QSPI 启动方案的构建、烧录与调试,并理解其底层分区与内存映射的源码依据。
板卡概述
MCX-N9XX-EVK 是面向 MCX N94 / N54 系列 MCU 原型设计的一体化评估套件。板卡提供行业标准排针以访问 MCU 的 I/O,集成开放标准的串行接口,并板载一颗支持功耗测量的 MCU-Link 调试器。MCX N 系列属于高性能、低功耗微控制器,内置智能外设与硬件加速器,具备多任务处理能力与高效能表现。
核心硬件资源
- 主控:MCX-N947 双核 Arm Cortex-M33,运行于 150 MHz
- 片内 Flash:2 MB 双 Bank 结构
- 片内 RAM:512 KB
- 外部存储:经 FlexSPI 接口连接的外部 Quad SPI Flash(板载 Winbond W25Q64 等,见下文 QSPI 变体)
- USB:高速 USB(Host/Device,片上 HS PHY)与全速 USB(Host/Device,片上 FS PHY)
- 串行接口:10 路 LP Flexcomm,每路均可配置为 SPI、I2C、UART
- 其他外设:支持 CAN FD 的 FlexCAN、I3C、SAI 音频接口
- 以太网:1 路带 QoS 的 Ethernet
- 调试器:板载 MCU-Link 调试器(CMSIS-DAP)
- 扩展接口:Arduino Header、FlexIO/LCD Header、mikroBUS、M.2
支持的功能与 Shields
板卡支持的功能矩阵由 :zephyr:board-supported-hw:: 指令自动生成(对应源码可见 mcx_n9xx_evk_mcxn947_cpu0.yaml 等 YAML 定义),其中部分功能通过 Zephyr Shield 在板卡上完成了实测验证:
lcd_par_s035Shield:支持显示接口。该 Shield 使用 MIPI_DBI 接口,经板卡片上 FlexIO 外设连接。
双核架构与内存映射
MCX-N947 内含两个 Cortex-M33 核心。文档给出了双核 Flash 与 RAM 的划分方案,这是理解双核镜像构建的基础:
| Core | Boot Address | 说明 |
|---|---|---|
| CPU0 | 0x10000000 [1856K] | 主核(primary core)Flash 空间 |
| CPU1 | 0x101d0000 [192K] | 从核(secondary core)Flash 空间 |
| Memory | Address [Size] | 说明 |
|---|---|---|
| srama | 0x20000000 [320K] | CPU0 的 RAM |
| sramg | 0x20050000 [64K] | CPU1 的 RAM |
| sramh | 0x20060000 [32K] | 双核共享内存 |
从源码可以进一步印证这套划分:
- mcx_n9xx_evk_mcxn947_cpu1.dts 中通过
chosen将zephyr,sram指向sramg、zephyr,code-partition指向slot1_partition,并启用了mbox(邮箱)、sema42(信号量,domain-id = <4>)作为核间通信基础; - 对应地,CPU0 侧(mcx_n9xx_evk_mcxn947_cpu0.dtsi)将
sema42配置为domain-id = <1>,形成双核间的互斥域。
可用 Target 与主从核关系
默认配置文件 mcx_n9xx_evk_mcxn947_cpu0_defconfig 只使能第一个核心。需要注意:
- CPU0 是唯一可以独立运行的 target;
- CPU1 无法脱离 CPU0 自行工作,必须先由 CPU0 将其使能。
要使能 CPU1,需要创建 System Build 应用工程,并通过配置项CONFIG_SECOND_CORE_MCUX使能第二个核心。仓库中已提供若干启用双核的参考示例:
ipc-static-vringsopenampmboxmbox_data
连接与 I/O
MCX-N947 SoC 共含 6 个 GPIO 控制器,并带有可用于配置引脚功能的 pinmux 寄存器。文档给出了板级默认的 UART 引脚分配(也是串口控制台与双核串口的基础):
| Name | Function | Usage |
|---|---|---|
| P0_PIO1_8 | UART | UART RX cpu0 |
| P1_PIO1_9 | UART | UART TX cpu0 |
| P4_PIO4_3 | UART | UART RX cpu1 |
| P4_PIO4_2 | UART | UART TX cpu1 |
系统时钟
MCX-N947 SoC 配置使用PLL0 运行于 150 MHz作为系统时钟源,与 Cortex-M33 双核的主频一致。
串口控制台
MCX-N9XX-EVK 的 SoC 提供 10 路 FLEXCOMM 接口用于串行通信,其中Flexcomm 4 被配置为控制台 UART。将 USB 线从 PC 连接到板卡J5接口,即可使用 minicom、putty 等任意串口终端,参数设置如下:
- 波特率:115200
- 数据位:8
- 校验:无(None)
- 停止位:1
即标准的115200 8N1串口配置。
以太网使用
若要使用以太网接口运行网络相关示例,需要将跳线JP13调整到2-3引脚位置。
编程与调试
构建与烧录应用的方式与其他 Zephyr 板卡一致(可参考 Zephyr 文档中的“构建应用”与“运行应用”章节)。
配置调试探针
该板卡默认使用板载MCU-Link CMSIS-DAP 调试探针进行烧录与调试。
使用 LinkServer(默认 Runner)
LinkServer 是本板卡的默认 runner,支持出厂默认的 MCU-Link 固件。如果默认板载调试电路固件被更改过,才需要按照 MCU-Link CMSIS-DAP 板载调试探针的说明重新刷写默认固件。进入ISP mode的方法是短接跳线 JP24。
从 board.cmake 可以看到 LinkServer runner 的默认参数:设备为MCXN947:MCX-N9XX-EVK,CPU0 场景使用--core=cm33_core0,双核(CONFIG_SECOND_CORE_MCUX)场景使用--core=all,并为老版本 LinkServer 补充了安全区域(Secure Region)与片上外设区域的地址映射 override。
使用 J-Link
有两种方式:
- 更新板载调试电路固件:按照 MCU-Link J-Link 板载调试探针的说明,将板载调试电路刷写为 Segger J-Link 固件。刷写固件前同样需要短接跳线 JP24 进入
ISP mode。 - 外接 J-Link 探针:将外部调试探针连接到板卡的20 针 SWD 连接器(J11),同时短接跳线 JP6。
两种方式下,均使用-r jlink选项让 west 使用 jlink runner 进行烧录:
west flash -r jlinkboard.cmake 中对应配置的 J-Link 设备号为MCXN947_M33_0(CPU0)与MCXN947_M33_1(CPU1),并附加了--reset-after-load参数。
烧录示例(hello_world)
以hello_world应用为例:
west build -b mcx_n9xx_evk/mcxn947/cpu0 samples/hello_world west flash打开串口终端,按下板卡上的RESET 按钮复位,终端中应看到:
*** Booting Zephyr OS build vX.X.X *** Hello World! mcx_n9xx_evk/mcxn947/cpu0调试示例(hello_world)
west build -b mcx_n9xx_evk/mcxn947/cpu0 samples/hello_world west debug打开串口终端,在调试器中单步执行应用,终端中同样应看到上面的 Hello World 输出。
双核镜像的调试
对于双核构建,应先将从核(secondary core)置于一个循环中,然后再附加调试器。可参考 NXP 应用笔记 AN13264 第 4.2.3 节(该笔记面向 RT1170,但类似技巧同样适用于本板卡)。
构建双核镜像
双核示例统一使用mcx_n9xx_evk/mcxn947/cpu0target 运行:
- 为
mcx_n9xx_evk/mcxn947/cpu1构建的镜像,会在选择CONFIG_SECOND_CORE_MCUX后,从 Flash 加载并在第二颗核心上执行。
双核(System Build)构建的完整示例可参考ipc-static-vrings。这里以mbox_data应用为例:
west build -b mcx_n9xx_evk/mcxn947/cpu0 zephyr/samples/drivers/mbox_data --sysbuild west flash注意使用了--sysbuild参数,由 Sysbuild 同时编排 CPU0 与 CPU1 两个镜像的构建与打包。
QSPI 板型:从外部 Flash 启动并执行(XIP)
MCX-N9XX-EVK 板卡包含一颗外部 QSPI Flash。MCXN947 可以通过 FlexSPI 接口直接从此 Flash 启动并执行代码(XIP,Execute in Place)。QSPI 板型(variant)使能了从 QSPI 构建和执行应用的方案,相关 Flash 配置源码位于 xip/mcxn_flexspi_nor_config.c 与 xip/mcxn_flexspi_nor_config.h。
为外部 QSPI 编程 ROM Bootloader
默认情况下,MCXN947 的 ROM 启动程序从内部 Flash 启动。若要让 MCU 从 FlexSPI 接口的外部存储器启动,需要先按以下步骤将板卡配置为从 QSPI 启动:
配置 ROM Bootloader 需要编程Protected Flash Region(PFR)。PFR 的编程使用 NXP 的 ROM Bootloader 工具完成(如
blhost,配合bootfromflexspi.bin/bootfromflash.bin二进制文件)。以下步骤通过 UART 串口与 ROM Bootloader 通信,使用 USB 也是另一种可选方式。
- 断开 UART 串口上的任何终端程序——后续步骤要占用该串口。
- 将 micro USB 线连接到主机与板卡左上角的J5接口。该操作同时完成三件事:为板卡供电、连接调试探针、连接
blhost命令所需的 UART 串口。 - 使 MCU 进入 ISP 模式:按住板卡右下角的 ISP 按钮 SW3,然后按下再松开左下角的 Reset 按钮 SW1,此时 MCU 已进入 ISP 模式,再松开 ISP 按钮。
- 运行
blhost命令:
Ubuntu(假设 MCU 串口为/dev/ttyACM0):
blhost -t 2000 -p /dev/ttyACM0,115200 -j -- write-memory 0x01004000 bootfromflexspi.binWindows(将COMxx替换为实际的 COM 端口号):
blhost -t 2000 -p COMxx -j -- write-memory 0x01004000 bootfromflexspi.bin编程成功时的输出类似:
$ blhost -t 2000 -p /dev/ttyACM0,115200 -j -- write-memory 0x01004000 bootfromflexspi.bin { "command": "write-memory", "response": [ 256 ], "status": { "description": "0 (0x0) Success.", "value": 0 } }- 用SW1复位板卡退出 ISP 模式。至此,MCU 已准备好从 QSPI 启动。
如需恢复从内部 Flash 启动,重复以上步骤编程 PFR,并改烧写bootfromflash.bin文件即可。
使用 QSPI 板型构建、烧录与调试
PFR 配置为从 QSPI 启动后,即可按 Zephyr 常规流程,配合QSPI 板型进行构建、烧录与调试。QSPI 板型的 board target 为mcx_n9xx_evk/mcxn947/cpu0/qspi(注意路径中的双斜杠是板型层级分隔)。
hello_world示例:
west build -b mcx_n9xx_evk/mcxn947/cpu0/qspi zephyr/samples/hello_world west flashQSPI 分区布局(源码依据)
在 mcx_n9xx_evk_mcxn947_cpu0_qspi.dts 中,QSPI 板型删除了内部 Flash 的默认分区(boot_partition、slot0_partition、slot1_partition、storage_partition),并将zephyr,flash与zephyr,flash-controller分别指向外部 QSPI Flash(w25q64jwtbjq,8 MB)与其控制器。新分区如下:
| 分区 | 偏移地址 | 大小 | 用途 |
|---|---|---|---|
| boot_partition | 0x00000000 | 80 KB | MCUboot(label: "mcuboot") |
| slot0_partition | 0x00014000 | 3 MB | 应用镜像槽 0(image-0) |
| slot1_partition | 0x00314000 | 3 MB | 应用镜像槽 1(image-1) |
| storage_partition | 0x00614000 | 1968 KB | 数据存储(storage) |
与 MCUboot 配合使用
MCUboot 同样可以与 QSPI 板型配合使用。默认情况下,MCUboot Bootloader 被放置在 QSPI Flash 的boot-partition中,应用镜像紧随其后。启动链路为:ROM Bootloader 先启动并加载 QSPI 中的 MCUboot,再由 MCUboot 加载应用。
使用 Sysbuild 构建并烧录blinky示例(同时使能 MCUboot):
west build -b mcx_n9xx_evk/mcxn947/cpu0/qspi zephyr/samples/basic/blinky --sysbuild -DSB_CONFIG_BOOTLOADER_MCUBOOT=y west flash打开串口终端,用SW1复位板卡,控制台将打印:
*** Booting MCUboot vX.Y.Z *** *** Using Zephyr OS build vX.Y.Z *** I: Starting bootloader I: Image index: 0, Swap type: none I: Bootloader chainload address offset: 0x14000 I: Image version: v0.0.0 I: Jumping to the first image slot *** Booting Zephyr OS build vX.Y.Z *** LED state: OFF LED state: ON其中Bootloader chainload address offset: 0x14000与 QSPI 分区表中 slot0 的偏移地址0x00014000完全对应,直观印证了分区表与启动流程的一致性。
疑难排查
- 调试探针识别异常、SystemView 相关问题时,可参考 Zephyr 文档中 Segger ECC/SystemView 的通用排查章节;
- 更多板卡层面的通用问题(文档修订、技术支持、故障排查建议),可查看 Zephyr 文档中的板卡通用结尾章节(board-footer)。
相关文件索引
为便于继续深入阅读源码,以下是与本文内容直接相关的仓库文件:
- 板级文档:boards/nxp/mcx_nx4x_evk/doc/mcx_n9xx_evk.rst
- CPU0 默认配置:mcx_n9xx_evk_mcxn947_cpu0_defconfig
- CPU0 设备树:mcx_n9xx_evk_mcxn947_cpu0.dts、mcx_n9xx_evk_mcxn947_cpu0.dtsi
- CPU1 设备树与配置:mcx_n9xx_evk_mcxn947_cpu1.dts、mcx_n9xx_evk_mcxn947_cpu1_defconfig
- QSPI 板型:mcx_n9xx_evk_mcxn947_cpu0_qspi.dts、mcx_n9xx_evk_mcxn947_cpu0_qspi_defconfig、xip/mcxn_flexspi_nor_config.c
- 板级公共设备树:mcx_n9xx_evk.dtsi、mcx_nx4x_evk.dtsi、mcx_n9xx_evk-pinctrl.dtsi
- 调试 Runner 配置(LinkServer / J-Link / pyOCD):board.cmake
- 板卡元数据:board.yml
- 示例应用:
samples/hello_world、samples/drivers/mbox_data、samples/basic/blinky,以及ipc-static-vrings、openamp、mbox等双核参考示例
需要注意的是,本文中涉及的所有板卡引脚、跳线(JP13、JP24、JP6、J11、J5)、按键(SW1、SW3)与 PFR 编程流程,均以 MCX-N9XX-EVK 板卡实物的用户手册与原理图为准;blhost工具与bootfromflexspi.bin/bootfromflash.bin二进制文件来自 NXP MCUXpresso SDK 的hello_world_qspi_xip示例,使用前请确认版本匹配。
- 操作系统
- 嵌入式
- RTOS
- 物联网
【免费下载链接】zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
相关推荐
Zephyr 下 NXP FRDM-MCXN947 开发板实战指南:双核架构、QSPI 启动与调试
Zephyr 下 NXP FRDM MCXN947 开发板实战指南:双核架构、QSPI 启动与调试 FRDM MCXN947 是 NXP 推出的基于 MCX N
操作系统嵌入式RTOS物联网Zephyr 在 NXP i.MX95 EVK 上的多核启动与调试实战指南
Zephyr 在 NXP i.MX95 EVK 上的多核启动与调试实战指南 本文以 boards/nxp/imx95_evk/doc/index.rst htt
操作系统嵌入式RTOS物联网Zephyr 在 NXP i.MX8M Plus EVK 上的多核移植实战:A53 与 M7 双核启动、烧录与调试指南
Zephyr 在 NXP i.MX8M Plus EVK 上的多核移植实战:A53 与 M7 双核启动、烧录与调试指南 导读 本文以 Zephyr 官方仓库中
操作系统嵌入式RTOS物联网
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考