☰
鸿蒙Hi3861开发板实战:从环境搭建到LED点灯全流程
2026/10/17 5:55:49 网站建设 项目流程

一直有朋友问我:鸿蒙Harmony OS开发是不是非得有手机或者平板才能玩。其实不是,我很早就建议他们从Hi3861开发板入手。这块开发板价格不高,芯片自带Wi-Fi,外设不多,但把鸿蒙轻量系统的源码编译、固件烧录、串口调试、应用开发这整套流程都覆盖到了。这篇文章就是我实际跑通一个完整Demo的方法整理,给打算上手Hi3861的朋友一个尽量少绕弯的参考。无论你是从单片机切过来的老手,还是刚接触鸿蒙生态的新人,只要照着这个流程把环境搭好、把第一个程序烧进去,后面再深入就不会发怵。

1. 为什么是Hi3861:从芯片定位到学习价值

1.1 这颗芯片的硬件底子

Hi3861是一款高集成度的Wi-Fi SoC芯片,核心是32位RISC-V处理器,主频在100MHz以上,内部带SRAM和Flash。它最大的特点是射频、基带、协议栈都集成在一颗芯片里,外围只需要天线、晶振、电源管理电路,就能组成一个最小的物联网节点。也就是说,你不需要像做传统MCU方案那样外挂一个Wi-Fi模块,一颗芯片就能跑系统、跑协议栈、控制外设。

在接口方面,它提供了GPIO、UART、I2C、SPI、ADC、PWM等常见外设。数量不算丰富,但对智能家居里的传感器采集、状态上报、继电器控制这类场景来说,基本够用。很多刚开始学鸿蒙的人会被“芯片资源少”劝退,我倒觉得这正是优点:资源少意味着逻辑简单,你能把精力放在理解鸿蒙系统本身的机制上,而不是花大量时间调一个复杂外设的时序。

1.2 学的是“鸿蒙的系统观”,不只是一次点灯

在Hi3861上做开发,和普通单片机开发有本质区别。单片机开发通常是你写一个main函数,然后调用厂家的库函数;但在Hi3861上,你写的业务代码会和系统组件一起参与编译,最后生成一个包含内核、驱动、协议栈、应用的整体固件。这个过程会让你真正理解:一个嵌入式操作系统的镜像源码树是怎么组织的,BUILD.gn这种构建脚本在工程里起什么作用,应用是怎么被系统启动的。

所以我的建议是,不要把它当成“一块有钱的Wi-Fi开发板”来玩。你不是在学Hi3861的寄存器操作,而是在学“鸿蒙轻量系统上怎么组织一个可维护的IoT应用”。这套观念一旦建立,以后换其他芯片、换更高性能的平台,你会发现知识是能迁移的。

1.3 和其他开发板怎么取舍

很多朋友会拿Hi3861和市面上常见的Wi-Fi开发板对比。说实话,论教程数量、社区资料,Hi3861不一定占优,但它的价值不在“性能强”,而在“贴近鸿蒙生态”。用一个简单表格来定位:

板卡类型主要学习方向入门门槛适合场景
手机/平板类设备应用层UI、分布式能力较高鸿蒙应用开发
高性能多功能开发板复杂外设、Linux驱动较高系统底层、音视频
Hi3861这类轻量开发板芯片级编译、烧录、IoT联网较低物联网节点、传感器

如果你本身就是做应用开发的,想去了解芯片侧是怎么想的,或者你本来就是做单片机的,想看看鸿蒙在里面是怎么运行的,那Hi3861就是合适的切入点。它让你用比较低的成本跑通“硬件-系统-应用”的完整链路,而不是停留在模拟器里复制代码。

2. 环境搭建:提前排掉三个容易反复的坑

鸿蒙轻量系统的编译链路比很多人想象中要敏感,经常出现“代码明明是对的,但编译不过”的情况。我自己第一次搭环境时,在工具链版本、Python环境和串口驱动这三个地方来回折腾了很长时间,所以单独列一节,把该注意的问题说透。

2.1 工具链版本和源码版本必须“咬合”

Hi3861使用的RISC-V编译工具链不是越新越好。鸿蒙轻量系统源码通常会对编译器版本、链接器版本有隐性要求,你用了一个新版的通用工具链,很可能编译到一半就报非法指令或者链接失败。我一开始就犯过这个错,下载了当时最新版的RISC-V工具链,结果编到内核里某个汇编文件时报错,检查半天发现是编译器的汇编语法和源码不匹配。

正确做法是:先确定你拉取的源码版本,再找官方文档里那个版本对应的工具链和构建工具组合。不要自己混搭。如果你不想研究版本矩阵,就直接选择官方推荐的“一键安装环境”方式,把编译器、Python依赖、命令行工具全部交给安装脚本处理。这样虽然看起来少了几分动手的乐趣,但能把环境层面的变量降到最低。

2.2 Python环境和构建命令的坑

编译脚本依赖Python以及一堆第三方库,而且对版本有要求。如果电脑里同时存在多个Python版本,很容易装错依赖。我第二次踩坑就是在这里:明明按文档装了所有的包,构建工具却提示找不到某个模块,原因是我在系统全局环境里执行了安装命令,而编译脚本运行时使用的是另一个Python解释器。

建议从一开始就建一个独立的Python虚拟环境,后续安装依赖、运行构建命令都在这个虚拟环境里操作。把虚拟环境的bin目录加到PATH前面,再写进shell配置文件,确保每次打开终端用的是同一套Python。构建命令找不到是高频问题,常见原因就是它被安装到了某个局部目录,而当前会话的PATH里没有包含该目录。这类问题排查起来并不难,但会消耗大量耐心。

2.3 串口驱动与板卡的下载模式

烧录环节最常见的现象是:设备管理器里看不到串口,或者烧录工具一直提示连接超时。前者通常是USB转串口驱动没装好,后者则很可能是开发板没有进入下载模式。

Hi3861开发板的下载模式一般需要按住某个功能键再复位的组合操作。不同板子的按键位置不一样,但原理一致:让芯片启动时不进入正常系统,而是停留在Bootloader下载状态。很多新手烧录失败,不是线接错了,而是没有真正把板子按进下载模式。建议烧录前先查阅对应板卡的手册,搞清楚哪个是复位键、哪个是下载模式键,不要一上来就狂点烧录按钮。

3. 从源码到固件:编译链路与烧录实操

环境准备好之后,就可以走一遍完整的“源码-编译-产物-烧录”流程。这一步对整个开发周期至关重要,因为后面的所有代码修改都要通过这条链路落到板子上。

3.1 拉取源码并安装构建工具

在干净的目录里拉取鸿蒙轻量系统源码。拿到源码后,先不要急着写代码,第一件事是安装源码自带的构建工具。鸿蒙的构建体系里有几个命令行工具负责管理组件和构建流程,它们会通过一个初始化脚本装到本地。

# 进入源码根目录后,先执行环境初始化 python3 build/lite/init.py # 确认命令行工具可用 hb --version

这一步可能会联网下载依赖,日志量很大。我习惯把日志同时输出到文件里,这样万一中间失败,可以回头查找具体是哪个组件出了问题,而不是在滚动条刷过去的终端里翻找。第一次跑这个初始化脚本要耐心,网络情况不同耗时差异很大,不要中途Ctrl+C。

3.2 用“菜单式”配置选择Hi3861目标

鸿蒙轻量系统的编译方式有点像一套菜单化流程:先选择产品,再选择目标,最后统一编译。对应的命令行是hb set,运行之后会出现产品列表,选择Hi3861对应的配置项。

cd <源码根目录> hb set # 在交互菜单中选择 Hi3861 产品配置 hb build

第一次编译时间会很长,因为要把内核、驱动、协议栈、公共库全部编译一遍。期间终端会有大量输出,建议不要做其他高负载操作,也不要频繁按键,否则可能误触交互界面导致编译中断。编译完成后,固件会出现在out目录下,一般会生成带allinone字样的文件,这个文件包含了Bootloader和应用程序,烧录时优先选它。

3.3 烧录固件的完整流程

烧录前先确认三件事:串口驱动已经识别、开发板电源正常、板子处于下载模式。官方IDE设备工具的操作界面虽然各有区别,但逻辑是固定的:选择串口、选择固件、开始烧录。

建议的烧录顺序是:

  1. 用数据线连接开发板和电脑,打开设备工具。
  2. 选择识别到的串口号,加载包含allinone的固件文件。
  3. 按住板子的下载模式键,短按复位键松开,等待工具握手。
  4. 点击烧录按钮,观察进度条直到提示完成。
  5. 松开所有按键,按一下复位,让板子正常启动。

有一点需要特别注意:烧录过程中不要断电,不要随意拔USB线。如果烧录到一半中断,轻则重新再来,重则可能让Bootloader状态混乱。另外,劣质USB数据线会导致供电不稳,串口频繁掉线,强烈建议选一根品控好一点的线,能省掉很多玄学问题。

4. 第一个鸿蒙应用:把板载LED点亮

编译和烧录流程跑通之后,就可以进入真正有成就感的部分:写业务代码。点灯是一个最直观、最容易验证的Demo,但它背后涉及鸿蒙应用的组织方式、GPIO的配置流程,值得认真看一遍。

4.1 业务代码应该放在哪里

在鸿蒙轻量系统源码树里,业务代码不会直接丢在内核或驱动目录下,而是放在应用层目录,由构建脚本组织。很多新手拿到源码后到处找main函数,其实鸿蒙轻量系统并不要求你写一个传统意义的main,业务入口往往通过系统初始化宏注入。

参考官方工程的结构,你会在应用层目录下看到不同功能的子目录。新写一个业务时,建议仿照现有示例,创建自己的业务文件夹,并在里面写好源文件和BUILD.gn。一个大致的目录结构是这样的:

app/ └── my_led/ ├── BUILD.gn └── led_demo.c

BUILD.gn是这个文件夹的构建描述文件,告诉编译系统有哪些源文件、依赖哪些静态库。新手最容易犯的错是:代码写对了,但BUILD.gn里没有加入这个源文件,结果编出来的固件根本没有包含你的代码。

4.2 操作GPIO的三步配置思路

在鸿蒙的IoT接口下,控制一个引脚输出高低电平,逻辑上分三步。第一步初始化和使能这个GPIO;第二步设置引脚复用为GPIO模式;第三步把GPIO方向设为输出,然后写电平。

引脚复用这个步骤容易被单片机用户忽略,因为很多单片机引脚的默认功能就是GPIO。但Hi3861这类高集成度芯片不是这样,同一个引脚可能同时连接UART、PWM、GPIO等多条内部通路,必须显式地把它切到GPIO功能上,后面写电平才会真正体现在引脚上。

把这三步想明白,接传感器、控制继电器、读按键都是同一个套路:先初始化,再配置功能,最后读写数据。所以不要把这个Demo当成死记代码,而是理解背后的配置流程。

4.3 一个可以直接编译的示例代码

下面是一个简单的LED闪烁Demo。它定义了一个任务函数,在系统启动时通过SYS_RUN宏注入到初始化流程,然后在循环里交替输出高低电平。

#include <stdio.h> #include <unistd.h> #include "ohos_init.h" #include "iot_gpio.h" #include "iot_gpio_ex.h" static void LedDemoTask(void) { IoTGpioInit(IOT_IO_NAME_GPIO2); IoSetFunc(IOT_IO_NAME_GPIO2, IOT_IO_FUNC_GPIO_2_GPIO); IoTGpioSetDir(IOT_IO_NAME_GPIO2, IOT_GPIO_DIR_OUT); while (1) { IoTGpioSetOutputVal(IOT_IO_NAME_GPIO2, 1); sleep(1); IoTGpioSetOutputVal(IOT_IO_NAME_GPIO2, 0); sleep(1); } } SYS_RUN(LedDemoTask);

SYS_RUN是鸿蒙里用于注册启动任务的关键宏,系统初始化时会自动执行被它包裹的函数。这比传统单片机里自己写main函数省心,但同时要求你的任务函数不能长时间阻塞,否则会影响系统其他初始化流程。在这个例子里,sleep只是间隔延时,不会卡住内核调度,算是安全的写法。

4.4 编译验证与板级差异

代码写好后,重新执行hb build编出固件,烧录进去,如果看到板载LED每隔一秒闪烁一次,就说明你的第一个鸿蒙应用已经成功跑起来了。要注意的是,不同厂商的Hi3861开发板,板载LED连接的GPIO脚不一定相同。我用的板子是GPIO2,你的板子可能是GPIO3或者别的引脚,烧录后灯不亮时先查对应开发板的原理图,不要盲目改代码。

5. 实际调试中我遇到的高频问题

开发板调试和纯软件调试不一样,你面对的是串口、硬件接线、固件版本等多个变量的叠加。这里整理几个我实际遇到、且在新手群里出现频率很高的问题,给大家一个排查思路。

5.1 串口日志是排错的第一入口

无论代码写得怎么样,先学会看串口日志。用USB转串口连接开发板后,终端软件里设置好波特率,复位开发板,应该能看到内核启动、系统组件加载、任务注册这一系列日志。这些信息能告诉你系统到底有没有跑起来、代码有没有被执行。

日志完全没输出时,优先检查三件事:串口号是否选对、波特率是否和固件匹配、RX/TX接线是否交叉。尤其是RX/TX交叉,新手经常接成直连,导致收不到任何数据。乱码则是波特率不匹配的典型表现,换到正确的波特率后立刻恢复正常。

5.2 几个高频报错的定位思路

下面这张表格汇总了我在教学和实践中遇到的典型问题,方便大家对照定位:

现象可能原因排查方法
编译中断,提示缺少Python包没在虚拟环境里编译切换并激活正确的虚拟环境
编译成功但产物文件很小应用目录没有被纳入构建检查BUILD.gn路径和依赖描述
烧录卡在握手阶段板子没有进入下载模式按住下载键再复位
烧录显示成功但串口无日志烧完没有按复位键复位开发板,重新观察日志
LED不亮但任务日志正常GPIO引脚号与板级不符对照原理图确认引脚

这些问题单看都不复杂,难的是当你同时面对多个现象时,容易乱了阵脚。建议每次只改一个变量,改完烧一版验证,不要同时改代码、换串口、换波特率,那样出了问题都不知道是哪一个动作引起的。

5.3 一个完整的“烧录成功但无输出”排查示例

有一次我编译通过、烧录显示成功,但复位后串口没有任何打印。当时我没有马上怀疑固件,而是按下面这条链路一步步排查,问题最终只花了几分钟就定位了。

先检查串口设置:重新拔插USB线,确认设备管理器分配的串口号没有变化,终端软件里选对端口并复位板子,仍然无输出。然后检查板子供电:手摸芯片微热,电源指示灯正常,排除电源问题。接着用官方工具重新加载固件,确认Flash里确实有内容,发现Bootloader区域也没有异常。最后一步,我把烧录线重新插拔,换了一个USB口,再复位开发板,日志立刻出现了。

排查到这里才明白,是之前的USB口接触不良导致串口信号没有稳定建立,和代码、固件完全无关。这个经历给我的启发是:硬件调试不要一上来就怀疑代码,先用最笨的方法确认每一环物理连接都可靠,往往最快。

6. 把这套流程用到真实项目里

跑通点灯Demo后,Hi3861的学习就算真正开始了。接下来可以沿着几个方向把项目越做越完整,这些方向都是智能家居、环境监测、远程控制里非常常见的需求。

6.1 连接Wi-Fi并上报数据

Hi3861自带Wi-Fi能力,这是它比纯MCU开发板更适合做物联网原型的原因。在鸿蒙轻量系统中,可以调用WiFi相关的接口连接热点,然后通过Socket或者HTTP请求把自己的数据发送到服务器。做这一步时,建议先用串口把连接状态打印出来,确认热点名称、密码、IP获取都正常,再写上层业务逻辑。

我用这个能力做过一个温湿度上报的模拟项目:传感器采集数值,开发板每一分钟上报一次,服务端存入数据库。代码本身不复杂,核心是“连接Wi-Fi”和“发起请求”两个步骤,但却是从Demo走到真实产品形态的关键一步。

6.2 与手机App联动控制的思路

要想让设备不是“只会发数据”,还能“接收指令”,最常见的方式是走消息中间件。开发板作为一个发布订阅客户端,App作为另一个端点,通过中间服务转发消息。比如App发一条“打开开关”的消息,开发板收到后执行GPIO输出,控制灯或继电器动作。

这类架构的实际价值是,它把硬件控制、网络通信、应用交互整合到了一套完整的系统里。Hi3861在这种场景下承担的是可靠执行端的角色,而你真正学到的是怎么设计一条“指令从手机到芯片引脚”的完整链路,这比单独写App或单独点灯要更有意思。

6.3 低功耗与传感器扩展

如果是做电池供电的设备,低功耗是绕不开的话题。Hi3861的芯片支持空闲时进入低功耗状态,在需要时唤醒采集数据。代码上通常要配置睡眠唤醒源、唤醒周期,并在采集完成后重新进入睡眠。这部分已经不只是一个简单的GPIO操作,而是对系统电源管理机制的应用。

传感器扩展方面,最常用的是I2C接口,很多温湿度、气压、光照传感器都是I2C接口。代码套路依然是“初始化-配置-读取”,只是从操作GPIO电平变成了读写寄存器。把点灯Demo里的配置思维平移过来,传感器驱动并没有那么神秘。

如果只让我留一条经验,我会说:第一次接触Hi3861,别贪多。先把环境固定住,把同一个点灯固件烧通三次,再开始改业务代码。每次烧录之前把串口日志保存成文本,出问题时你会感谢自己这个习惯。我自己后来很多棘手的硬件问题,都是靠翻这些看似无聊的日志找到线索的。这套方法,比换十块开发板都有用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询