Zephyr 在 NXP S32Z2 上的移植指南:X-S32Z27X-DC (DC2) 板级支持详解
2026/9/20 15:23:12 网站建设 项目流程

Zephyr 在 NXP S32Z2 上的移植指南:X-S32Z27X-DC (DC2) 板级支持详解

【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr

导读

本文以 Zephyr RTOS 仓库中boards/nxp/s32z2xxdc2板级定义文档为核心,系统讲解如何面向 NXP X-S32Z27X-DC(DC2)评估板开发与调试 Zephyr 应用。你将掌握该板基于双 RTU(Real-Time Unit,实时单元)× 4 核 Cortex-R52 的硬件资源布局、GPIO pad 到端口/引脚的映射关系、SRAM 启动与双调试器(NXP S32 Debug Probe 与 Lauterbach TRACE32)的完整使用流程,以及 lock-step 与 split-lock 两种核心配置模式下的构建与调试方法。

板级概览:一个 SoC,两个 Zephyr 板目标

X-S32Z27X-DC(简称 DC2)基于 NXP S32Z2 实时处理器(Real-Time Processor)。该 SoC 包含两个 RTU,每个 RTU 由四个 ARM Cortex-R52 核心组成,并支持灵活的 split/lock(分离/锁步)配置。由于 Zephyr 当前移植只支持单核运行,仓库为每个 SoC/RTU 组合提供独立的板目标:

  • s32z2xxdc2/s32z270/rtu0:面向 S32Z270/RTU0;
  • s32z2xxdc2/s32z270/rtu1:面向 S32Z270/RTU1。

板目标的名称与 SoC 的对应关系定义在 Kconfig.s32z2xxdc2 中:BOARD_S32Z2XXDC2会根据所选 RTU 目标select SOC_S32Z270_RTU0SOC_S32Z270_RTU1,并固定器件型号SOC_PART_NUMBER_P32Z270ADCK0MJFT。两个板目标的设备树入口分别为 s32z2xxdc2_s32z270_rtu0.dts 与 s32z2xxdc2_s32z270_rtu1.dts,二者共用同一份 SoC 级 dtsi s32z2xxdc2_s32z270.dtsi,仅在内核选择、CAN 总线别名等细节上有所差异。

此外,board.yml 声明了该板的 PCB 修订版本支持:默认修订为 B,同时提供 D 修订。这意味着同一块板卡的不同 PCB 版本需要选用带修订后缀的板目标(见后文"调试"一节)。

硬件资源与连接

支持的硬件特性

根据 s32z2xxdc2_s32z270_rtu0.yaml,该板在 Zephyr 中支持的外设包括:uartgpiowatchdog、以太网netif:ethcanspicounteradci2cdmapwmsentpsi5crypto,片上 SRAM 为 1024 KB。

Pad 到端口/引脚的映射表

S32Z2 的 SoC pad 为了与 GPIO 驱动及本移植所用的 HAL 驱动保持一致,被分组为端口(port)与引脚(pin)。在配置 GPIO 或为设备驱动配置 pinmux 时,必须依据下表进行 pad 与 port/pin 的换算:

Pads端口/引脚
PAD_000 - PAD_015PA0 - PA15
PAD_016 - PAD_030PB0 - PB14
PAD_031PC15
PAD_032 - PAD_047PD0 - PD15
PAD_048 - PAD_063PE0 - PE15
PAD_064 - PAD_079PF0 - PF15
PAD_080 - PAD_091PG0 - PG11
PAD_092 - PAD_095PH12 - PH15
PAD_096 - PAD_111PI0 - PI15
PAD_112 - PAD_127PJ0 - PJ15
PAD_128 - PAD_143PK0 - PK15
PAD_144 - PAD_145PL0 - PL1
PAD_146 - PAD_159PM2 - PM15
PAD_160 - PAD_169PN0 - PN9
PAD_170 - PAD_173PO10 - PO13

需要注意,映射并非连续覆盖所有 port/pin(例如 PC0–PC14、PH0–PH11 等不存在对应 pad),因此在使用 GPIO 或配置 pinmux 时务必以 pad 编号为准反查端口。板级 pinmux 的默认配置见 s32z2xxdc2_s32z270_pinctrl.dtsi,其中定义了emdio_defaulteth0_defaultcanxl0_defaultcanxl1_defaultflexcan0_defaultflexcan1_defaultqspi0_default等状态节点。

用户 LED 与按键

该板不包含用户 LED 或按键。因此blinkybutton这类依赖板载 LED/按键的示例无法直接运行,需要按照示例说明中的步骤自行扩展 GPIO 支持后才能在此板上使用。

系统时钟

Cortex-R52 核心被配置为以 1 GHz 运行。在板级 defconfig s32z2xxdc2_s32z270_rtu0_defconfig 中可看到配套配置:CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000(系统 tick 1 kHz)、CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=8000000(硬件时钟周期频率 8 MHz,对应片上定时器/时钟源),并启用了CONFIG_XIP(从 SRAM 原地执行)、CONFIG_ARM_MPUCONFIG_SERIALCONFIG_CONSOLE

串口(Serial Port)

SoC 提供 12 个 LINFlexD 实例,可工作于 UART 模式。默认情况下,控制台(console)输出通过 USB micro-B 连接器J119访问。连接后使用任意终端程序监听即可,例如使用跨平台的 pySerial miniterm:

python -m serial.tools.miniterm <port> 115200

<port>替换为开发板对应的串口设备,例如 Linux 下通常是/dev/ttyUSB0,波特率为 115200。

看门狗(Watchdog)

该板的看门狗驱动(SWT,别名watchdog0)目前仅支持定时器到期时触发中断。由于 Zephyr 当前是从 SRAM 运行的,系统复位(reset)并不受支持——即看门狗超时后无法通过复位 SoC 来恢复系统,只能借助中断处理程序进行软件层面的兜底处理。SWT 节点在 s32z2xxdc2_s32z270.dtsi 中被使能(status = "okay")。

以太网(Ethernet)

NETC 驱动支持管理物理站接口PSI0(Physical Station Interface)以及单个虚拟 SI(VSI),其余 VSI 应分配给系统中的其他核心使用。从设备树可见,RTU0 目标使用enetc_psi0,并通过mru0的 mailbox(rx-channels = <1>)接收以太网报文;RTU1 目标则使用mru4。板级 dtsi 中为 PSI0 配置了固定 MAC 地址00 00 00 01 02 00、300 MHz 时钟、MDIO 总线上的 PHY(ethernet-phy@7)以及对应的 pinctrl。关于以太网控制器的完整配置方法,请参考示例nxp_s32_netc(位于 samples/boards/nxp/s32/netc/README.rst)。

CAN 总线

CANEXCEL

CANEXCEL 支持 CAN Classic(CAN 2.0)与 CAN FD 两种模式,但不支持远程传输请求(RTR)。RTU0 目标的zephyr,canbus默认指向canxl0(见 s32z2xxdc2_s32z270_rtu0.dts)。

需要特别注意的是:该板目前并未为 CANEXCEL 端口安装 CAN 收发器。要实现外部通信,需要自行加装与 CAN 2.0 和 CAN FD 协议引脚兼容的 CAN 收发器。

FlexCAN

FlexCAN 同样支持 CAN Classic(CAN 2.0)与 CAN FD 两种模式。RTU1 目标的zephyr,canbus默认指向flexcan0。板级 dtsi 中canxl0canxl1flexcan0flexcan1均配置了默认 pinctrl,其中 FlexCAN 控制器默认使能。

ADC

ADC 由 ADC SAR(逐次逼近型)控制器提供,共2 个实例,每个实例为12 位分辨率。ADC 通道分为两组:精度组(precision)与内部/标准组(internal/standard)。板级 dtsi 中为sar_adc0sar_adc1统一配置了参考电压vref-mv = <1800>(1.8 V)。

注意:同一个实例的所有通道在同一时刻只能在 1 个组的通道上运行。这意味着不能同时采样同一实例中分别属于两个不同组的通道,设计采样任务时需将通道按组分开调度。

EDMA

EDMA 模块包含四个 EDMA3 实例:实例 0 具有32 通道,实例 1、4、5 各具有16 通道。这些通道可用于内存到内存、外设到内存等 DMA 搬运,支撑串口、SPI、以太网等高速外设的数据流处理。

外部 Flash

板载S26HS512T 512M-bit(64 MB)HyperFlash存储器连接到 QSPI 控制器 A1 端口,本板配置将其选为默认 flash 控制器zephyr,flash-controller = &s26hs512t)。设备树 s32z2xxdc2_s32z270.dtsi 中完整描述了该 HyperFlash 的时序与电气参数:

  • 兼容nxp,s32-qspi-hyperflashsize = <DT_SIZE_M(512)>
  • jedec-idwrite-block-size = <2>read-latency-cycles = <16>
  • max-program-buffer-size = <256>vcc-mv = <1800>drive-strength-ohm = <27>
  • QSPI 控制器配置为 DDR 数据率、word-addressable地址模式,并开启 DLL(AUTO UPDATE 模式、外部 DQS 作为接收时钟源)以及 4 个 AHB 主设备缓冲(各 256 字节);
  • 内部还定义了storage_partitionpartition@0,大小 0x10000)用于存储用途。

需要说明的是:虽然板上存在 HyperFlash,但当前 Zephyr 应用仍只能加载到内部 SRAM执行(见下文"编程与调试"),flash 控制器更多用于后续存储扩展与固件部署规划。

CRYPTO(HSE 硬件安全引擎)

硬件安全引擎(HSE)支持哈希与对称加密运算,具备 ECB、CBC、CTR 模式,使用基于 RAM 的密钥目录(key catalog),支持128 位或 256 位密钥长度

使用前有一个重要前提:驱动假定 HSE 固件已经被安装并配置完毕(例如密钥目录已格式化、所使用的 MU 实例已激活等)。HSE 固件的安装与配置阶段在《HSE Firmware User Manual》中有文档说明,需联系 NXP 销售人员或分销商获取该文档。

编程与调试(Programming and Debugging)

s32z2xxdc2系列板目标的构建方式与 Zephyr 标准流程一致。目前该板仅支持将 Zephyr 应用二进制加载到核心内部 SRAM 中执行(不支持从外部 flash 启动)。

板级支持两种 West runner:

  • NXP S32 Debug Probe(默认);
  • Lauterbach TRACE32

在使用前请先按所选调试工具的安装说明完成环境准备。runner 的具体参数在 board.cmake 中定义,它会把elfFilertu=${CONFIG_NXP_S32_RTU_INDEX}lockstep以及默认--core-name(如R52_<rtu>_0_LS)等参数自动传递给启动脚本。

硬件连接与串口设置

  1. 将外部调试探针连接到板上的 JTAG 连接器J134,再通过 USB 或以太网(视探针支持而定)连接到主机;
  2. 将板上的 USB/UART 端口J119连接到主机,运行终端程序监听串口输出,例如:
python -m serial.tools.miniterm /dev/ttyUSB0 115200

构建并调试 hello_world

面向s32z2xxdc2/s32z270/rtu0构建并启动调试会话:

west build -b s32z2xxdc2/s32z270/rtu0 samples/hello_world west debug

如果你使用的是较新的 PCB 修订版本(默认修订为 B),则需要使用带修订后缀的板目标。例如修订 D:

west build -b s32z2xxdc2@D/s32z270/rtu0 samples/hello_world west debug

注意:s32z2xxdc2_s32z270_rtu0_D.overlays32z2xxdc2_s32z270_rtu0_B.overlay分别对应两种修订,后者定义了修订差异。

调试会话开始后即可设置断点,并输入c继续运行进入程序。此时终端应输出:

Hello World! s32z2xxdc2

使用 Lauterbach TRACE32 调试

如果使用 Lauterbach TRACE32 软件,则运行:

west debug -r trace32

该命令会调用 support/startup.cmm 启动脚本。从脚本源码可以看到它执行的关键步骤:复位并初始化 JTAG(40 MHz 时钟、DualPort 使能)、将 RTU 子系统从复位中释放(MC_ME 相关寄存器操作)、初始化 RTU SRAM、根据lockstep参数写 CFG_CORE 的 SPLT_LCK 位、将 ELF 加载到 EAXI(SRAM)地址空间,并把 PC 设置为__start

烧录(Flashing)

如果只想把应用下载到板载 SRAM 并直接运行,可使用flash命令。flash命令目前仅由 Lauterbach TRACE32 runner 支持

west build -b s32z2xxdc2/s32z270/rtu0 samples/hello_world west flash -r trace32

说明:Lauterbach 启动脚本在执行flashdebug时所做的事情相同(初始化 SoC、把应用加载到 SRAM),区别在于flash会隐藏 TRACE32 界面、直接运行应用并退出。

如果想用 NXP S32 Debug Probe runner 模拟类似行为,可以运行带 GDB 批处理模式的debug命令:

west debug --tool-opt='--batch'

RTU 与核心配置(Lock-step / Split-lock)

本 Zephyr 移植只能运行单核,且只能运行在任意一个 Cortex-R52 核心上,支持 lock-step(锁步)或 split-lock(分离锁步)两种模式。默认情况下,Zephyr 运行在所选择 RTU 的第一个核心(core 0),并采用lock-step 模式——这也是芯片的复位默认配置。在 lock-step 模式下,Core0/Core2 与 Core1/Core3 分别组成冗余锁步对。

  • 若要以split-lock 模式构建,需要在应用 Kconfig 中禁用CONFIG_DCLS
  • 板级配置会依据构建配置自动设置 runner 参数(见 board.cmake:启用CONFIG_DCLS时向 trace32 传入lockstep=yes、向 nxp_s32dbg 传入--core-name R52_<rtu>_0_LS;禁用时分别传入lockstep=noR52_<rtu>_0)。

如需调试非默认核心,使用--core-name参数:

  • lockstep 配置下:
west debug --core-name='R52_<rtu_id>_<core_id>_LS'
  • split-lock 配置下:
west debug --core-name='R52_<rtu_id>_<core_id>'

其中:

  • <rtu_id>:从零开始的 RTU 索引(0 或 1);
  • <core_id>:相对于所在 RTU 的核心索引(0、1、2 或 3)。

例如,以 split-lock 配置构建并运行于 RTU0 的第二个核心(core 1):

west build -b s32z2xxdc2/s32z270/rtu0 samples/hello_world -DCONFIG_DCLS=n west debug --core-name='R52_0_1'

如果使用 Lauterbach TRACE32,所有 runner 参数必须从命令行显式覆盖:

west debug -r trace32 --startup-args elfFile=<elf_path> rtu=<rtu_id> core=<core_id> lockstep=<yes/no>

其中<elf_path>为输出目录下 Zephyr 应用 ELF 的路径。在 startup.cmm 中可以看到这些参数的默认值与取值范围:rtu有效值为 0/1(默认 0),core有效值为 0–3(默认 0),lockstep默认yes;同时脚本会根据 RTU 选择不同的启动地址与 CFG_CORE 配置地址(RTU0:0x79900000/0x76120000;RTU1:0x7D900000/0x76920000),并校验 ELF 路径与参数合法性。

小结

X-S32Z27X-DC(DC2)是 Zephyr 在 S32Z2 安全实时处理器上的重要参考平台:双 RTU × 4 核 Cortex-R52 的架构、1 GHz 主频、12 路 LINFlexD UART、CANEXCEL/FlexCAN、双 SAR ADC、四实例 EDMA、HyperFlash 以及 HSE 安全引擎,覆盖了实时控制、车载通信与功能安全场景的核心外设。开发时请牢记三个关键点:当前仅支持 SRAM 运行与单核调试、RTU0/RTU1 需选用独立板目标、lock-step 与 split-lock 通过CONFIG_DCLS切换并配合--core-name选择目标核心。相关的设备树、pinctrl、defconfig 与调试脚本均可在boards/nxp/s32z2xxdc2目录下继续深入研究。

【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询