尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
RIOT OS 支持 SiFive HiFive1 开发板:RISC-V 平台上的入门与板级适配详解
RIOT OS 支持 SiFive HiFive1 开发板RISC-V 平台上的入门与板级适配详解【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本文基于 RIOT 仓库中 boards/hifive1/doc.md 的核心定义展开HiFive1 是一块基于 SiFive FE310 RISC-V 内核的开源开发板专为 RISC-V 软件与硬件实验而设计并完整支持运行 RIOT OS。文章将以该板级文档为骨架结合boards/hifive1/目录下的板级配置、cpu/fe310/的 MCU 实现与烧录脚本讲解如何在 HiFive1 上编译、烧录与运行 RIOT 应用并深入剖析板级适配的内部结构。一、HiFive1 与 RIOTRISC-V 实验平台的起点boards/hifive1/doc.md用一段简洁的defgroup注释定义了这块板子在 RIOT 中的角色硬件身份基于 SiFive FE310 RISC-V 内核的开源开发板open-source development board设计目标面向 RISC-V 软件与硬件实验experimentation在 RIOT 中的定位作为 RISC-V 平台上的受支持板卡可直接运行 RIOT OS。这一定位与 RIOT 的多架构支持策略一致RIOT 除了传统的 ARM Cortex-M、AVR、MSP430 之外通过riscv_common与fe310CPU 实现把 RISC-V 也纳入官方支持的 CPU 家族。HiFive1 由此成为开发者体验 RIOT on RISC-V 的最直观入口。在仓库中HiFive1 板级支持由以下几个关键文件构成全部位于 boards/hifive1/文件职责Makefile声明板级模块为board纳入 RIOT 构建体系Makefile.features声明该板提供的外设特性periph_*Makefile.include配置默认串口、烧录器OpenOCD与自定义烧录脚本Kconfig板卡的 Kconfig 定义并关联 CPU 型号 FE310-G000include/board.h板级宏定义LED、XTIMER 频率、时钟初始化函数include/periph_conf.h外设配置表UART、SPI、Timer、PWM下面逐层展开。二、板卡在构建系统中的身份Makefile 与 Kconfig2.1Makefile.features外设能力清单boards/hifive1/Makefile.features 首先固定了 CPU 与具体型号CPU fe310 CPU_MODEL fe310_g000这表示 HiFive1 使用的是 SiFive FE310 系列中的FE310-G000型号Freedom E300 SoC 平台上的经典内核。随后以字母序声明板级外设特性FEATURES_PROVIDED periph_rtc FEATURES_PROVIDED periph_rtt FEATURES_PROVIDED periph_spi FEATURES_PROVIDED periph_timer FEATURES_PROVIDED periph_uart注意其中被注释掉的#FEATURES_PROVIDED periph_pwm虽然periph_conf.h中定义了PWM_NUMOF (3)但 PWM 特性并未正式声明说明该板对 PWM 的支持处于配置已就绪、特性未开放的状态应用层不应直接依赖periph_pwm模块。被正式提供的五种特性意味着 RIOT 的外设抽象层periph在 HiFive1 上可用实时时钟 RTC、低功耗定时器 RTT、SPI、通用定时器 Timer 与 UART。2.2Kconfig板卡符号与 CPU 型号的绑定boards/hifive1/Kconfig 在 Kconfig 体系中注册了板卡config BOARD default hifive1 if BOARD_HIFIVE1 config BOARD_HIFIVE1 bool default y select CPU_MODEL_FE310_G000当选择BOARD_HIFIVE1时会自动select CPU_MODEL_FE310_G000从而把板卡与 CPU 型号在配置阶段绑定无需在 Makefile 中重复指定。这是 RIOT 使用 Kconfig 进行配置时make menuconfig等场景板卡身份的最终裁决点。2.3Makefile极简的模块声明boards/hifive1/Makefile 只有三行MODULE board include $(RIOTBASE)/Makefile.base它把板卡编译为一个名为board的模块由Makefile.base统一处理源文件收集与编译规则。板级实际的 C 逻辑时钟初始化、外设初始化由cpu/fe310/与sys层承担板卡目录本身没有额外的.c文件体现了板卡 配置 声明的轻量设计。三、板级硬件定义board.hboards/hifive1/include/board.h 包含了运行 RIOT 所需的板级细节全部宏都可以在应用代码中直接使用3.1 XTIMER 频率#define XTIMER_HZ (32768UL)XTIMER_HZ决定 RIOT 定时器抽象xtimer与ztimer在后台使用的基础 tick 频率。HiFive1 上使用32.768 kHz这与 FE310 的 RTC 时钟域常见于 32.768 kHz 晶振相匹配可用于后续低功耗定时器 RTT 的节拍。3.2 板载三色 LED板卡提供红、绿、蓝三颗 LED映射到 FE310 GPIO 端口 0 的特定引脚并定义了标准的LEDx_ON / LEDx_OFF / LEDx_TOGGLE宏宏引脚颜色实现方式LED0_PINGPIO_PIN(0, 22)红gpio_clear/gpio_set/gpio_toggleLED1_PINGPIO_PIN(0, 19)绿同上LED2_PINGPIO_PIN(0, 21)蓝同上注意LEDx_ON使用的是gpio_clear拉低点亮说明这三颗 LED 是低电平有效的共阳接法这是 HiFive1 硬件原理图决定的应用层只需调用宏无需关心电平极性。3.3 时钟初始化接口void board_init_clock(void);该函数由板卡/CPU 层实现用于把系统时钟切换到 PLL 倍频后的高速时钟以获得更快的 SPI 访问速度。它的具体实现位于cpu/fe310/的时钟驱动中见下文第六节。四、外设引脚映射periph_conf.hboards/hifive1/include/periph_conf.h 是 RIOTperiph驱动层与 HiFive1 硬件之间的接线表。4.1 UART双串口static const uart_conf_t uart_config[] { { .addr UART0_CTRL_ADDR, .rx GPIO_PIN(0, 16), .tx GPIO_PIN(0, 17), .isr_num INT_UART0_BASE, }, { .addr UART1_CTRL_ADDR, .rx GPIO_PIN(0, 18), .tx GPIO_PIN(0, 23), .isr_num INT_UART1_BASE, }, }; #define UART_NUMOF ARRAY_SIZE(uart_config)UART0引脚 16/17对应板载 USB 转串口FTDI即默认控制台串口UART1引脚 18/23为扩展串口可用于外接传感器或调试UART_NUMOF通过ARRAY_SIZE自动推导为 2无需手工维护数量。4.2 SPIQSPI 闪存所在的 SPI1static const spi_conf_t spi_config[] { { .addr SPI1_CTRL_ADDR, .mosi GPIO_PIN(0, 3), /* D11 */ .miso GPIO_PIN(0, 4), /* D12 */ .sclk GPIO_PIN(0, 5), /* D13 */ }, }; #define SPI_NUMOF ARRAY_SIZE(spi_config)SPI1 使用 D11/D12/D13 三根引脚。FE310 的 SPI1 同时连接着板载 QSPI 闪存因此这套配置既能驱动外接 SPI 设备也与板级 OpenOCD 脚本中flash bank ... fespi的闪存访问路径一致。4.3 Timer 与 PWM 计数#define TIMER_NUMOF (1) #define PWM_NUMOF (3)TIMER_NUMOF 1表示向periph_timer提供 1 个通用定时器PWM_NUMOF 3在配置层面预留了 3 路 PWM与Makefile.features中未开放的periph_pwm呼应。五、编译、烧录与运行实践流程5.1 选择板卡构建任意 RIOT 应用时通过BOARD变量指定目标板make BOARDhifive1在应用目录如 examples/basic/hello-world 下执行RIOT 会依据 boards/hifive1/Makefile.features 加载fe310CPU 支持并自动启用periph_uart、periph_timer等模块。首次构建时make还会提示确认 RISC-V 工具链配置。5.2 默认串口与烧录器设置boards/hifive1/Makefile.include 给出了关键的开发环境默认值PORT_LINUX ? /dev/ttyUSB1 PORT_DARWIN ? $(firstword $(sort $(wildcard /dev/tty.usbmodem*))) PROGRAMMER ? openocd PROGRAMMERS_SUPPORTED openocd OPENOCD_CMD_RESET_RUN -c _reset FLASHER $(RIOTBASE)/boards/hifive1/dist/flasher.shLinux下默认串口为/dev/ttyUSB1HiFive1 板载 FTDI 通常枚举为该设备可通过make BOARDhifive1 term观察必要时用PORT/dev/ttyUSB0覆盖macOS下自动从/dev/tty.usbmodem*中挑选第一个设备烧录器固定为OpenOCD由于 HiFive1 的复位逻辑特殊见下RIOT 提供自定义烧录脚本flasher.sh而不是使用通用的openocd.sh。5.3 烧录命令在应用目录执行make BOARDhifive1 flash该命令会调用 boards/hifive1/dist/flasher.sh。这个脚本是理解 HiFive1 烧录流程的关键其核心do_flash步骤如下${OPENOCD} -f ${OPENOCD_CONFIG} \ -c tcl_port disabled \ -c telnet_port disabled \ -c gdb_port disabled \ -c init \ -c halt \ -c flash protect 0 64 last off \ -c flash write_image erase ${IMAGE_FILE} ${IMAGE_OFFSET} ${IMAGE_TYPE} \ -c verify_image ${IMAGE_FILE} \ -c reset halt \ -c reg pc 0x20000000 \ -c resume \ -c exit其中值得注意的细节init后直接halt而非reset halt脚本注释明确说明 For some reason halt seems to be more reliable then reset halt at getting the HiFives attention即 HiFive1 的复位行为与标准 Cortex-M 板不同直接halt更可靠flash protect 0 64 last off解除闪存保护允许擦写flash write_image erase擦除后写入支持 elf/ihex/s19/bin 等 OpenOCD 可识别的格式通过IMAGE_TYPE控制默认留空由 OpenOCD 自动探测verify_image写入后回读校验reset halt后reg pc 0x20000000再resume这是 HiFive1 特有的软复位技巧——把 PC 直接设置到闪存基地址0x20000000后恢复运行从而绕过硬件复位HiFive1 的复位拉伸器 Reset Stretcher 长达约 1 秒且不支持 OpenOCD 的reset run。脚本还支持两个环境变量以应对进阶场景环境变量默认值作用IMAGE_OFFSET0烧录地址偏移可用于引导加载器固件换区/重映射场景IMAGE_TYPE空自动探测强制指定镜像类型elf、hex、s19、bin5.4 OpenOCD 配置文件dist/openocd.cfgboards/hifive1/dist/openocd.cfg 描述了 JTAG 适配器与目标芯片要点包括adapter_khz 10000 interface ftdi ftdi_device_desc Dual RS232-HS ftdi_vid_pid 0x0403 0x6010 jtag newtap riscv cpu -irlen 5 -expected-id 0x10e31913 target create riscv.cpu riscv -chain-position riscv.cpu flash bank onboard_spi_flash fespi 0x20000000 0 0 0 riscv.cpu proc _reset {} { ftdi_set_signal nSRST 0 ftdi_set_signal nSRST z sleep 1500 }使用板载 FTDIVID:PID0x0403:0x6010即 Dual RS232-HS作为调试适配器JTAG 速率 10 MHzRISC-V TAP 的 JTAG IR 长度为 5期望 ID 为0x10e31913FE310 的 JTAG IDCODE板载 QSPI 闪存以fespi驱动挂在地址0x20000000——这正是上一节把 PC 设为0x20000000的原因也是flash write_image的目标空间自定义_reset过程通过 FTDI 信号nSRST手动拉低复位线并等待 1500 ms避开Reset Stretcher复位拉伸问题。Makefile.include中的OPENOCD_CMD_RESET_RUN -c _reset正是让 RIOT 的复位操作走这个自定义过程。5.5 查看串口输出烧录完成后连接串口make BOARDhifive1 term即可看到 hello-world 等应用通过 UART0默认控制台打印输出。六、底层 CPU 支持FE310 与时钟系统板卡之上RISC-V 的具体实现位于 cpu/fe310/其 cpu/fe310/doc.md 说明该模块包含 SiFive FE310 的专属代码与定义并指向通用 RISC-V 支持cpu/riscv_common。从 cpu/fe310/periph/ 目录可以看到已实现的periph驱动gpio.c、i2c.c、pm.c、rtc.c、rtt.c、spi.c、uart.c、wdt.c、cpucycle.c、cpuid.c等它们与Makefile.features声明的periph_rtc/rtt/spi/timer/uart一一对应。6.1 时钟配置clk_conf.hboard.h声明的board_init_clock()最终由 cpu/fe310/clock.c 实现其行为受 cpu/fe310/include/clk_conf.h 中的编译期配置驱动。该文件定义了四种互斥的时钟源方案且只能启用其一多处#error编译期校验配置宏说明默认值CONFIG_USE_CLOCK_HFXOSC_PLL16 MHz 外部晶振经 PLL 倍频默认1CONFIG_USE_CLOCK_HFXOSC直接使用 16 MHz 外部晶振0CONFIG_USE_CLOCK_HFROSC_PLL内部高频 RC 振荡器经 PLL 倍频0CONFIG_USE_CLOCK_HFROSC直接使用内部高频 RC 振荡器0默认方案HFXOSC_PLL下核心频率的计算链为#define CONFIG_CLOCK_PLL_R (1) /* 输入时钟 2 分频使用 HFXOSC 时强制 */ #define CONFIG_CLOCK_PLL_F (39) /* 倍频系数 2 * (39 1) 80 */ #define CONFIG_CLOCK_PLL_Q (1) /* VCO 2 分频 */ #define CLOCK_PLL_INPUT_CLOCK MHZ(16) #define CLOCK_PLL_REFR (CLOCK_PLL_INPUT_CLOCK / (CONFIG_CLOCK_PLL_R 1)) /* 8 MHz */ #define CLOCK_PLL_VCO (CLOCK_PLL_REFR * (2 * (CONFIG_CLOCK_PLL_F 1))) /* 640 MHz */ #define CLOCK_PLL_OUT (CLOCK_PLL_VCO / (1 CONFIG_CLOCK_PLL_Q)) /* 320 MHz */ #define CLOCK_CORECLOCK (CLOCK_PLL_OUT) /* 320000000 Hz */即16 MHz 晶振 → 2 分频为 8 MHz → 80 倍频到 640 MHz VCO → 2 分频输出 320 MHz 核心时钟。文件同时做了严格的合法性校验HFXOSC 下REFR必须为 8 MHz、VCO 必须落在 384–768 MHz、PLL 输出必须落在 48–384 MHz保证配置错误在编译期即可暴露。6.2 时钟切换流程clock.cboard_init_clock()在clock.c中的实现遵循先稳定、后切换的安全顺序从 cpu/fe310/clock.c 源码可见若当前正运行在 PLL 时钟上先切回非 PLL 时钟源避免在修改 PLL 寄存器时系统失步启用 HFXOSC 并轮询等待XOSC_RDY就绪配置 PLL 的R/F/Q分频倍频参数关闭 PLL Bypass轮询等待PLL_LOCK锁定最后把时钟源选择位PLL_SEL切到 PLL完成到 320 MHz 的切换。这解释了board.h注释中使用 PLL 以获得更快的 SPI 访问的含义系统从默认低频运行状态切到 320 MHz 主频后外设总线频率随之提高。七、测试与验证如何确认板卡可用RIOT 在tests/下提供了大量可用于 HiFive1 的验证用例。从测试的Makefile.ci持续集成白名单可以看到 HiFive1 被列为测试目标例如tests/bench/xtimer/Makefile 与 tests/bench/ztimer/Makefile定时器基准测试验证XTIMER_HZ 32768下的 tick 精度tests/cpu/pmp_noexec_ram/MakefileRISC-V 物理内存保护PMP特性测试tests/net/*下多个网络用例如gnrc_ipv6_ext_frag、gnrc_sixlowpan、emcute等也把 HiFive1 列入 CI 白名单说明该板具备运行 RIOT 网络栈的能力。本地验证时可在任意测试目录下执行make BOARDhifive1 flash term例如先跑 tests/periph_uart 或 tests/periph_spi 来验证外设通路再运行 tests/thread_flags 等内核测试确认调度器正常。八、总结HiFive1 在 RIOT 中的支持是一条完整的板卡 → CPU → 工具链链路板卡层boards/hifive1/通过Makefile.features声明外设能力、periph_conf.h定义引脚映射、board.h提供 LED 与时钟宏CPU 层cpu/fe310/实现 FE310 的 RISC-V 外设驱动并通过clk_conf.h/clock.c把核心时钟稳定地提升到 320 MHz工具链层boards/hifive1/dist/用定制 OpenOCD 配置与flasher.sh绕过 HiFive1 的复位限制实现可靠的擦写、校验与启动。对想要在 RISC-V 硬件上体验 RIOT 的开发者而言只需make BOARDhifive1 flash term即可完成从编译到运行的全流程对希望移植新 RISC-V 板卡的开发者HiFive1 的板级文件则是理解RIOT 板卡适配范式的最小而完整的参考实现。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

big-AGI 完整上手与部署指南:AI 服务接入、数据主权与生产环境落地

big-AGI 完整上手与部署指南:AI 服务接入、数据主权与生产环境落地

big-AGI 完整上手与部署指南:AI 服务接入、数据主权与生产环境落地 【免费下载链接】big-AGI AI suite powered by state-of-the-art models and providing advanced AI/AGI functions. Includes AI personas, AGI functions, world-class Beam multi-model chats, …

📅 2026/9/17 22:43:57
Realtek Ameba系列九款芯片选型指南:从RTL8710到RTL8735

Realtek Ameba系列九款芯片选型指南:从RTL8710到RTL8735

做嵌入式开发的人,这两年应该都能感受到一个明显变化:IoT 项目的选型表里,国产芯片和台系芯片的出场率越来越高,Realtek Ameba 系列就是其中一个绕不开的名字。很多朋友一开始接触 Ameba,是因为 Arduino 兼容板或者某些…

📅 2026/9/17 22:43:57
fluent-bit 内嵌 WAMR 的 WebAssembly / WASI 提案支持全景:默认启用、可选开启与未实现状态解析

fluent-bit 内嵌 WAMR 的 WebAssembly / WASI 提案支持全景:默认启用、可选开启与未实现状态解析

fluent-bit 内嵌 WAMR 的 WebAssembly / WASI 提案支持全景:默认启用、可选开启与未实现状态解析 【免费下载链接】fluent-bit Fast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows 项目地址: https://gitcode.com/GitHub_…

📅 2026/9/17 22:43:57
MORE NEWS

更多资讯

📰

基于SSM框架的大学生兼职系统设计与实现解析

如果你是在校生,或者刚接触Java Web开发,那“SSM222的大学生兼职系统”这个题目你大概率不会陌生。这几乎是国内软件工程、计算机科学与技术专业毕业设计里出场率最高的选题之一,每年都有大量学生拿它练手、交作业,甚至很多项目实…

📰

Security-101 安全运营(SecOps)核心概念详解:组织形态、与 IT 运维的差异及 NIST CSF 响应框架

Security-101 安全运营(SecOps)核心概念详解:组织形态、与 IT 运维的差异及 NIST CSF 响应框架 【免费下载链接】Security-101 8 Lessons, Kick-start Your Cybersecurity Learning. 项目地址: https://gitcode.com/GitHub_Trending/se/Sec…

📰

Windows Server 2016无法安装I219网卡驱动?用命令行轻松搞定

前言先说个我上周刚踩完的现场:一台刚装完系统的Windows Server 2016,设备管理器里“其他设备”下面躺着一个黄色感叹号的“以太网控制器”,双击看硬件ID,开头是PCI\VEN_8086&DEV_,一看就知道这是Intel I219系列网…

📰

agent-governance-toolkit 中的 AgentMesh × LangChain 集成实战:策略执行、审计日志与信任评分

agent-governance-toolkit 中的 AgentMesh LangChain 集成实战:策略执行、审计日志与信任评分 【免费下载链接】agent-governance-toolkit AI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engin…

📰

基于 mistral.rs 的 Mistral 3 多模态模型 OpenAI 兼容服务器部署指南

基于 mistral.rs 的 Mistral 3 多模态模型 OpenAI 兼容服务器部署指南 【免费下载链接】mistral.rs Fast, flexible LLM inference 项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rs 导读 本指南以 mistral.rs 仓库中的可运行服务器示例 mistral3&#xf…

📰

隔壁开了同品类怎么办?小吃店竞争应对的四个动作

【本篇要点】 先别降价:价格战直接吃利润,而且容易陷入互相压价的死循环。 在顾客能感知的地方拉开差距,比在价格上纠缠更有效。 竞争对手是免费的调研样本,他验证过的做法可以直接借鉴。开小吃店很现实的一件事:你生意…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬