
Zephyr 上的 NEORV32 开源 RISC-V SoC板卡目标、外设使能与 JTAG/UART 烧录实战指南【免费下载链接】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 仓库中 NEORV32 板卡支持展开讲解如何在 Zephyr 中为开源 RISC-V 处理器系统 NEORV32当前支持版本 v1.11.6构建、烧录与调试应用从板卡目标minimalboot/up5kdemo的选择、系统时钟与 ISA 扩展的配置到 IMEM/DMEM、UART、GPIO、PWM、TRNG、GPTMR 等外设的 Devicetree 使能方法再到基于 OpenOCD 的 JTAG 烧录、UART 上传与持久化到 FPGA bitstream 的完整流程。读完本文你将能够基于 NEORV32 板卡在真实 FPGA 上跑通 hello_world 并掌握自定义 NEORV32 实现的适配思路。NEORV32 与 Zephyr开源 RISC-V SoC 的落地NEORV32 是一个开源的、兼容 RISC-V 的处理器系统processor system既可作为大型 SoC 设计中的即插即用辅助处理器也可作为独立的可定制微控制器。它随附完整的 RTL 源码、硬件模板与软件工具链。在 Zephyr 中NEORV32 作为独立板卡被支持相关文件集中在 boards/others/neorv32/ 目录下其 SoC 层位于 soc/neorv32/。在动手之前建议先阅读 NEORV32 项目官方提供的 Datasheet 与 User Guide从 NEORV32 官方仓库与文档站点获取本文聚焦于 Zephyr 侧的板卡支持与使用。支持的板卡目标Zephyr 目前为 NEORV32 提供两个板卡目标均与 NEORV32 RTL 随附的处理器模板一一对应板卡目标对应 NEORV32 模板neorv32/neorv32/minimalbootMinimalBoot 模板neorv32/neorv32/up5kdemoUP5KDemo 模板两个目标在 board.yml 中注册为同一块板卡vendor 为others下的两个 SoC 变体。板卡名称采用neorv32/neorv32/variant三段式格式其中第二段为 SoC 名。若直接使用neorv32/neorv32而不带变体构建系统会报错并提示必须指定变体——这一检查逻辑位于 board.cmake。这两个板卡目标本质上是 NEORV32 官方模板在 Zephyr 侧的出厂配置。如果你的 NEORV32 实现与模板不同裁剪或扩展了外设不必修改仓库内的板卡文件Zephyr 支持通过板卡扩展board extension或Devicetree overlay在树外out-of-tree定制这正是后续各外设默认禁用、按需使能设计的意义所在。从板卡 Devicetree 看懂外设地址布局NEORV32 SoC 的所有外设节点集中定义在 dts/riscv/neorv32.dtsi 中作为simple-bus下的内存映射外设。以下是关键的地址分配与节点标签外设节点标签基地址默认状态内部指令存储器IMEMimem0x00000000disabled内部数据存储器DMEMdmem0x80000000disabled引导 ROMBootROMbootrom0xffe00000disabledPWM 控制器pwm0xfff00000disabled通用定时器GPTMRgptmr0xfff10000disabledCLINT含 MTIMERclint0xfff40000disabled机器定时器MTIMERmtimer0xfff4bff8disabled串口 UART0 / UART1uart0/uart10xfff50000/0xfff60000disabled真随机数发生器TRNGtrng0xfffa0000disabledGPIO 端口gpio0xfffc0000disabled系统信息SYSINFOsysinfo0xfffe0000okayCPU 节点cpu0的 compatible 为neorv32,cpu, riscv其内部中断控制器intccompatible 为riscv,cpu-intc下还定义了一个 FIRQ 中断映射firq将 NEORV32 的 16 个快速中断请求映射到 RISC-V 机器模式中断向量 16~31。各外设的中断号如 UART0 的 RX/TX 分别为 2/3、GPTMR 为 12、GPIO 为 8也都在该 dtsi 中声明。两个板卡目标的核心差异体现在各自的板级 DTS 中neorv32_neorv32_minimalboot.dtsCPU 启用的 ISA 扩展为i, zicsr, zifenceiGPIO 数量ngpios 4对应 MinimalBoot 模板的资源规模neorv32_neorv32_up5kdemo.dtsCPU 额外启用m乘法/除法扩展ngpios 32对应 UP5KDemo 模板。两者都通过chosen节点将zephyr,flash指向 IMEM、zephyr,sram指向 DMEM、zephyr,console等指向 UART0并在板级把bootrom、imem、dmem、clint、mtimer、uart0、gpio、pwm全部置为okay。板级 DTS 还定义了 4 个 GPIO LEDled0~led3、4 个按键btn0~btn3事件码为INPUT_KEY_0~INPUT_KEY_3以及 3 路 PWM LED并建立了led0、sw0等标准别名便于应用通过DT_ALIAS()直接使用。系统时钟从 SYSINFO 运行时读取还是编译期固定NEORV32 板卡的默认配置是在运行时从 SYSINFO 模块读取系统时钟频率。这一行为由 SoC 层的 Kconfig 选项控制SOC_NEORV32_READ_FREQUENCY_AT_RUNTIME默认开启见 soc/neorv32/Kconfig开启时SoC 会在启动早期钩子中从 SYSINFO 寄存器读取时钟频率。实现位于 soc/neorv32/soc.c通过sys_read32(base NEORV32_SYSINFO_CLK)读取频率并写入z_clock_hw_cycles_per_sec。NEORV32_SYSINFO_CLK偏移量定义在 soc/neorv32/soc.h。运行时读取的优点是与具体 FPGA 时钟频率解耦、移植性强缺点是带来少量启动开销。如果时钟频率在构建时已知可以通过设置cpu0节点的clock-frequency属性来覆盖cpu0 { clock-frequency 50000000; /* 50 MHz */ };当cpu0存在clock-frequency属性时SOC_NEORV32_READ_FREQUENCY_AT_RUNTIME会自动失效该选项的depends on !$(dt_node_has_prop,/cpus/cpu0,clock-frequency)且 Kconfig.defconfig 会将SYS_CLOCK_HW_CYCLES_PER_SEC直接取为 Devicetree 中的clock-frequency值从而完全省去运行时开销。此外SoC 层默认将NUM_IRQS设为 32SOC_NEORV32_VERSION为0x01110600对应文档声明的 v1.11.6格式与 NEORV32 的 mimpid 寄存器一致。CPU 与 RISC-V ISA 扩展配置NEORV32 的 SoC 配置假设 CPU 实现启用了以下 RISC-V ISA 扩展Zicntr基础计数器和定时器扩展Zicsr控制与状态寄存器CSR指令扩展NEORV32 中始终启用Zifencei指令取指屏障扩展始终启用。实际板级 DTS 中通过riscv,isa-base rv32i声明基础 ISA 为 RV32I并通过riscv,isa-extensions列出启用的扩展见 minimalboot 与 up5kdemo。如果你的 NEORV32 实现启用了其他受支持的 RISC-V 扩展如 M、A、C、F、D、Zfinx 等只需同步修改cpu0节点的riscv,isa-extensions属性即可无需改动板卡其他部分。外设使能总览按需开启匹配你的 NEORV32 实现NEORV32 的大多数外设在 Zephyr 板卡中默认禁用原因在于 NEORV32 本身是可裁剪的 SoC——不同模板/用户实现可能并未例化某些外设。使能方式统一为在 overlay 或板卡扩展中把对应 Devicetree 节点的status置为okay必要时补充reg等属性。以下逐项说明。CLINT 与机器定时器MTIMERNEORV32 的 Core Local InterruptorCLINT及其机器定时器MTIMER在 Zephyr 中被支持但默认禁用。CLINT 节点的 compatible 为neorv32,clint, sifive,clint0MTIMER 节点使用标准riscv,machine-timer兼容性并声明了mtime/mtimecmp寄存器对见 neorv32.dtsi。对于实现了 CLINT/MTIMER 的 NEORV32 SoC使能方式为clint { status okay; }; mtimer { status okay; };内部指令存储器IMEMIMEM 是 NEORV32 执行代码的片上存储器。在 Zephyr 中它被声明为soc-nv-flash, mmio-sram作为zephyr,flash使用。IMEM 默认禁用使能时需要通过reg指定大小并置status okayimem { status okay; reg 0x0 DT_SIZE_K(64); /* 64 KiB 指令存储器 */ };内部数据存储器DMEMDMEM 是 NEORV32 的片上数据存储器作为zephyr,sram默认禁用使能方式与 IMEM 类似dmem { status okay; reg 0x80000000 DT_SIZE_K(64); /* 64 KiB 数据存储器 */ };串口 UART0 / UART1NEORV32 的两个串口UART0、UART1由 drivers/serial/uart_neorv32.c 驱动支持默认禁用。使能方式为uart0 { status okay; }; uart1 { status okay; };注意两个板卡目标都在 UART0 上提供控制台波特率固定为19200以匹配 NEORV32 标准 bootloader 的波特率。如需修改波特率调整uart0节点的current-speed属性即可uart0 { status okay; current-speed 115200; };UART 节点的interrupt-names为RX/TX且通过syscon sysinfo引用 SYSINFO 来获取时钟频率见 neorv32.dtsi。GPIONEORV32 GPIO 端口默认禁用由 drivers/gpio/gpio_neorv32.c 驱动。使能时可通过ngpios指定支持的 GPIO 数量gpio { status okay; ngpios 8; /* 例化 8 个 GPIO */ };PWMNEORV32 PWM 控制器默认禁用由 drivers/pwm/pwm_neorv32.c 驱动。使能方式pwm { status okay; };PWM 节点声明了#pwm-cells 3channel、period、flags板级 DTS 中 3 路 PWM LED 的周期均配置为PWM_MSEC(20)即 20 ms。真随机数发生器TRNGNEORV32 TRNG 默认禁用由 drivers/entropy/entropy_neorv32_trng.c 驱动。值得注意的是trng被选为 SoC 默认的熵源neorv32.dtsi 中的zephyr,entropy trng;。使能方式trng { status okay; };通用定时器GPTMRNEORV32 通用定时器GPTMR默认禁用由 drivers/counter/counter_neorv32_gptmr.c 以 counter API 驱动。使能时需要通过prescaler属性选择时钟分频系数gptmr { status okay; prescaler 0; /* 分频系数选择见下表 */ };prescaler的取值映射到硬件分频系数驱动源码中维护了对应的查找表counter_neorv32_gptmr.c实际计数频率 SYSINFO 时钟 / 分频系数prescaler 值分频系数0214283644128510246204874096构建与烧录从 hello_world 跑起来NEORV32 的烧录流程与多数 FPGA 上的软核处理器类似先配置 FPGA bitstream再通过 JTAG 或 UART 加载应用。前置条件按 NEORV32 用户指南所述将包含 NEORV32 处理器建议启用 On-Chip DebuggerOCD与 bootloader的 bitstream 配置到 FPGA完成 Zephyr 环境搭建west 等工具链就绪。配置串口控制台使用任意串口终端minicom、putty 等连接 NEORV32 的 UART0参数如下速率Speed19200数据位Data8校验ParityNone停止位Stop bits1通过 JTAG 烧录烧录依赖 OpenOCD。板卡的 runner 配置在 board.cmake 中包含openocdrunner 的--file-typeelf与--cmd-reset-halt halt参数并引入boards/common/openocd.board.cmake。JTAG 链路定义位于support/neorv32.cfg创建名为neorv32.cpu的 RISC-V targetTAP 的 IR 长度为 5期望 IDCODE 为0x0cafe001并配置了 256 字节、地址0x80000000DMEM的工作区support/openocd.cfg默认使用 FTDI 适配器VID/PID0x0403 0x6010即常见 FT2232 类调试器adapter speed 10001 MHz并支持通过_ZEPHYR_BOARD_SERIAL指定调试器序列号。构建并烧录 hello_worldwest build -b neorv32/neorv32/variant samples/hello_world west flash其中variant为minimalboot或up5kdemo。注意通过 JTAG 烧录要求 NEORV32 实现包含 OCD 与 bootloader若未启用 bootloaderIMEM 会被配置为 ROM无法通过 JTAG 修改。默认 OpenOCD 配置与 NEORV32 项目提供的示例相似。如果使用其他 JTAG 适配器可以通过west flash的附加参数传入 OpenOCD 配置。例如使用FlyswatterJTAG 并以 2 kHz 速度运行west flash -- \ --config interface/ftdi/flyswatter.cfg \ --config neorv32.cfg \ --cmd-pre-init adapter speed 2000烧录成功后串口终端应输出类似以下内容*** Booting Zephyr OS build zephyr-vn.n.nn *** Hello World! neorv32/neorv32/variant将应用持久化到 FPGA bitstream需要明确上述 JTAG 烧录步骤不会将应用写入非易失存储——应用只是被写入了 FPGA 内部的 block RAM。下次重新配置 FPGA 时将恢复为 bitstream 内嵌的默认应用。若要让应用随 bitstream 持久化需要按 NEORV32 用户指南操作。Zephyr 侧提供了自动化辅助启用CONFIG_BUILD_OUTPUT_BIN后如果系统中能找到 NEORV32 的image_gen工具构建系统会自动生成 zephyr.vhd 文件该文件可用于初始化 NEORV32 内部指令存储器IMEM。为了让构建系统自动找到image_gen最简单的方式是将其所在目录加入PATH环境变量。否则可以在构建时显式传入路径west build -b neorv32/neorv32/variant samples/hello_world \ -- -DCMAKE_PROGRAM_PATHpath/to/neorv32/sw/image_gen/构建日志会提示生成的文件位置*_exe.bin与*.vhd见 boards/others/neorv32/CMakeLists.txt若未找到image_gen则会提示无法生成 NEORV32 镜像文件。通过 UART 上传应用同样在启用CONFIG_BUILD_OUTPUT_BIN且存在image_gen的前提下构建系统会额外生成 zephyr_exe.bin 文件该文件适合通过 NEORV32 内置 bootloader 上传到板卡上传步骤见 NEORV32 用户指南。通过 JTAG 调试调试与烧录类似使用west debug拉起调试会话west build -b neorv32/neorv32/variant samples/hello_world west debug在调试器中单步执行应用串口终端同样会输出*** Booting Zephyr OS build zephyr-vn.n.nn *** Hello World! neorv32/neorv32/variant深入理解板级默认配置与构建产物两个板卡目标的默认 Kconfig 配置相同见 minimalboot_defconfig 与 up5kdemo_defconfig核心为CONFIG_SERIALy CONFIG_CONSOLEy CONFIG_UART_CONSOLEy CONFIG_UART_INTERRUPT_DRIVENy即默认启用串口与 UART 控制台中断驱动模式。结合板级 DTS 中chosen节点的zephyr,console、zephyr,shell-uart、zephyr,uart-pipe均指向uart0你可以在此基础上叠加 shell、日志等子系统。定制自己的 NEORV32 实现当你的 NEORV32 与两个模板不同时推荐做法是在应用目录下编写 Devicetree overlay按上文各外设的使能方式开启/关闭对应节点、调整reg大小、ngpios数量、current-speed波特率与prescaler分频若改动较大可基于neorv32/neorv32板卡扩展出树外板卡复用 boards/others/neorv32/ 中的 DTS、defconfig 与 OpenOCD 支持文件作为起点修改cpu0的riscv,isa-extensions以匹配实际例化的 ISA 扩展。这套默认禁用、按需使能的设计让 Zephyr 的 NEORV32 支持能够覆盖从最小化内核到功能完整的各类 NEORV32 实例化配置。如需继续深入可参考 hello_world 示例、板级 minimalboot DTS 与 up5kdemo DTS以及 SoC 层 Kconfig 与 启动初始化实现。【免费下载链接】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),仅供参考