1. 开箱即用Milk-V Duo S开发板初体验拿到Milk-V Duo S开发板的第一印象是它的紧凑设计——这块搭载SG2000芯片的双核RISC-V开发板仅有信用卡大小却提供了丰富的接口资源。板载的40Pin GPIO排针让我立刻联想到树莓派的扩展接口这意味着大量现成的HAT模块可以直接复用。不过需要注意的是Duo S的GPIO电压分为3.3VJ3排针和1.8VJ4排针两组连接外设时要特别注意电平匹配问题。开发板背面贴有清晰的型号标签我拿到的是V1.2版本这个细节很重要——因为早期V1.1版本中J3排针的第9脚定义与后续版本不同。通电后板载的蓝色LED开始规律闪烁这是出厂固件自带的心跳指示。通过Type-C接口连接电脑后在设备管理器中可以看到新增的USB串行设备使用Putty等工具以115200波特率连接即可进入系统终端。2. 开发环境搭建全攻略2.1 基础工具链配置我选择在Ubuntu 22.04 LTS上搭建交叉编译环境这是官方推荐的主机系统。如果你使用Windows可以考虑WSL2或虚拟机方案。首先安装必备的基础工具sudo apt-get update sudo apt-get install -y wget git make cmake特别提醒cmake版本建议3.20以上低版本可能导致后续编译wiringX库时出现奇怪错误。可以通过cmake --version命令验证如果系统自带版本过低可以从官网下载最新版预编译包手动安装。2.2 获取官方示例代码Milk-V团队维护的duo-examples仓库是绝佳的学习资源git clone https://github.com/milkv-duo/duo-examples.git cd duo-examples这个仓库不仅包含各种外设驱动示例还贴心地内置了环境配置脚本。执行source envsetup.sh时会自动下载所需的交叉编译工具链约500MB存放在新创建的host-tools目录中。第一次运行时会提示选择开发板型号和架构Select Product: 1. Duo (CV1800B) 2. Duo256M (SG2002) or DuoS (SG2000)对于Duo S开发板需要选择选项2然后继续选择ARM64架构虽然SG2000也支持RISC-V但当前主流固件仍以ARM为主。重要提示加载过envsetup.sh的终端会话会配置特定的交叉编译环境变量不要在此终端中编译其他架构的项目。建议为Duo开发单独开一个终端窗口。3. 从Hello World开始验证环境3.1 编译第一个程序进入hello-world示例目录执行make命令cd hello-world make如果一切顺利会在当前目录生成helloworld可执行文件。这个简单的程序只做一件事——打印Hello, World!。但它的成功编译意味着工具链配置正确是后续开发的重要基础。3.2 部署与运行Duo S开发板默认通过USB虚拟网卡NCM提供网络连接IP固定为192.168.42.1。使用scp命令上传程序scp helloworld [email protected]:/root/然后通过串口或SSH登录开发板默认密码milkv执行chmod x helloworld ./helloworld当终端显示出Hello, World!时说明整个工具链从编译到部署的流程已经打通。这个简单的验证步骤看似基础却能排除90%的环境配置问题。4. GPIO控制实战点亮LED4.1 理解Duo S的GPIO编号与树莓派不同Duo S的wiringX引脚编号规则需要注意J3排针3.3V电平的GPIO编号与物理引脚号一致板载LED的wiringX编号为0V1.2硬件J4排针1.8V电平的GPIO建议仅用于专用功能如MIPI DSI查看blink示例代码可以看到控制LED的核心逻辑pinMode(DUO_LED_PIN, PINMODE_OUTPUT); digitalWrite(DUO_LED_PIN, HIGH); delayMicroseconds(500000); digitalWrite(DUO_LED_PIN, LOW);4.2 解决LED控制冲突默认固件会通过/mnt/system/blink.sh脚本控制LED闪烁这会与我们自己的程序产生冲突。上传blink程序前需要执行mv /mnt/system/blink.sh /mnt/system/blink.sh_backup sync reboot这个操作会禁用系统自带的LED控制脚本。测试完成后可以通过反向操作恢复原状。4.3 进阶GPIO操作wiringX库提供了丰富的GPIO控制功能包括中断检测// 配置上升沿中断 wiringXISR(PIN_NUM, ISR_MODE_RISING); // 中断处理函数 void interruptHandler(void) { printf(Interrupt detected on pin %d\n, PIN_NUM); }在实际项目中合理使用中断可以大幅降低CPU占用率。需要注意的是Duo S的GPIO中断支持有限建议先在文档中确认目标引脚的中断能力。5. 外设开发I2C与SPI实战5.1 I2C温度传感器驱动以BMP280气压传感器为例典型的I2C初始化流程int fd wiringXI2CSetup(/dev/i2c-1, 0x76); if(fd 0) { printf(I2C init failed\n); return -1; } // 读取校准参数 uint16_t dig_T1 wiringXI2CReadReg16(fd, 0x88);I2C通信中常见的坑点包括地址左移问题Duo使用7位地址字节序转换BMP280的数据是大端格式时钟速率限制默认100kHz5.2 SPI显示屏驱动对于SPI设备如ST7789显示屏初始化时需要特别注意模式设置int fd wiringXSPISetup(0, 500000); wiringXSPIDataRW(0, init_cmd, sizeof(init_cmd));SPI的四大关键参数时钟极性CPOL时钟相位CPHA数据位序MSB/LSB片选信号CS这些参数需要与设备手册严格匹配。遇到显示异常时建议先用逻辑分析仪抓取波形验证。6. 深度定制编译wiringX库虽然官方固件已经预装wiringX库但某些特殊需求可能需要自行编译git clone https://github.com/wiringX/wiringX.git cd wiringX mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE../toolchain.cmake .. make编译时需要特别注意工具链路径要正确指向riscv64-linux-musl-gcc添加-marchrv64imafdcv0p7xthead等架构参数解决time_t类型定义冲突需手动添加类型定义编译生成的libwiringx.so可以替换系统默认版本但建议先备份原文件。7. 项目进阶从示例到产品当熟悉基础外设操作后可以开始构建完整项目。建议的进阶路线使用多线程管理不同传感器pthread添加日志系统syslog或自定义实现配置热加载inotify监控配置文件加入看门狗机制硬件/软件看门狗优化电源管理动态调频、外设电源控制一个典型的工业级应用架构可能包含主线程状态监控与系统管理网络线程MQTT/HTTP通信采集线程传感器数据读取控制线程执行器驱动在Duo S上开发时要注意双核CPU的任务分配。虽然当前主流固件运行在ARM核上但未来RISC-V核的利用将提供更大灵活性。
Milk-V Duo S开发板入门与RISC-V开发实践
发布时间:2026/7/15 11:18:37
1. 开箱即用Milk-V Duo S开发板初体验拿到Milk-V Duo S开发板的第一印象是它的紧凑设计——这块搭载SG2000芯片的双核RISC-V开发板仅有信用卡大小却提供了丰富的接口资源。板载的40Pin GPIO排针让我立刻联想到树莓派的扩展接口这意味着大量现成的HAT模块可以直接复用。不过需要注意的是Duo S的GPIO电压分为3.3VJ3排针和1.8VJ4排针两组连接外设时要特别注意电平匹配问题。开发板背面贴有清晰的型号标签我拿到的是V1.2版本这个细节很重要——因为早期V1.1版本中J3排针的第9脚定义与后续版本不同。通电后板载的蓝色LED开始规律闪烁这是出厂固件自带的心跳指示。通过Type-C接口连接电脑后在设备管理器中可以看到新增的USB串行设备使用Putty等工具以115200波特率连接即可进入系统终端。2. 开发环境搭建全攻略2.1 基础工具链配置我选择在Ubuntu 22.04 LTS上搭建交叉编译环境这是官方推荐的主机系统。如果你使用Windows可以考虑WSL2或虚拟机方案。首先安装必备的基础工具sudo apt-get update sudo apt-get install -y wget git make cmake特别提醒cmake版本建议3.20以上低版本可能导致后续编译wiringX库时出现奇怪错误。可以通过cmake --version命令验证如果系统自带版本过低可以从官网下载最新版预编译包手动安装。2.2 获取官方示例代码Milk-V团队维护的duo-examples仓库是绝佳的学习资源git clone https://github.com/milkv-duo/duo-examples.git cd duo-examples这个仓库不仅包含各种外设驱动示例还贴心地内置了环境配置脚本。执行source envsetup.sh时会自动下载所需的交叉编译工具链约500MB存放在新创建的host-tools目录中。第一次运行时会提示选择开发板型号和架构Select Product: 1. Duo (CV1800B) 2. Duo256M (SG2002) or DuoS (SG2000)对于Duo S开发板需要选择选项2然后继续选择ARM64架构虽然SG2000也支持RISC-V但当前主流固件仍以ARM为主。重要提示加载过envsetup.sh的终端会话会配置特定的交叉编译环境变量不要在此终端中编译其他架构的项目。建议为Duo开发单独开一个终端窗口。3. 从Hello World开始验证环境3.1 编译第一个程序进入hello-world示例目录执行make命令cd hello-world make如果一切顺利会在当前目录生成helloworld可执行文件。这个简单的程序只做一件事——打印Hello, World!。但它的成功编译意味着工具链配置正确是后续开发的重要基础。3.2 部署与运行Duo S开发板默认通过USB虚拟网卡NCM提供网络连接IP固定为192.168.42.1。使用scp命令上传程序scp helloworld [email protected]:/root/然后通过串口或SSH登录开发板默认密码milkv执行chmod x helloworld ./helloworld当终端显示出Hello, World!时说明整个工具链从编译到部署的流程已经打通。这个简单的验证步骤看似基础却能排除90%的环境配置问题。4. GPIO控制实战点亮LED4.1 理解Duo S的GPIO编号与树莓派不同Duo S的wiringX引脚编号规则需要注意J3排针3.3V电平的GPIO编号与物理引脚号一致板载LED的wiringX编号为0V1.2硬件J4排针1.8V电平的GPIO建议仅用于专用功能如MIPI DSI查看blink示例代码可以看到控制LED的核心逻辑pinMode(DUO_LED_PIN, PINMODE_OUTPUT); digitalWrite(DUO_LED_PIN, HIGH); delayMicroseconds(500000); digitalWrite(DUO_LED_PIN, LOW);4.2 解决LED控制冲突默认固件会通过/mnt/system/blink.sh脚本控制LED闪烁这会与我们自己的程序产生冲突。上传blink程序前需要执行mv /mnt/system/blink.sh /mnt/system/blink.sh_backup sync reboot这个操作会禁用系统自带的LED控制脚本。测试完成后可以通过反向操作恢复原状。4.3 进阶GPIO操作wiringX库提供了丰富的GPIO控制功能包括中断检测// 配置上升沿中断 wiringXISR(PIN_NUM, ISR_MODE_RISING); // 中断处理函数 void interruptHandler(void) { printf(Interrupt detected on pin %d\n, PIN_NUM); }在实际项目中合理使用中断可以大幅降低CPU占用率。需要注意的是Duo S的GPIO中断支持有限建议先在文档中确认目标引脚的中断能力。5. 外设开发I2C与SPI实战5.1 I2C温度传感器驱动以BMP280气压传感器为例典型的I2C初始化流程int fd wiringXI2CSetup(/dev/i2c-1, 0x76); if(fd 0) { printf(I2C init failed\n); return -1; } // 读取校准参数 uint16_t dig_T1 wiringXI2CReadReg16(fd, 0x88);I2C通信中常见的坑点包括地址左移问题Duo使用7位地址字节序转换BMP280的数据是大端格式时钟速率限制默认100kHz5.2 SPI显示屏驱动对于SPI设备如ST7789显示屏初始化时需要特别注意模式设置int fd wiringXSPISetup(0, 500000); wiringXSPIDataRW(0, init_cmd, sizeof(init_cmd));SPI的四大关键参数时钟极性CPOL时钟相位CPHA数据位序MSB/LSB片选信号CS这些参数需要与设备手册严格匹配。遇到显示异常时建议先用逻辑分析仪抓取波形验证。6. 深度定制编译wiringX库虽然官方固件已经预装wiringX库但某些特殊需求可能需要自行编译git clone https://github.com/wiringX/wiringX.git cd wiringX mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE../toolchain.cmake .. make编译时需要特别注意工具链路径要正确指向riscv64-linux-musl-gcc添加-marchrv64imafdcv0p7xthead等架构参数解决time_t类型定义冲突需手动添加类型定义编译生成的libwiringx.so可以替换系统默认版本但建议先备份原文件。7. 项目进阶从示例到产品当熟悉基础外设操作后可以开始构建完整项目。建议的进阶路线使用多线程管理不同传感器pthread添加日志系统syslog或自定义实现配置热加载inotify监控配置文件加入看门狗机制硬件/软件看门狗优化电源管理动态调频、外设电源控制一个典型的工业级应用架构可能包含主线程状态监控与系统管理网络线程MQTT/HTTP通信采集线程传感器数据读取控制线程执行器驱动在Duo S上开发时要注意双核CPU的任务分配。虽然当前主流固件运行在ARM核上但未来RISC-V核的利用将提供更大灵活性。