- 操作系统
- 嵌入式
- RTOS
- 物联网
【免费下载链接】zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
MCX-N5XX-EVK 是 Zephyr 官方支持的 NXP 评估板,它与广为人知的 MCX-N9XX-EVK 板卡高度同源,核心差异仅在于搭载了 MCXN547 而非 MCXN947 芯片。本文以 mcx_n5xx_evk 板卡文档 为骨架,完整继承其指向的 mcx_n9xx_evk 操作指南,并结合板卡目录下的源码与配置逐项印证,帮助你掌握这块板卡的硬件特性、双核(CPU0/CPU1)启动机制、LinkServer/J-Link 调试探针配置、串口控制台设置以及从外部 FlexSPI/QSPI 闪存执行代码(XIP)的完整流程。
MCX-N5XX-EVK 是什么:与 MCX-N9XX-EVK 的同源关系
按照官方板卡文档的定位,MCX-N5XX-EVK 与 MCX-N9XX-EVK 非常相似(very similar),绝大多数使用、构建、烧录与调试流程完全一致,读者可以复用 MCX-N9XX-EVK 的操作说明;两者唯一的本质区别在于:
- MCX-N5XX-EVK 搭载的是MCXN547(双核 Arm Cortex-M33);
- MCX-N9XX-EVK 搭载的是MCXN947。
这一关系在板卡源码中得到直接印证。board.yml 中同时注册了两个板卡目标,均归属 NXP 厂商,但 SoC 不同:mcx_n9xx_evk对应mcxn947(并额外提供qspi变体),而mcx_n5xx_evk对应mcxn547(当前未声明 qspi 变体,这一点在本文后半部分有进一步说明)。
同时,Kconfig.mcx_n5xx_evk 显示,选择该板卡会根据具体目标自动选择SOC_MCXN547_CPU0或SOC_MCXN547_CPU1,并固定SOC_PART_NUMBER_MCXN547VDF;而两块板卡共享同一套公共 Kconfig(见 Kconfig.defconfig,例如默认使能ETH_DRIVER,启用 SD 协议栈时将主栈加大到 1536 字节),印证了"同源、仅 SoC 型号不同"的结论。
硬件特性
由于两块板卡几乎相同,MCX-N9XX-EVK 文档中列出的硬件特性可作为 MCX-N5XX-EVK 的参考(具体芯片规格请以 NXP 官方 MCXN547 数据手册为准):
- 双核 Arm Cortex-M33 微控制器,主频 150 MHz;
- 2 MB 双 bank 片上 Flash;
- 512 KB RAM;
- 通过 FlexSPI 外接 Quad SPI Flash;
- USB 高速(Host/Device,片上 HS PHY)与 USB 全速(Host/Device,片上 FS PHY);
- 10 路 LP Flexcomm,每路均可配置为 SPI、I2C、UART;
- FlexCAN(含 FD)、I3C、SAI 音频接口;
- 1 路带 QoS 的 Ethernet;
- 板载 MCU-Link 调试器(CMSIS-DAP),支持功耗测量;
- Arduino 兼容排针、FlexIO/LCD 排针、mikroBUS 与 M.2 接口。
针对 MCX-N5XX-EVK,板卡目标的 YAML 描述给出了可确认的资源量:mcx_n5xx_evk_mcxn547_cpu0.yaml 声明 CPU0 目标拥有320 KB RAM、2048 KB Flash,并支持tsi(触摸传感);mcx_n5xx_evk_mcxn547_cpu1.yaml 声明 CPU1 目标拥有64 KB RAM、200 KB Flash,支持dma、gpio、crc。
板卡目标(Targets)与双核启动机制
MCX-N5XX-EVK 在 Zephyr 中提供两个目标:
| 目标标识符 | 说明 | RAM | Flash | 可独立运行 |
|---|---|---|---|---|
mcx_n5xx_evk/mcxn547/cpu0 | 主核 | 320 KB | 2048 KB | 是 |
mcx_n5xx_evk/mcxn547/cpu1 | 从核 | 64 KB | 200 KB | 否,需 CPU0 引导 |
默认配置只启用第一个核。CPU0 是唯一可以独立(standalone)运行的 target;CPU1 无法脱离 CPU0 单独工作,必须由 CPU0 先将其使能。
以 MCX-N9XX-EVK 为例的默认配置文件 mcx_n9xx_evk_mcxn947_cpu0_defconfig 就只使能了第一核;与之对应的 mcx_n5xx_evk_mcxn547_cpu0_defconfig 也遵循同样的思路——仅开启串口控制台(CONFIG_CONSOLE=y、CONFIG_UART_CONSOLE=y、CONFIG_SERIAL=y、CONFIG_UART_INTERRUPT_DRIVEN=y)、GPIO,并额外启用了 ARM MPU(CONFIG_ARM_MPU=y)、硬件栈保护(CONFIG_HW_STACK_PROTECTION=y)以及 TrustZone-M(CONFIG_TRUSTED_EXECUTION_SECURE=y),可见 CPU0 承担了安全世界与系统初始化的职责。
启用 CPU1 的方法:创建一个 System Build(sysbuild)应用工程,并通过CONFIG_SECOND_CORE_MCUX配置启用第二核。Zephyr 中已内置若干开箱即用的双核示例可供参考:
ipc-static-vringsopenampmboxmbox_data
其中mbox/mbox_data示例的运行机制在公共设备树 mcx_nx4x_evk_cpu0.dtsi 中也有迹可循:该文件将mbox控制器置为okay,并把zephyr,code-cpu1-partition指向slot1_partition,为第二核镜像预留了代码分区。
双核启动地址与内存布局
文档给出的双核 Flash 分区布局如下(源自 MCX-N9XX-EVK 文档;两块板卡同源,可作为参考,确切数值请以板卡实际分区为准):
| Core | Boot Address | 说明 |
|---|---|---|
| CPU0 | 0x10000000(1856 KB) | 主核代码分区 |
| CPU1 | 0x101d0000(192 KB) | 从核代码分区 |
| Memory | Address(Size) | 说明 |
|---|---|---|
| srama | 0x20000000(320 KB) | CPU0 RAM |
| sramg | 0x20050000(64 KB) | CPU1 RAM |
| sramh | 0x20060000(32 KB) | 共享内存 |
这些数值与源码一致:公共设备树 mcx_nx4x_evk_cpu0.dtsi 中sram0定义为0x20000000、大小 320 KB,与 CPU0 目标 YAML 中ram: 320对应;CPU1 的 64 KB 与 mcx_n5xx_evk_mcxn547_cpu1.yaml 中ram: 64对应。文档还特别提示,默认将 SRAM0–5 全部分配给 CPU0,应用层可以通过应用专属设备树重新划分 SRAM0–7,例如把 SRAM0–6 分配给 CPU0(sram0的DT_SIZE_K相应调整为 384)而仅留 SRAM7 给 CPU1,此时需要同步修改 CPU1 的 SRAM 设置。
引脚连接与串口控制台
MCXN547 与 MCXN947 一样拥有 6 个 GPIO 控制器,以及可用于配置引脚功能的 pinmux 寄存器。文档给出的 UART 引脚分配如下:
| 引脚名 | 功能 | 用途 |
|---|---|---|
| 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) |
系统时钟
MCXN947 配置为以PLL0 输出 150 MHz作为系统时钟源;MCX-N5XX-EVK 由于 SoC 同属 MCX N 系列(N54x/N94x 同源),默认时钟配置方式一致。
串口与 Flexcomm
MCX-N9XX-EVK 的 SoC 提供 10 路 FLEXCOMM 串行接口,其中Flexcomm 4 被配置为控制台 UART。这一配置在 MCX-N5XX-EVK 的公共设备树中同样生效:mcx_nx4x_evk_cpu0.dtsi 的chosen节点将zephyr,console、zephyr,shell-uart、zephyr,uart-mcumgr均指向flexcomm4_lpuart4,并在下方将flexcomm4与flexcomm4_lpuart4置为okay。此外该chosen节点还指定了zephyr,sram、zephyr,flash、zephyr,flash-controller(指向fmu)、zephyr,code-partition(slot0_partition)、zephyr,canbus(flexcan0)、zephyr,system-timer-companion(lptmr0)、zephyr,edac(erm0)与zephyr,crc。
Ethernet
若要使用 Ethernet 网口运行网络示例,需将跳线JP13 拨到 2–3 脚。公共设备树中enet、enet_mdio、phy均默认为启用状态,且板级 Kconfig 默认打开ETH_DRIVER。
编程与调试(Programming and Debugging)
MCX-N5XX-EVK 的构建、烧录与调试遵循 Zephyr 标准的应用构建与运行流程,无需特殊处理。
配置调试探针
烧录与调试都需要调试探针。这块板卡默认配置使用板载 MCU-Link(CMSIS-DAP)调试探针。
使用 LinkServer(默认 runner)
LinkServer 是这块板卡的默认 runner,直接支持出厂默认的 MCU-Link 固件。若板载调试电路固件被改动过,需要按 MCU-Link CMSIS-DAP 板载调试探针的说明重新烧写默认固件——此时需将跳线JP24 短接,使板卡进入ISP 模式后再编程固件。
board.cmake 中为 MCX-N5XX-EVK 配置了 LinkServer 的设备参数(--device=MCXN547:MCX-N5XX-EVK,CPU1 时追加--core=cm33_core1),并针对 Linkserver 旧版本缺失 MCXN 安全内存区域的问题,通过--override补充了 0x30000000、0x30060000、0x50000000 等 RAM/外设区域的定义。
使用 J-Link
有两种方式:
- 更新板载调试电路固件:按 MCU-Link J-Link 板载调试探针的说明,将板载调试电路刷写为 Segger J-Link 固件;刷写前需短接跳线JP24进入 ISP 模式。
- 外接 J-Link 探针:将外部 J-Link 探针连接到板卡20 针 SWD 连接器(J11),同时短接跳线 JP6。
两种方式下,使用west时都需通过-r jlink指定 jlink runner:
west flash -r jlink对应地,board.cmake 也为 jlink runner 配置了设备名MCXN547_M33_0(CPU0)或MCXN547_M33_1(CPU1),并带--reset-after-load参数。
配置控制台
用 USB 线连接 PC 与板卡J5接口,然后使用任意串口终端(minicom、putty 等)连接,参数如下:
- 波特率:115200
- 数据位:8
- 校验:无(None)
- 停止位:1
烧录示例(hello_world)
以hello_world示例演示标准烧录流程(以 MCX-N9XX-EVK 目标为例,N5XX-EVK 将 board 换成mcx_n5xx_evk/mcxn547/cpu0即可):
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(对应地,使用mcx_n5xx_evk/mcxn547/cpu0目标构建时,输出中的板卡标识将显示为对应目标名。)
构建双核镜像
双核示例以mcx_n9xx_evk/mcxn947/cpu0为目标运行。为cpu1构建的镜像会被放入 Flash,并在选中CONFIG_SECOND_CORE_MCUX时由第二核从 Flash 加载执行。
以mbox_data示例演示双核构建(使用 System Build):
west build -b mcx_n9xx_evk/mcxn947/cpu0 zephyr/samples/drivers/mbox_data --sysbuild west flash更完整的双核构建示例可参考ipc-static-vrings示例。
调试示例(hello_world)
west build -b mcx_n9xx_evk/mcxn947/cpu0 samples/hello_world west debug打开串口终端,在调试器中单步执行,终端中应看到:
*** Booting Zephyr OS build vX.X.X *** Hello World! mcx_n9xx_evk/mcxn947/cpu0双核镜像的调试技巧
对于双核构建,应先让从核进入一个循环(loop),然后才能附加调试器。具体手法可参考 NXP 应用笔记 AN13264 第 4.2.3 节——该笔记以 RT1170 为例,但同样的技巧也适用于本板卡。
使用 QSPI 变体从外部闪存启动(XIP)
MCX-N9XX-EVK 板卡带有外部 QSPI Flash,MCXN947 可以通过 FlexSPI 接口直接从此 Flash 启动并 XIP 执行代码。需要注意:从 board.yml 看,qspi变体目前仅针对mcx_n9xx_evk(mcxn947)声明,mcx_n5xx_evk(mcxn547)的 YAML 中暂未列出该变体。因此本节内容以 MCX-N9XX-EVK 为准,N5XX-EVK 用户可作为同源参考。
为外部 QSPI 编程 ROM 引导加载程序
默认情况下,MCXN947 的 ROM 引导加载程序从内部 Flash 启动。要让 MCU 改为从 FlexSPI 接口的外部存储启动,需要先按以下步骤对板卡进行编程:
- 断开任何占用 UART 串口的终端——下面的步骤需要用到该串口;
- 用 micro USB 线将主机与板卡左上角的 J5相连。这一步同时为板卡供电、连接调试探针,并接通
blhost命令所需的 UART 串口; - 使 MCU 进入 ISP 模式:按住板卡右下角的ISP 按钮 SW3,再按一下左下角的Reset 按钮 SW1后松开,MCU 即进入 ISP 模式,此时松开 ISP 按钮;
- 运行
blhost命令(该命令通过 UART 串口与 ROM 引导加载程序通信;USB 是另一种可选途径)。
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 启动。
说明:以上流程的本质是通过 NXP ROM 引导加载程序工具编程Protected Flash Region(PFR)。
bootfromflexspi.bin与更详细的说明可从 NXP MCUXpresso SDK 的hello_world_qspi_xip示例配套资料中获得(详见 NXP 提供的 "Running code from external memory with MCX N94x" 技术说明)。
若需要恢复到从内部 Flash 启动,重复上述步骤编程 PFR,并将bootfromflexspi.bin替换为bootfromflash.bin即可。
使用 QSPI 变体构建、烧录与调试
PFR 编程为从 QSPI 启动后,即可按 Zephyr 常规流程配合 QSPI 板卡变体进行构建、烧录与调试。hello_world示例:
west build -b mcx_n9xx_evk//cpu0/qspi zephyr/samples/hello_world west flashMCUboot 也可以配合 QSPI 变体使用:默认将 MCUboot 引导程序放在 QSPI Flash 的boot-partition中,与应用程序镜像一起;ROM 引导加载程序先启动并加载 QSPI 中的 MCUboot,再由 MCUboot 加载应用。使用 Sysbuild 构建并烧录blinky示例:
west build -b mcx_n9xx_evk//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: ONShields 支持
板卡支持通过 Zephyr shields 扩展功能。当前文档确认在该板卡上测试过的 shield:
lcd_par_s035:支持 Display 接口。该 shield 使用MIPI_DBI接口,连接到片上FlexIO外设(公共设备树 mcx_nx4x_evk_cpu0.dtsi 中flexio0为启用状态,与之对应)。
进一步探索仓库
如果希望深入理解这块板卡在 Zephyr 中的完整实现,可以继续阅读以下仓库文件:
- 板卡设备树与引脚复用:mcx_n5xx_evk.dtsi(使能
micfil麦克风接口与otpc)、mcx_n5xx_evk-pinctrl.dtsi、mcx_nx4x_evk.dtsi、mcx_nx4x_evk_cpu0.dtsi; - 板卡初始化代码与 XIP 配置:board.c、xip/mcxn_flexspi_nor_config.c;
- 板卡 Kconfig 与默认配置:Kconfig.mcx_n5xx_evk、mcx_n5xx_evk_mcxn547_cpu0_defconfig、mcx_n5xx_evk_mcxn547_cpu1_defconfig;
- 烧录/调试 runner 参数:board.cmake。
常见问题排查
- 串口无输出:确认 USB 线连接的是 J5 接口,终端参数为 115200-8-N-1,并在打开终端后按 RESET 复位。
- J-Link 烧录失败:确认跳线设置正确——使用外部探针需短接 JP6 并连接 J11;使用板载电路刷 J-Link 固件需先通过 JP24 进入 ISP 模式。
- LinkServer 无法识别设备:检查板载 MCU-Link 固件是否为出厂默认(CMSIS-DAP),必要时按 ISP 模式重新烧写。
- QSPI 变体无法启动:确认已先完成 PFR 编程(blhost 写
bootfromflexspi.bin)并复位退出 ISP 模式;恢复内部 Flash 启动则写回bootfromflash.bin。 - 双核应用从核不运行:确认构建时启用了
CONFIG_SECOND_CORE_MCUX并使用 System Build,且烧录的是 CPU0 目标。
说明:板卡文档的排错章节还引用了 Zephyr 文档仓库公共的 Segger SystemView 使用说明与板卡文档公共页脚(见 boards/nxp/mcx_nx4x_evk/doc/mcx_n9xx_evk.rst 末尾的 include 指令),如需使用 Segger SystemView 进行可视化跟踪分析,可查阅对应公共文档章节。
- 操作系统
- 嵌入式
- RTOS
- 物联网
【免费下载链接】zephyr
Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
相关推荐
Zephyr 在 NXP MCX-N9XX-EVK 开发板上的完整实战指南:双核 MCXN947、QSPI XIP 启动与调试
Zephyr 在 NXP MCX N9XX EVK 开发板上的完整实战指南:双核 MCXN947、QSPI XIP 启动与调试 导读 本文以 Zephyr 仓库
操作系统嵌入式RTOS物联网Zephyr 在 NXP i.MX8M Plus EVK 上的多核移植实战:A53 与 M7 双核启动、烧录与调试指南
Zephyr 在 NXP i.MX8M Plus EVK 上的多核移植实战:A53 与 M7 双核启动、烧录与调试指南 导读 本文以 Zephyr 官方仓库中
操作系统嵌入式RTOS物联网Zephyr 下 NXP FRDM-MCXN947 开发板实战指南:双核架构、QSPI 启动与调试
Zephyr 下 NXP FRDM MCXN947 开发板实战指南:双核架构、QSPI 启动与调试 FRDM MCXN947 是 NXP 推出的基于 MCX N
操作系统嵌入式RTOS物联网
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考