本帖最后由 小恶魔owo 于 2025-6-23 14:25 编辑

简介

Milk-V Duo是一个基于CV1800B芯片的超紧凑嵌入式开发平台。它可以运行Linux和RTOS,为专业人士、工业ODM、AIoT爱好者、DIY爱好者和创作者提供了一个可靠、低成本和高性能的平台。

40cf7226b3a91e87df9716229816b88.jpg image.png

image.png


官方文档

https://milkv.io/zh/docs/duo/overview


镜像文件

https://github.com/milkv-duo/duo-buildroot-sdk/releases/


准备工作(开发板)

(一)准备一张SD内存卡,需要大于1GB以上的,还得准备一个SD卡下载器

24d02aac1e3bf94aa0ea9c642d2f963.jpg


(二)在此下面的GitHub链接,下载镜像文件

https://github.com/milkv-duo/duo-buildroot-sdk/releases/

image.png


(三)下载SD卡烧录软件balenaEtcher

https://etcher.balena.io/

image.png


(四)烧录镜像

第一个框选择我们的img文件,第二个框选择SD卡,然后第三个框点击下载

image.png


(五)上电,过一会,蓝色LED灯闪烁,代表系统已经运行

d7ac240b144a11165066be89a33e2be.jpg


准备工作(电脑)

我们需要连接上开发板的系统,电脑需要下载一个MobaXterm

https://mobaxterm.mobatek.net/download.html

image.png


(一)选择session,SSH,192.168.42.1,root

image.png


(二)输入密码milkv

image.png


(三)连接成功

image.png



在给单片机准备好之后,需要在电脑装一个Ubuntu系统,官方推荐Ubuntu 22.04 LTS

(一)在电脑Microsoft Store中搜索Ubuntu 22.04 LTS,安装

image.png


(二)安装完之后,出现一个WSL图标,还有资源管理器,会出现LINUX的文件夹

image.png image.png


(三)下载

下载依赖文件

sudo apt-get install wget git make


获取示例源码

git clone https://github.com/milkv-duo/duo-examples.git


加载编译环境

cd duo-examples

source envsetup.sh


此时提示,我们选择1

Select Product:

1. Duo (CV1800B)

2. Duo256M (SG2002) or DuoS (SG2000)

image.png


(四)测试

打开hallo-world程序

image.png

cd hello-world

make



支持的 USB-NCM 方式,Duo 的 IP 为192.168.42.1,用户名是root,密码是milkv。

scp helloworld root@192.168.42.1:/root/

image.png

image.png


然后在LINUX单片机的软件,然后输入./helloworld,会打印Hello, World!

image.png



温湿度计项目

源码下载地址:https://mbb.eet-china.com/download/317207.html

然后将代码解压到,电脑LINUX文件夹随便一个位置

image.png


然后在电脑Linux上面打开代码所在的地方,ls显示当前目录的文件,cd打开下一个文件夹

image.png


然后输入make编译

如果显示如下,代表已经编译过了,无需再次编译

image.png


通过指令scp main root@192.168.42.1:/root/

将代码上传到Linux开发板

image.png


linux开发板查询,发现已经收到了main文件

image.png


因为项目用到0.96寸OLED,此屏幕用的是iic通信,所以我们需要将iic引脚设置

duo-pinmux -w GP5/IIC1_SDA

duo-pinmux -w GP4/IIC1_SCL

image.png


然后我们输入./main

程序自动运行

image.png


出现温湿度数据,以及屏幕显示温湿度,代表成功

image.png



代码

本项目完整代码https://mbb.eet-china.com/download/317207.html

#include <stdio.h>      // 新增:包含printf函数声明
  • #include <unistd.h>     // 新增:包含sleep函数声明
  • #include <stddef.h>     // 新增:包含NULL定义
  • #include "ssd1306_i2c.h"
  • #include "aht20.h"

  • // 新增:声明外部变量fd_i2c
  • extern int fd_i2c;
  • float humidity, temperature;
  • int ret;
  • int main() {
  •     int data = 0;
  •     int shu = 0;
  •   // 初始化AHT20
  •     ret = aht20_init();
  •     if (ret != 0) {
  •         printf("AHT20初始化失败,错误码: %d\n", ret);
  •         return -1;
  •     }
  •    
  •     printf("AHT20初始化成功\n");
  •     // Duo:     milkv_duo
  •     // Duo256M: milkv_duo256m
  •     // DuoS:    milkv_duos
  •     if(wiringXSetup("milkv_duo", NULL) == -1) {
  •         wiringXGC();
  •         return -1;
  •     }

  •     if ((fd_i2c = wiringXI2CSetup(I2C_DEV, IIC_SLAVE_ADDR)) <0) {
  •         printf("I2C Setup failed: %i\n", fd_i2c);
  •         return -1;
  •     }

  •     ssd1306_init();
  •     ssd1306_clear_full_screen(0);
  •     while(1){
  •     /*  
  •       shu++;
  •       sleep(1);
  •       ssd1306_push_int(0,0,shu,3,16);
  •       if(shu == 100)
  •       {
  •         shu = 0;
  •       }
  •         

  • */
  •    ret = aht20_read(&humidity, &temperature);
  •         if (ret == 0) {
  •             printf("湿度: %.2f%%, 温度: %.2f°C\n", humidity, temperature);
  •             ssd1306_push_string(0,0,"TEMP:",16);
  •             ssd1306_push_float(40,0,temperature,3,2,16);
  •             ssd1306_push_string(0,2,"HUM:",16);
  •             ssd1306_push_float(40,2,humidity,3,2,16);
  •         } else {
  •             printf("读取失败,错误码: %d\n", ret);
  •         }
  •         sleep(2);
  •         
  •     }
  • }
  • 复制代码