1. 项目概述
拿到一块新的开发板,第一步永远是让它“跑起来”。对于SparkFun的RED-V RedBoard或Thing Plus来说,这个过程有点特别,因为它搭载的是一颗RISC-V架构的SiFive FE310核心。如果你是第一次接触RISC-V,或者习惯了Arduino那种即插即用的体验,可能会觉得有点无从下手。别担心,这篇指南就是为你准备的。我会带你走通从开箱到点灯、打印“Hello World”的完整流程,并详细拆解Freedom Studio和Zephyr RTOS两种主流开发环境下的配置与编程方法。无论你是想评估RISC-V的潜力,还是手头正好有这块板子想折腾点东西,这篇基于实战的总结都能帮你避开我踩过的那些坑,快速上手。
2. 核心硬件与开发环境解析
2.1 RED-V开发板架构与关键警告
RED-V开发板的核心是一颗SiFive FE310系统级芯片(SoC)。但这里有一个非常关键且容易忽略的细节:板上其实有两颗处理器。主处理器是RISC-V架构的FE310,而旁边还有一颗NXP的K22 ARM Cortex-M4芯片。这颗K22的作用至关重要,它内部烧录了Segger的专有固件,充当了板载的J-Link OB调试器。它的唯一职责就是通过USB接口与你的电脑通信,并将你编译好的程序上传到FE310核心中。
重要警告 :绝对不要尝试去重新编程这颗NXP K22芯片。如果你不小心用其他调试工具(比如OpenOCD)对其进行了擦写,那么板载的J-Link OB功能将永久失效。这意味着你将无法再通过USB直接给FE310下载程序。要恢复它,你必须向Segger购买许可证,并使用他们官方的J-Link编程器才能重新烧录固件。这无疑是得不偿失的。所以,请务必将其视为一个“黑盒”,只使用它提供的标准J-Link调试接口。
2.2 开发环境选型:Freedom Studio vs. Zephyr RTOS
官方提供了两种主流的开发路径,它们各有侧重:
Freedom Studio :这是SiFive官方推出的基于Eclipse的集成开发环境(IDE)。它最大的优点是“一站式”和“官方支持”。它集成了编译器、调试器、串口终端和丰富的示例项目,对于初学者和快速原型开发非常友好。其底层基于Freedom E SDK,提供了对FE310芯片硬件抽象层(HAL)的直接访问,即Freedom Metal库。如果你希望以最接近“裸机”的方式学习RISC-V编程,或者进行底层硬件操作,Freedom Studio是首选。
Zephyr RTOS :这是一个小型、可扩展的实时操作系统(RTOS),由Linux基金会托管。选择Zephyr意味着你将从“裸机编程”迈向“操作系统级开发”。它提供了任务调度、内存管理、设备驱动框架等高级功能,适合开发更复杂的、多任务的应用。Zephyr的构建系统(基于CMake和West)和驱动模型需要一定的学习成本,但它能让你编写的代码具有更好的可移植性和结构性。如果你未来的项目涉及传感器网络、物联网设备或需要复杂的任务管理,从Zephyr开始会更有远见。
我的建议是: 先从Freedom Studio入手,完成基础入门 。这能帮你建立对FE310硬件(如GPIO、串口)最直观的认识。当你觉得裸机编程开始变得繁琐(比如需要管理多个定时器或外设中断)时,再切换到Zephyr RTOS,你会更深刻地体会到操作系统带来的便利。
3. 基于Freedom Studio的开发实战
3.1 软件安装与驱动配置
首先,从SiFive官网下载Freedom Studio。这里有一个Windows系统下的关键细节:压缩包内的文件路径可能非常长,超过Windows默认的260个字符限制,这会导致解压失败。因此,你有两件事必须做:
- 运行我提供的“Enable Long Paths for Windows”注册表文件,解除系统路径长度限制。
- 将Freedom Studio解压到根目录下的短路径中,例如
C:\FreedomStudio\。这是避免后续编译出现各种诡异错误的最简单方法。
安装完成后,连接RED-V开发板到电脑。Windows系统通常需要手动安装J-Link USB驱动。驱动位于 C:\FreedomStudio\SiFive\jlink-...\USBDriver 目录下。根据你的系统是64位(选择 x64 文件夹)还是32位(选择 x86 文件夹),运行对应的 dpinst_x64.exe 或 dpinst_x86.exe 完成安装。安装成功后,在设备管理器中应能看到“J-Link driver”相关的设备。
3.2 第一个程序:Hello World与串口通信
启动Freedom Studio,通过 File -> New -> Freedom E SDK Software Project 创建新项目。关键一步来了:在“Target Board”选择中,RED-V并没有直接列出。这是因为RED-V与SiFive的HiFive1 Rev B板在核心硬件(FE310)和调试接口上完全兼容。因此, 我们必须选择“HiFive1 Rev B (sifive-hifive1-revb)”作为目标板 。这是让一切正常工作的前提。
在示例模板中,选择“hello”。项目创建后,点击运行按钮(绿色播放键)进行编译和上传。你可能会遇到一个常见错误:GDB服务器配置问题导致上传失败。此时,不要直接点运行,而是通过 Run -> Run Configurations... 菜单,在左侧找到“SiFive GDB SEGGER J-Link Debugging”,选中你的项目,再点击“Run”。这个方法能绕过IDE的默认配置,直接调用正确的调试命令。
程序上传成功后,如何看到“Hello, World!”呢?RED-V会虚拟出两个串口,一个用于Bootloader,一个用于应用程序。我们需要在Freedom Studio内置的终端中连接正确的那个。在软件右下角找到“Terminal”标签页,点击“打开终端”图标,选择“Serial Terminal”。端口的判断有个小技巧:通常应用程序串口是枚举出来的两个COM口中数字较大的那个(但也不绝对,最可靠的方法是逐个尝试)。波特率设置为115200。连接后,按下板载的复位按钮,你就能在终端里看到启动信息和最终的“Hello, World!”了。
实操心得 :如果串口终端没有输出,九成是选错了COM口。关闭终端窗口,换另一个口重试。此外,Freedom Studio的串口终端有时会“卡住”,如果发现数据不刷新,断开重连是最快的解决方法。
3.3 深入GPIO控制:让LED闪烁起来
点灯是嵌入式世界的“Hello World”。但在RED-V上,控制GPIO不像Arduino用 digitalWrite 那么简单,需要遵循FE310的硬件操作序列。这里有一个核心概念: 编程时引脚的编号,指的是FE310芯片的GPIO引脚号,而非板子丝印上的数字 。例如,板载LED连接在FE310的GPIO5上。
下面是我整理的一个可用的闪烁LED代码示例及其逐行解析:
#include <stdio.h>
#include <time.h>
#include <metal/gpio.h> // 关键:FE310的GPIO硬件抽象库
// 自定义微秒级延迟函数(FE310 SDK没有提供现成的delay)
void delay(int us) {
// 将微秒转换为时钟周期数(粗略计算,系统时钟频率约16MHz)
int cycles = 16 * us;
clock_t start = clock();
while (clock() < start + cycles);
}
int main(void) {
printf("RED-V LED Blink Demo\n");
struct metal_gpio *led0; // 声明GPIO设备句柄
// 1. 获取GPIO设备。参数0代表GPIO0控制器(FE310只有一个GPIO块)
led0 = metal_gpio_get_device(0);
if (led0 == NULL) {
printf("错误:无法获取GPIO设备!\n");
return 1;
}
// 2. 关键操作序列:配置GPIO5为输出
// 必须先禁用输入功能,即使我们是用作输出
metal_gpio_disable_input(led0, 5);
// 启用该引脚的输出功能
metal_gpio_enable_output(led0, 5);
// 禁用引脚复用,确保它是普通的GPIO,而非其他外设功能(如UART)
metal_gpio_disable_pinmux(led0, 5);
// 3. 主循环中闪烁LED
while (1) {
metal_gpio_set_pin(led0, 5, 1); // 置高,LED亮(根据电路,可能是低电平点亮)
delay(500000); // 延迟约0.5秒
metal_gpio_set_pin(led0, 5, 0); // 置低,LED灭
delay(500000);
}
return 0;
}
代码要点解析 :
-
metal_gpio_get_device(0):FE310的所有GPIO(0-31)都属于同一个GPIO控制器,索引为0。 - 操作序列不可颠倒 :
disable_input->enable_output->disable_pinmux是标准流程。FE310的引脚可能默认连接了其他内部外设,disable_pinmux这一步确保了它是纯粹的GPIO。 - 延迟函数不精确 :这里用的
clock()和循环实现的延迟非常不精确,仅用于演示。实际项目中需要使用定时器中断或系统滴答计时器来实现精确延时。 - 电平逻辑 :
metal_gpio_set_pin(led0, 5, 1)是设置引脚输出高电平。你需要根据RED-V板上LED的具体连接电路(通常是阳极接GPIO,阴极接地,高电平点亮)来设置正确的电平值。
将代码粘贴到项目中,编译运行,你应该能看到板载LED开始规律闪烁。
4. 基于Zephyr RTOS的开发实战
4.1 Linux环境搭建与依赖安装
Zephyr在Linux(特别是Ubuntu)上的支持最为完善。以下是在Ubuntu 18.04/20.04 LTS上的完整配置步骤,每一步都至关重要。
首先,安装基础的编译工具和Python3环境:
sudo apt-get update
sudo apt-get install -y git cmake ninja-build gperf ccache dfu-util device-tree-compiler wget python3-pip python3-setuptools python3-tk python3-wheel xz-utils file make gcc gcc-multilib
接着,安装并升级CMake。系统自带的CMake版本可能过低,我们需要手动安装新版本(以3.20.5为例):
wget https://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5.tar.gz
tar xzf cmake-3.20.5.tar.gz
cd cmake-3.20.5
./bootstrap
make -j$(nproc)
sudo make install
安装后运行 cmake --version 确认版本。
然后,安装Zephyr的构建管理工具 west 并初始化工作区:
pip3 install --user west
echo 'export PATH=~/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
west init ~/zephyrproject
cd ~/zephyrproject
west update
这里有一个大坑: 执行 west init 和 west update 时,千万不要使用 sudo 。否则会导致后续编译时出现权限错误,难以排查。
安装Python依赖:
pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt
最后,安装Zephyr SDK(工具链):
cd ~
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.13.2/zephyr-sdk-0.13.2-linux-x86_64-setup.run
chmod +x zephyr-sdk-0.13.2-linux-x86_64-setup.run
./zephyr-sdk-0.13.2-linux-x86_64-setup.run -- -d ~/zephyr-sdk-0.13.2
安装过程中会提示注册工具链,按回车键默认安装即可。安装完成后,设置环境变量:
echo 'export ZEPHYR_TOOLCHAIN_VARIANT=zephyr' >> ~/.bashrc
echo 'export ZEPHYR_SDK_INSTALL_DIR=$HOME/zephyr-sdk-0.13.2' >> ~/.bashrc
source ~/.bashrc
4.2 在Zephyr中实现Hello World与Blinky
环境配置好后,编译和烧录就相对简单了。首先确保RED-V通过USB连接到电脑,使用 lsusb 命令应能看到Segger J-Link设备。
编译并烧写Hello World示例:
cd ~/zephyrproject/zephyr
west build -p auto -b hifive1_revb samples/hello_world
west flash
和Freedom Studio一样,这里的目标板同样指定为 hifive1_revb 。 -p auto 参数会让west自动清理并重建。 west flash 命令会自动调用J-Link工具将程序烧录到板子上。
查看串口输出,我们需要确定设备节点。通常RED-V在Linux下会注册为 /dev/ttyACM0 或 /dev/ttyACM1 。使用 screen 命令连接:
# 安装screen(如果未安装)
sudo apt-get install screen
# 连接串口,115200波特率
screen /dev/ttyACM0 115200
按下板子复位键,你将看到Zephyr的启动信息和“Hello, World!”。退出screen会话的快捷键是 Ctrl+A ,然后按 K ,再按 Y 确认。
编译并烧写LED闪烁示例: Zephyr的GPIO控制更抽象、更规范。我们修改基本的blinky示例来点RED-V的板载LED。
cd ~/zephyrproject/zephyr/samples/basic/blinky
打开 src/main.c 文件,关键修改在于LED引脚的定义。在Zephyr中,我们同样需要使用FE310的GPIO引脚号(5),而不是板子丝印号。
/* 原代码可能通过设备树别名获取LED引脚,我们直接硬编码为5 */
#define LED_PORT DT_ALIAS_LED0_GPIOS_CONTROLLER // 这个可能指向gpio0,通常不用改
#define LED 5 // 将这里的定义改为 5
void main(void) {
const struct device *dev;
dev = device_get_binding(DT_LABEL(DT_NODELABEL(gpio0))); // 更可靠的获取设备方式
if (dev == NULL) {
printk("错误:无法找到GPIO设备!\n");
return;
}
gpio_pin_configure(dev, LED, GPIO_OUTPUT_ACTIVE); // 配置为输出,初始激活(根据电路决定高低)
while (1) {
gpio_pin_toggle(dev, LED); // 翻转引脚电平
k_sleep(K_MSEC(1000)); // Zephyr内核延时函数,睡眠1000毫秒
}
}
保存后,回到zephyr目录编译烧录:
cd ~/zephyrproject/zephyr
west build -p auto -b hifive1_revb samples/basic/blinky
west flash
烧录完成后,无需任何串口输出,板载LED就会开始每秒闪烁一次。Zephyr的GPIO API gpio_pin_toggle 比Freedom Metal的原始操作要简洁和安全得多。
5. 高级技巧、问题排查与资源汇总
5.1 两种开发模式下的深度对比与选择建议
经过两种环境的实践,我们可以做一个更深入的对比:
| 特性维度 | Freedom Studio (Freedom E SDK) | Zephyr RTOS |
|---|---|---|
| 学习曲线 | 较陡峭,需直接操作硬件寄存器或Metal库,更接近裸机。 | 初期配置复杂,但API更高级、统一,适合有RTOS经验的开发者。 |
| 开发效率 | 对于简单、单一任务的项目,编译烧录快。 | 项目复杂后优势明显,驱动框架、线程管理能节省大量底层代码。 |
| 代码可移植性 | 低,代码严重依赖FE310特定硬件和Metal库。 | 高,使用Zephyr标准API的代码,稍作修改即可移植到其他支持的平台。 |
| 社区与生态 | SiFive和SparkFun社区支持,资源相对集中。 | 庞大的Zephyr社区,拥有大量现成的传感器、通信协议驱动。 |
| 适用场景 | 学习RISC-V指令集、深入理解FE310硬件、极致性能或尺寸的单一功能项目。 | 物联网设备、多传感器数据采集、需要网络协议栈(如BLE, WiFi)的复杂应用。 |
个人建议 :如果你是嵌入式新手,想纯粹学习RISC-V,可以从Freedom Studio开始,亲手操作几个寄存器,理解中断配置,这对打基础非常有帮助。当你打算用RED-V做一个实际的项目,尤其是需要连接多个外设或联网时,毫不犹豫地切换到Zephyr。虽然起步麻烦点,但它会为你后续的开发铺平道路。
5.2 常见问题排查实录
Freedom Studio 常见问题:
-
程序无法上传,提示“Error with GDB server” :
- 检查 :是否在之前的调试会话后没有点击红色的“Terminate”按钮就尝试再次上传?先点击“Terminate”结束调试连接。
- 检查 :尝试拔插USB线,重新枚举板卡。有时J-Link连接状态会卡住。
- 检查 :在“Run Configurations...”中,确保“Debugger”标签页下使用的是“Segger J-Link”且接口是“JTAG”。
-
编译通过,但LED不闪烁或串口无输出 :
- 检查代码 :最可能的原因是GPIO操作序列错误或引脚号不对。务必确认使用了
disable_input->enable_output->disable_pinmux序列,并核对FE310的GPIO引脚号(参考官方原理图)。 - 检查硬件 :用万用表测量一下GPIO引脚在程序运行时的电压是否在高低电平间变化,排除代码问题。
- 检查代码 :最可能的原因是GPIO操作序列错误或引脚号不对。务必确认使用了
Zephyr RTOS 常见问题:
-
west build失败,提示找不到工具链或权限错误 :- 检查 :环境变量
ZEPHYR_TOOLCHAIN_VARIANT和ZEPHYR_SDK_INSTALL_DIR是否设置正确并已source ~/.bashrc。 - 检查 :整个
zephyrproject目录及其子目录的所有者是否是你的普通用户,而不是root。如果用了sudo初始化,请删除~/zephyrproject文件夹,用普通用户身份重新执行west init和west update。
- 检查 :环境变量
-
west flash失败,提示“No J-Link found”或“Cannot connect to target” :- 检查 :运行
lsusb,确认是否有Segger设备。如果没有,检查USB线、USB端口,或尝试在另一台电脑上测试。 - 检查 :你的用户是否有权限访问J-Link设备。通常需要将用户加入
dialout组:sudo usermod -a -G dialout $USER,然后 注销并重新登录 生效。 - 尝试 :在
west flash前,手动按一下板子的复位键,有时能唤醒调试接口。
- 检查 :运行
-
串口使用
screen连接后乱码或无法输入 :- 检查波特率 :确保是115200。
- 检查端口 :使用
dmesg | grep tty并在插拔板子前后对比,确认正确的/dev/ttyACMx设备。 - 退出screen :如果卡在screen会话中,按
Ctrl+A然后输入:quit强制退出所有会话。
5.3 进一步学习资源与项目思路
当你完成了基础入门后,可以探索以下方向来深化你的RED-V和RISC-V技能:
- 深入Freedom E SDK :仔细阅读 Freedom Metal库的官方文档 。这是你理解FE310所有外设(UART、SPI、I2C、PWM、定时器、中断控制器)的关键。尝试不用
printf,而是直接配置UART寄存器发送数据;或者用定时器中断实现一个精确的延时函数。 - 探索Zephyr更多功能 :Zephyr的精华在于其丰富的驱动和子系统。尝试在RED-V上:
- 连接一个I2C传感器(如BME280温湿度气压传感器),使用Zephyr的I2C驱动读取数据。
- 创建一个多线程应用,一个线程闪烁LED,另一个线程通过串口打印信息,体验Zephyr的线程调度。
- 启用Zephyr的Shell模块,实现通过串口命令行控制板载LED和读取GPIO状态。
- 参与社区与开源项目 :
- SparkFun官方Github :关注SparkFun的freedom-e-sdk分支,获取针对RED-V的最新板级支持包(BSP)和示例。
- Zephyr项目官方文档 :其文档质量极高,特别是API参考和移植指南。
- PlatformIO :虽然本文未涉及,但PlatformIO也对HiFive1/RED-V提供了实验性支持。如果你习惯VS Code,可以尝试配置PlatformIO环境进行开发,它能更好地管理第三方库。
RED-V是一扇通往RISC-V世界的大门,它既有适合学习的底层硬件接口,也有适合产品开发的现代RTOS支持。从点灯开始,逐步挑战更复杂的项目,你会发现这片开源指令集架构的生态正在以前所未有的速度变得丰富和强大。最关键的是动手去试,遇到问题就按上面的排查思路一步步解决,每一个踩过的坑都会让你对这套系统的理解更深一层。
2078

被折叠的 条评论
为什么被折叠?



