
Zephyr 中 ElemRV Flask-N 开发板支持详解开源 RISC-V MCU 的时钟、UART、GPIO 与设备树剖析【免费下载链接】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 仓库中 ElemRV Flask-N 板级文档 为核心结合 板级设备树、SoC 设备树 及板级元数据系统讲解这块基于 SpinalHDL 设计的开源 RISC-V 微控制器在 Zephyr 中的支持现状、硬件资源布局与外设配置方式帮助读者掌握在 elemrv_flask_n 板上构建、配置 UART 与 GPIO 应用的完整方法。1. 板卡概览一块全开源的 RISC-V MCUElemRV-N 是一款端到端开源的 RISC-V 微控制器使用 SpinalHDL 硬件描述语言设计。其 0.2 版本已成功流片采用 IHP 的 Open PDK——一种 130nm 开放半导体工艺项目由 FMD-QNC 提供支持。官方项目代码托管于 ElemRV 开源仓库aesc-silicon/elemrv。在 Zephyr 中该板卡的板级标识符为elemrv_flask_n完整名称为 “ElemRV Flask-N (ElemRV-N)”厂商目录为aesc架构为 RISC-V。板级元数据文件 给出了关键参数identifier: elemrv_flask_n name: ElemRV Flask-N (ElemRV-N) type: mcu arch: riscv toolchain: - cross-compile - zephyr ram: 32 flash: 32 vendor: aesc supported: - gpio - uart从该元数据可以确认几个关键事实架构riscv使用交叉编译工具链zephyr或cross-compile资源32 KB RAM、32 KB Flash当前支持的外设GPIO 与 UART 两项这与板级文档中“Supported Features”一节所列能力一致。board.yml 进一步声明该板对应的 SoC 为elemrv_nSoC 清单 中则按系列组织nitrogen系列下包含elemrv_nhydrogen系列下包含elemrv_h对应同目录的姊妹板 elemrv_flask_h。Kconfig.elemrv_flask_n 中BOARD_ELEMRV_FLASK_N选项选择SOC_ELEMRV_N而 soc/aesc 的 Kconfig.soc 将SOC_ELEMRV_N归入SOC_SERIES_NITROGEN系列SOC默认值为elemrv_n。注意文档明确指出当前受支持的硅片版本为ElemRV-N 0.2后续涉及版本相关的讨论均应以此为前提。2. 系统时钟20 MHz 的设定位置RISC-V 核心的系统时钟被设定为20 MHz这一数值通过设备树cpu0节点的clock-frequency属性指定。在 elemrv_flask_n.dts 中可以直接看到这一配置cpu0 { clock-frequency DT_FREQ_M(20); };同样的 20 MHz 时钟值也作用于 UART 节点见下文两者共用同一时钟基准。修改系统时钟时只需调整该属性即可被 Zephyr 的时钟体系感知。3. CPUVexRiscv 五流水级 RISC-V 内核ElemRV-N 集成了一个VexRiscvRISC-V 内核采用 5 级流水结构并支持以下 ISA 扩展M整数乘除扩展C压缩指令扩展此外还包含以下通用Z扩展Zicntr—— 基础计数器与定时器扩展Zicsr—— 控制状态寄存器CSR操作扩展Zifencei—— 取指屏障扩展。该 CPU 的完整 ISA 字符串为RV32IMC_Zicntr_Zicsr_Zifencei这一字符串是 32 位 RV32 基线 M C 的组合配合三个 Z 扩展满足 RISC-V 软件生态对 CSR 访问、指令同步与计时的基本要求。4. 中断控制器与机器定时器HLICHart 级中断控制器每个 CPU 核心都配备一个 Hart-Level Interrupt Controller通过控制状态寄存器CSR进行配置。这是 RISC-V 中断架构中负责核心本地中断机器定时器、软件中断、外部中断入口的一级结构。Machine TimerRISC-V 规范的机器定时器默认使能。Zephyr 的时基系统依赖mtimer提供的周期中断因此这一“默认使能”的特性保证了内核定时器机制开箱即用。###PLIC 设备节点从 SoC 设备树 elemrv-n.dtsi 可以看到外设中断挂接在 PLIC 上GPIOIRQ 号 1与 UARTIRQ 号 5均以interrupt-parent plic指向该控制器。板级设备树中进一步指定了 PLIC 的中断设备数量plic { riscv,ndev 7; };5. UART 串口115200 波特率与引脚复用UART通用异步收发器是用于数据收发与调试输出的可配置串行外设。默认配置下uart0工作在115200 波特率可通过 ElemRV 的设备树调整。5.1 板级设备树中的 UART 配置elemrv_flask_n.dts 中 UART 相关配置完整如下chosen { zephyr,console uart0; zephyr,shell-uart uart0; ... }; uart0 { clock-frequency DT_FREQ_M(20); current-speed 115200; pinctrl-0 uart0_tx_default uart0_rx_default uart0_cts_default uart0_rts_default; pinctrl-names default; status okay; };各字段含义zephyr,console/zephyr,shell-uart将 Zephyr 控制台与 shell 均绑定到uart0clock-frequency DT_FREQ_M(20)波特率分频所依据的时钟与系统时钟同为 20 MHzcurrent-speed 115200默认波特率pinctrl-0引用 4 个引脚复用组分别配置 TX、RX、CTS、RTS 四线信号。5.2 SoC 层 UART 节点与引脚复用SoC 侧 elemrv-n.dtsi 定义了uart0节点uart0: uart0f0006000 { compatible aesc,uart; reg 0xf0006000 0x1000; interrupt-parent plic; interrupts 5 1; status disabled; };即 UART 寄存器基址为0xf0006000寄存器区域大小 0x1000中断号 5。SoC 层默认status disabled由板级设备树置为okay使能——这是 Zephyr 常见的“SoC 定义节点、板卡使能节点”分层模式。引脚复用定义在 elemrv_flask_n-pinctrl.dtsi 中UART 四个信号分别复用到物理引脚 14~17 的MUX0功能pinctrl { /* UART0 */ uart0_tx_default: uart0_tx_default { pinmux 14 AESC_PINMUX_MUX0; }; uart0_rx_default: uart0_rx_default { pinmux 15 AESC_PINMUX_MUX0; }; uart0_cts_default: uart0_cts_default { pinmux 16 AESC_PINMUX_MUX0; }; uart0_rts_default: uart0_rts_default { pinmux 17 AESC_PINMUX_MUX0; }; };如需更换串口引脚或波特率修改板级设备树或其 overlay中的current-speed与pinctrl引用即可无需改动驱动。5.3 用 hello_world 验证 UART板级文档推荐构建并运行 hello_world 示例来评估 UART 接口。对应的构建命令为west build -b elemrv_flask_n samples/hello_world构建完成后通过串口按 115200 波特率连接uart0即可看到 “Hello World! elemrv_flask_n” 输出Zephyr 会在启动时打印板级标识符。6. GPIO12 个引脚的通用输入输出GPIO 接口提供三态引脚每个引脚可配置为输入或输出并可控制数据流向。该 GPIO 控制器共12 个独立引脚。6.1 SoC 层 GPIO 节点elemrv-n.dtsi 中的定义gpio0: gpiof0000000 { compatible aesc,gpio; reg 0xf0000000 0x1000; interrupt-parent plic; interrupts 1 1; gpio-controller; #gpio-cells 2; ngpios 12; status disabled; };要点寄存器基址0xf000000012 个引脚ngpios支持中断PLIC 中断号 1。板级设备树中通过status okay使能并绑定引脚复用gpio0 { status okay; pinctrl-0 gpio0_pin0_default; pinctrl-names default; };对应的复用组将gpio0的 pin0 映射到物理引脚 0 的 MUX0 功能。板上 LEDled0即接于gpio0的第 0 脚leds: leds { compatible gpio-leds; led0: led0 { gpios gpio0 0 GPIO_ACTIVE_HIGH; label LED_0; }; };6.2 用 Blinky 探索 GPIOBlinky 示例是探索 GPIO 控制外部 LED 的最简路径对应构建命令west build -b elemrv_flask_n samples/basic/blinky7. 板级硬件资源地图从设备树看内存布局板级设备树的soc节点完整给出了板子的存储布局这部分信息对链接脚本适配与内存规划非常有用soc { ocram: memory80000000 { device_type memory; compatible mmio-sram; reg 0x80000000 DT_SIZE_K(1); }; hyperbus: memory90000000 { device_type memory; compatible mmio-sram; reg 0x90000000 DT_SIZE_K(32); }; flash: flasha0010000 { compatible soc-nv-flash; reg 0xa0010000 DT_SIZE_K(32); }; };节点基址大小用途ocram0x800000001 KB片上 RAMhyperbus0x9000000032 KB主 SRAMzephyr,sram指向此节点flash0xa001000032 KB片上 NOR Flashzephyr,flash指向此节点chosen节点中的zephyr,sram hyperbus与zephyr,flash flash明确了 Zephyr 运行时以 32 KB Hyperbus 作为主 RAM、以 32 KB soc-nv-flash 作为存储介质这与元数据中ram: 32/flash: 32的声明相互印证。外设寄存器区域则集中在0xf000_0000起GPIO0xf0000000、UART0xf0006000、PinCtrl0xf0010000。8. 默认 Kconfig 与板级支持文件elemrv_flask_n_defconfig 提供了该板的默认配置内容精简而聚焦# Serial Driver CONFIG_SERIALy # Enable Console CONFIG_CONSOLEy CONFIG_UART_CONSOLEy # GPIO Driver CONFIG_GPIOy可以看到默认配置仅打开串口含 UART 控制台与 GPIO 两类驱动与元数据supported列表严格对应。完整的板级支持文件清单如下供深入阅读源码时按图索骥文件作用elemrv_flask_n.dts板级设备树存储布局、LED、时钟、UART/GPIO 使能elemrv_flask_n-pinctrl.dtsi引脚复用GPIO pin0 与 UART TX/RX/CTS/RTSelemrv_flask_n.yaml板卡元数据架构、工具链、资源、支持列表elemrv_flask_n_defconfig默认 Kconfig 配置board.yml板卡与 SoCelemrv_n的关联声明Kconfig.elemrv_flask_n板级 Kconfig 选项选择 SOC_ELEMRV_Ndts/riscv/aesc/elemrv-n.dtsiSoC 层设备节点gpio0/uart0/pinctrl并包含 nitrogen.dtsisoc/aesc/soc.ymlSoC 系列划分nitrogen→elemrv_nhydrogen→elemrv_h9. 小结与实践要点在 Zephyr 中使用该板时统一以elemrv_flask_n作为-b参数例如west build -b elemrv_flask_n samples/hello_world与west build -b elemrv_flask_n samples/basic/blinky系统时钟与 UART 时钟均为 20 MHz由设备树clock-frequency属性驱动CPU ISA 为RV32IMC_Zicntr_Zicsr_Zifencei当前受支持的外设为 GPIO12 引脚与 UART115200 默认波特率四线信号复用至物理引脚 14~17受支持的硅片版本为 ElemRV-N 0.2内存布局为 1 KB OCM 32 KB Hyperbus SRAM 32 KB NOR Flash调整应用内存需求时应以 Hyperbus 的 32 KB 上限为准所有外设均遵循“SoC 设备树定义、板级设备树使能”的分层模式扩展引脚或波特率只需修改板级.dts或添加 overlay无需触碰 SoC 定义。【免费下载链接】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),仅供参考