Zephyr 板卡移植指南:NXP MIMXRT1020-EVK(i.MX RT1020,500 MHz Cortex-M7)开发板支持与烧录调试全解析
【免费下载链接】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 仓库中的 NXP MIMXRT1020-EVK 板卡文档为核心,系统讲解该板卡的硬件资源、外部存储配置、引脚连接、系统时钟与串口规划,以及从调试探针配置、串口控制台建立到应用烧录与调试的完整实战流程。读完本文,你将能够基于 Zephyr 构建环境为 mimxrt1020_evk 目标板编译并烧录应用,并借助源码级证据理解板级设备树与启动配置的底层原理。
板卡概述:面向低成本封装的 i.MX RT1020 跨界处理器
MIMXRT1020-EVK 是 NXP 官方评估板,板载 i.MX RT1020 跨界处理器(crossover processor)。该芯片在低成本 LQFP 封装中提供了高性能特性集,进一步简化了客户的板级设计与布线。其核心为 Arm Cortex-M7,主频高达 500 MHz(相关说明见 板卡文档)。
在 Zephyr 中,该板卡的标识符为mimxrt1020_evk,对应器件为 MIMXRT1021DAG5A,设备树 compatible 为nxp,mimxrt1021(见 mimxrt1020_evk.dts)。板卡元数据声明其 RAM 为 32 MB(外部 SDRAM)、Flash 为 8 MB(外部 QSPI),架构为 arm(见 mimxrt1020_evk.yaml)。
硬件资源一览
根据 板卡文档,MIMXRT1020-EVK 的硬件构成如下:
- 主控:MIMXRT1021DAG5A MCU
- 内存
- 256 Mbit SDRAM
- 64 Mbit QSPI Flash
- TF 卡座(SD 卡)
- 连接性
- 10/100 Mbit/s 以太网 PHY
- Micro USB Host 与 OTG 连接器
- CAN 收发器
- Arduino 接口
- 音频
- 音频编解码器(Audio Codec)
- 4 极音频耳机插孔
- 麦克风
- 外接扬声器连接
- 电源:5 V DC 插孔
- 调试
- JTAG 20 针连接器
- 带 DAPLink 固件的 OpenSDA
其中 Arduino 接口在设备树中以arduino-header-r3节点完整映射(见 mimxrt1020_evk.dts),覆盖 A0~A5 与 D0~D15 共 22 个引脚,因此板卡 yaml 中声明了arduino_gpio与arduino_serial能力,可直接配合 Arduino R3 扩展板使用。
外部存储器:SEMC 与 FLEXSPI 的双通道启动配置
该平台配备两块外部存储器,分别由 SEMC(外部存储器控制器)与 FLEXSPI(灵活串行外设接口)驱动,两者都在启动阶段通过数据块完成初始化:
| 器件 | 控制器 | 状态 |
|---|---|---|
| MT48LC16M16A2P(SDRAM) | SEMC | 通过设备配置数据块(Device Configuration Data)使能,在启动时完成 SEMC 初始化 |
| IS25LP064A(QSPI Flash) | FLEXSPI | 通过 Flash 配置块使能,在启动时完成 FLEXSPI 初始化 |
在设备树中,SDRAM 被建模为memory@80000000,大小为 32 MB(DT_SIZE_M(32)),注释标明实际芯片为 ISSI IS42S16160J-6TLI(见 mimxrt1020_evk.dts);FLEXSPI 节点下挂载is25lp064闪存,工作频率最高 104 MHz,擦除块大小为 4 KB(见 mimxrt1020_evk.dts)。
启动阶段的初始化由 Kconfig 控制:Kconfig.defconfig 在板级默认开启DEVICE_CONFIGURATION_DATA(对应 dcd/dcd.c 的 SDRAM 设备配置数据块)与NXP_IMX_EXTERNAL_SDRAM;当启用CONFIG_BOOT_FLEXSPI_NOR时,CMakeLists.txt 会编入 xip/evkmimxrt1020_flexspi_nor_config.c 作为 Flash 配置块。该 CMake 逻辑还会给出两条重要告警:
- 若未包含 DCD 却将 RAM 地址设为
0x80000000(SDRAM),系统可能无法启动; - 若更换了板上的 SDRAM 或 Flash 芯片,必须相应修改 DCD 与 Flash 配置块(可参考 NXP 应用笔记 AN12238)。
Flash 分区规划:8 MB 的 IS25LP064A 在设备树中被划分为 mcuboot(128 KB)、image-0(3 MB)、image-1(3 MB)与 storage(2 MB 减 128 KB)四个分区,其中zephyr,code-partition指向 slot0(见 mimxrt1020_evk.dts),这为 MCUboot 双镜像升级预留了标准布局。
支持的板级特性
根据 mimxrt1020_evk.yaml,该板在 Zephyr 中支持:ADC、arduino_gpio、arduino_serial、counter、dma、flash、gpio、i2c、netif:eth、ptp_clock、sdhc、spi、usb_device、rtc。这些能力与设备树中的使能节点一一对应,例如:
- 以太网:
enet、enet_mac、enet_mdio均使能,PHY 为 Microchip KSZ8081,采用 RMII 接口,并启用随机 MAC 地址(见 mimxrt1020_evk.dts),且Kconfig.defconfig默认开启ETH_DRIVER; - SPI:
lpspi1使能并复用 eDMA 通道 0/1 作为 RX/TX(见 mimxrt1020_evk.dts); - SD 卡:
usdhc1使能,挂载zephyr,sdmmc-disk磁盘节点,盘名 "SD",支持 CD 与电源控制引脚(见 mimxrt1020_evk.dts); - USB 设备:
usb1使能并命名为zephyr_udc0; - ADC:
adc1使能,输入为 ADC1 通道 10、11。
板级默认 defconfig(见 mimxrt1020_evk_defconfig)开启CONFIG_CONSOLE、CONFIG_UART_CONSOLE、CONFIG_SERIAL、CONFIG_GPIO,并启用CONFIG_ARM_MPU与CONFIG_HW_STACK_PROTECTION提供内存保护与硬件栈保护。
提示:对于尚未支持的特性,可参考同系列的 mimxrt1064_evk 板卡文档。作为 NXP i.MX RT10xx 家族中的超集板卡,NXP 优先为其提供 Zephyr Full Platform Support,其上已支持的特性通常也可复用到本板。
引脚连接与 I/O 规划
MIMXRT1020 SoC 拥有五组 pinmux/GPIO 控制器。板卡文档给出了完整的连接分配表:
| 名称 | 功能 | 用途 |
|---|---|---|
| GPIO_AD_B0_05 | GPIO | LED |
| GPIO_AD_B0_06 | LPUART1_TX | UART 控制台 |
| GPIO_AD_B0_07 | LPUART1_RX | UART 控制台 |
| GPIO_AD_B1_08 | LPUART2_TX | UART BT HCI |
| GPIO_AD_B1_09 | LPUART2_RX | UART BT HCI |
| GPIO_AD_B1_14 | LPI2C1_SCL | I2C |
| GPIO_AD_B1_15 | LPI2C1_SDA | I2C |
| GPIO_SD_B1_02 | LPI2C4_SCL | I2C |
| GPIO_SD_B1_03 | LPI2C4_SDA | I2C |
| WAKEUP | GPIO | SW0 |
| GPIO_AD_B0_04 | ENET_RST | 以太网 |
| GPIO_AD_B0_08 | ENET_REF_CLK | 以太网 |
| GPIO_AD_B0_09 | ENET_RX_DATA01 | 以太网 |
| GPIO_AD_B0_10 | ENET_RX_DATA00 / LPSPI1_SCK | 以太网 / SPI |
| GPIO_AD_B0_11 | ENET_RX_EN / LPSPI1_PCS0 | 以太网 / SPI |
| GPIO_AD_B0_12 | ENET_RX_ER / LPSPI1_SDO | 以太网 / SPI |
| GPIO_AD_B0_13 | ENET_TX_EN / LPSPI1_SDI | 以太网 / SPI |
| GPIO_AD_B0_14 | ENET_TX_DATA00 | 以太网 |
| GPIO_AD_B0_15 | ENET_TX_DATA01 | 以太网 |
| GPIO_AD_B1_06 | ENET_INT | 以太网 |
| GPIO_EMC_41 | ENET_MDC | 以太网 |
| GPIO_EMC_40 | ENET_MDIO | 以太网 |
| GPIO_AD_B1_07 | USDHC1_VSELECT | SD 卡 |
| GPIO_SD_B0_02 | USDHC1_CMD | SD 卡 |
| GPIO_SD_B0_03 | USDHC1_CLK | SD 卡 |
| GPIO_SD_B0_04 | USDHC1_DATA0 | SD 卡 |
| GPIO_SD_B0_05 | USDHC1_DATA1 | SD 卡 |
| GPIO_SD_B0_00 | USDHC1_DATA2 | SD 卡 |
| GPIO_SD_B0_01 | USDHC1_DATA3 | SD 卡 |
| GPIO_SD_B0_06 | USDHC1_CD_B | SD 卡 |
| GPIO_AD_B1_10 | ADC | ADC1 通道 10 |
| GPIO_AD_B1_11 | ADC | ADC1 通道 11 |
这些分配在 mimxrt1020_evk-pinctrl.dtsi 中有完整的引脚复用定义。有几个值得注意的引脚复用冲突:
- LED 与以太网复位冲突:
GPIO_AD_B0_04同时用于 ENET_RST 与用户 LED 相关复用,注释明确标注 "USER_LED conflicts with ENET_RST"(见 pinctrl 文件 L23); - 以太网与 LPSPI1 冲突:
GPIO_AD_B0_10 ~ B0_13四个引脚在 ENET 与 LPSPI1 之间复用(pinctrl 文件 L125 标注 "conflicts with enet pinmux"),因此以太网与 SPI 不能同时使用,板卡 yaml 虽同时声明了spi与netif:eth,但实际工程中需按需取舍; - LPUART2 与用户 LED 冲突:pinctrl 文件 L166、L177 均标注 "conflicts with user led"。
此外,USDHC1 针对不同工作频率提供了四套引脚配置(default / slow / med / fast,对应 50 MHz 以下、100 MHz 以下与 100 MHz 以上场景),并在设备树中通过pinctrl-names引用(见 mimxrt1020_evk.dts 与 mimxrt1020_evk-pinctrl.dtsi)。
用户 LED 与按键在设备树中分别建模为gpio-leds(GPIO1_IO05,低电平点亮,标签 "User LD1")与gpio-keys(GPIO5_IO00,上拉、低电平有效,标签 "User SW4",见 mimxrt1020_evk.dts),并作为led0与sw0别名暴露给应用。
系统时钟:SysTick 主时钟与低功耗 GPT 时钟
MIMXRT1020 SoC 默认使用 SysTick 作为系统时钟源,运行在 500 MHz。
当使能电源管理(power management)时,板上的 32 KHz 低频振荡器会被用作 GPT 定时器的时钟源来产生系统时钟。这种方案允许进入更低的功耗状态,但代价是时钟分辨率降低。设备树与 CMake 双重印证了这一机制:
- 设备树中
gpt_hw_timer与systick均使能,注释说明 "GPT 与 SysTick 均使能;若开启电源管理,将改用 GPT 定时器以允许门控内核时钟"(见 mimxrt1020_evk.dts); - CMakeLists.txt 在检测到
CONFIG_MCUX_GPT_TIMER时发出告警,提示 GPT 硬件定时器会启用低功耗模式,但以降低硬件定时器分辨率为代价。
串口规划:控制台与蓝牙 HCI 分离
MIMXRT1020 SoC 共有八个 UART。板级规划如下:
- LPUART1:配置为控制台(console);
- LPUART2:配置为蓝牙主机控制接口(BT HCI);
- 其余 UART 未使用。
在设备树中,lpuart1使能且current-speed = <115200>,同时提供 "default" 与 "sleep" 两套 pinctrl(睡眠态下 RX 引脚切换为 GPIO 并上拉)(见 mimxrt1020_evk.dts);zephyr,console、zephyr,shell-uart、zephyr,uart-mcumgr均指向lpuart1(见 mimxrt1020_evk.dts)。lpuart2作为 Arduino 串口(arduino_serial)暴露,同样配置了 default/sleep 两套 pinctrl。
编程与调试:三种调试主机工具
MIMXRT1020-EVK 支持 3 种调试主机工具,可按需安装并依照下述探针配置章节完成板级设置:
- LinkServer(默认,NXP 官方支持)
- J-Link(NXP 官方支持)
- pyOCD(NXP 不提供支持)
三种 runner 的板级参数定义在 board.cmake:
board_runner_args(pyocd "--target=mimxrt1020") board_runner_args(jlink "--device=MIMXRT1021xxx5A") board_runner_args(linkserver "--device=MIMXRT1021xxxxx:EVK-MIMXRT1020") include(${ZEPHYR_BASE}/boards/common/linkserver.board.cmake) include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake)板卡自身搭载 LPC-Link2 调试探针,默认固件为 CMSIS-DAP(DAPLink)。主机工具与探针的配合方式(细节见 rt1xxx-lpclink2-debug.rst.inc):
- pyOCD / LinkServer:按 CMSIS-DAP 流程将板上调试固件重刷为 CMSIS-DAP 固件,并确保 SWD 隔离跳线已装;
- J-Link:两种方案任选其一——要么将板上调试电路刷为 Segger J-Link 固件(注意 J-Link 固件不会通过调试 USB 为板卡供电,需改由其他电源供电),要么移除 SWD 隔离跳线,将外部 J-Link 探针接到 JTAG/SWD 排针上。
配置调试探针:跳线与接口位置
针对 RT1020 板卡,调试相关的关键跳线与接口如下:
- J47 / J48:SWD 隔离跳线;
- J42:DFU 模式跳线;
- J16:20 针 JTAG/SWD 排针。
配置串口控制台:OpenSDA 转 USB 串口
无论选择哪种调试探针,串口控制台都统一通过 OpenSDA 单片机作为 USB 转串口适配器使用。操作步骤如下:
- 确认跳线J25 与 J26 已插上(on)(出厂默认即插上),以将 UART 信号连接到 OpenSDA 单片机;
- 用 USB 线将 PC 连接到J23接口;
- 使用任意串口终端(minicom、putty 等)连接,参数如下:
- 波特率(Speed):115200
- 数据位(Data):8 bits
- 校验(Parity):None
- 停止位(Stop bits):1
烧录应用:以 hello_world 为例
以 samples/hello_world 示例为例,使用west构建并烧录到 mimxrt1020_evk:
west build -b mimxrt1020_evk samples/hello_world west flash打开串口终端,按下板上的SW5复位按键,即可在终端看到如下输出:
***** Booting Zephyr OS v1.14.0-rc1 ***** Hello World! mimxrt1020_evk调试应用:连接调试器逐步执行
仍以 hello_world 为例,使用west启动调试会话:
west build -b mimxrt1020_evk samples/hello_world west debug打开串口终端,在调试器中单步执行应用,终端中同样应出现:
***** Booting Zephyr OS v1.14.0-rc1 ***** Hello World! mimxrt1020_evk总结
MIMXRT1020-EVK 在 Zephyr 中是一个功能完备的 Cortex-M7 板卡目标:8 MB QSPI Flash 经 FLEXSPI 启动、32 MB SDRAM 经 SEMC 启动,提供以太网、SD 卡、USB 设备、ADC、I2C、SPI(DMA)与 Arduino 接口等丰富外设。开发时需要注意以太网与 LPSPI1、LPUART2 与用户 LED 之间的引脚复用冲突,并根据所选调试主机工具(LinkServer / J-Link / pyOCD)正确配置 LPC-Link2 探针固件与 SWD 隔离跳线。串口控制台统一走 OpenSDA(J23,115200 8N1),烧录与调试分别使用west flash与west debug,配合复位按键 SW5 即可快速完成应用验证。
【免费下载链接】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),仅供参考