☰
鸿蒙开发新手入门:Hi3861开发板从环境搭建到联网实战
2026/10/17 9:59:02 网站建设 项目流程

很多人第一次接触鸿蒙开发,第一反应是被“鸿蒙Harmony OS”这个名头唬住,觉得没有应用开发经验就碰不得。但其实鸿蒙生态里最适合新人起步的,恰恰是嵌入式这个方向,而Hi3861开发板则是这个方向上绕不开的一站。这篇文章我想认真讲讲,拿到一块Hi3861开发板之后,从零开始做鸿蒙开发,整套方法应该怎么学、怎么做。

Hi3861是一颗低功耗WiFi SoC芯片,主核心虽然小巧,但跑起了鸿蒙的轻量级系统,可以做智能家居节点、传感器采集、WiFi配网这类物联网场景。我见过太多人卡在同一个地方:不是代码写不出来,而是不知道编译产物怎么生成、怎么烧进去、怎么看日志。这篇内容适合两类人看,一是想用鸿蒙系统做真实产品预研的工程师,二是刚入嵌入式、想找一个具体硬件边做边学的开发新手。我尽量把环境搭建、编译、烧录、调试这一整条链路讲透,顺便把那些进文档里查不到、只有实际操作才会遇到的坑一并说了。

1. 整体设计与思路拆解:为什么Hi3861适合拿来学鸿蒙

1.1 选型背后的逻辑

先说说我为什么在众多开发板里挑Hi3861来讲。市面上能跑鸿蒙系统或者OpenHarmony的开发板其实不少,有的板子主芯片性能更强,外设也更丰富,但对于第一次接触的人来说,那些强性能反而变成了干扰项。Hi3861的特点很朴素:芯片高度集成,板子上一颗WiFi SoC加必要的外围电路就构成了完整的最小系统,价格也压到了百元级别。这意味着你买一块板子回来,即使不小心烧坏了,也不至于太心疼。

更关键的是这颗芯片的定位。它是一颗WiFi SoC,芯片内部直接集成了2.4GHz的射频收发、基带处理和协议栈,你不需要外挂一颗WiFi模块就能让设备联网。这种“芯片本身就是为了IoT联网而生”的设计,决定了你的学习路径非常聚焦:从点灯到联网,中间不会隔着一层难以逾越的硬件障碍。

从系统层面看,Hi3861跑的是鸿蒙的轻量级内核,基于LiteOS架构改造而来,资源占用小、启动速度快,非常契合MCU级别的设备。这和手机、平板上的那个鸿蒙完全是两个技术栈,却同属于一个大生态。学这块板子,你等于站在了物联网端侧开发的入口。

1.2 它和传统单片机开发有什么本质区别

我个人体会最深的一点是,从STM32或51单片机转过来的人,容易带着旧思维写鸿蒙代码,然后到处碰壁。传统单片机开发的核心是寄存器操作和HAL库,你拿到的是一颗裸片,一切轮子都要自己造,主循环是唯一的骨架,所有业务逻辑都在一个while循环里转。

鸿蒙的轻量系统则引入了组件化、事件驱动的设计。代码不是从上往下顺序执行的,而是通过任务的创建、消息的收发、事件的回调来组织逻辑。比如你点一盏灯,传统思维是拉高GPIO电平就行,但在鸿蒙里你要考虑GPIO对应的外设模型、你要在哪里注册任务、任务之间怎么通信。这不是故意把简单的事情复杂化,而是为了以后设备接入更大的分布式系统时,代码结构能平滑演进。

编译体系的变化更需要适应。以前Keil、IAR点一下按钮就出固件,鸿蒙这边用的是开源工具链加编译构建脚本,整个源码工程非常大,动辄几个GB,由几十个代码仓组成。你要学会在这么大的工程里找到自己的代码该放哪里,理解构建配置怎么写。这个过程确实有学习成本,但一旦跨过去,你对“代码怎么变成固件”这件事的理解会超过很多写了好几年单片机的人。

1.3 学习路线的总体规划

我的建议是不要一上来就啃源码。拿到板子和资料后,按这条路线推进:第一步,把编译环境搭好,用模板工程编出一个固件。第二步,用工具把固件烧进板子,串口能看到系统启动日志,到这一步,工具链就通了。第三步,在工程里新建自己的业务目录,写最简单的Hello World,用鸿蒙的任务接口让它跑起来。第四步,玩转外设,GPIO点灯、按键输入、I2C读传感器。第五步,也是最核心的,连接WiFi,让板子联网上报数据。

这条路线的设计原理是每走一步都建立在前面已验证的基础上。很多人失败是因为环境的坑和代码的坑混在一起,出了问题根本不知道是工具链的问题还是自己代码的问题。拆成小步走,每一次只引入一个新变量,排查起来非常快。我自己带人入门时,最反感的就是那种“先把所有环境准备好,再讲原理,最后跑一个大项目”的教法,战线拉得太长,前面讲的全忘了。

2. 编译环境准备:最容易劝退新手的一关

2.1 环境规划和版本选择

鸿蒙轻量系统的编译官方推荐用Ubuntu环境,这个建议你最好听进去。虽然也有针对Windows的兼容方案,但我在实际折腾中的体会是,Windows上出问题的概率明显更高,很多报错信息在社区里搜到的解法都默认你在Linux下。所以第一步,老老实实准备一台Ubuntu机器,版本建议20.04,64位系统,内存至少8GB,我实测16GB运行起来非常流畅,硬盘预留60GB左右。

有条件的话,用一台独立的物理机安装双系统体验最好。虚拟机也可以,VMware或者VirtualBox都行,注意给虚拟机分配足够的内存和CPU核心。我最早是在虚拟机里做的,后来的项目包越来越大,磁盘开始吃紧,这才切到双系统。如果你只是学习验证,虚拟机完全够用,重点是养成顺手做快照的习惯,几十块钱的投入能省下一整周的折腾时间。

装完系统后,先检查基础依赖。Ubuntu需要安装一系列开发和编译工具,包括Python环境、代码托管工具repo等。有个容易忽略的细节:系统默认的Python版本和构建脚本要求的版本可能不匹配,建议提前确认好,避免编译到一半报语法错误。我的习惯是单独维护一个Python版本,不要动系统自带的那个,否则后面装什么工具都可能踩到依赖冲突。

2.2 源码获取的实操细节

Hi3861不能像单片机那样直接下载一个SDK包就开发,它需要拉取整个鸿蒙轻量系统的源码工程。这里说的拉取,是通过repo工具管理的,源码由很多个代码仓组成,它们之间各自有版本依赖,repo帮你在正确的版本组合下统一拉取。你自己手工去各个仓下载再拼起来,不仅容易版本错位,而且时间成本极高。

下载之前有一件事必须先做:安装repo工具本身,并且配置好它的路径。按照官方文档一步步来就行,这里不重复命令了,但我想强调一个实际体验:整个源码工程体积较大,网络情况直接影响拉取成功率。我自己遇到比较多的问题是拉到一半超时,然后整个目录状态变得很奇怪,重新拉又觉得浪费时间。成熟的解决办法是分段拉取,或者选择网络较为空闲的时段操作。

源码就位后,不要急着编译。先按文档把hb工具链配置好,hb是鸿蒙轻量系统的统一编译入口工具,类似一个构建命令的封装。配置完成后,不用记住一串复杂的gn和ninja命令,基本上就靠hb一个命令走天下。我第一次配置的时候没按文档顺序来,先跑了编译才配置hb,结果报错提示找不到命令,排查了半天才发现是环境变量没有生效,重新执行一遍配置脚本就好了。

提示:环境搭建阶段的一切异常都值得记录下来。很多人觉得报错信息太专业看不懂,其实错误码和报错文件路径就是最直接的线索。我后来排查问题时的习惯是,先把报错全文截图存档,再开始查原因,这个习惯帮我避免了很多重复劳动。

3. 从编译到烧录,把第一个程序跑起来

3.1 新建业务代码的目录结构和GN脚本

源码工程拉到本地后,目录非常庞大,第一眼会让人发懵。不要慌,你只需要关心一个核心区域:业务代码的存放目录。鸿蒙轻量系统的应用示例通常放在固定的示例目录下,系统在编译时会把指定目录里的所有子模块都编进去。

我在工程里新建了一个名为hello的目录,这个目录就是我要放第一个程序的地方。目录里有两类文件,一类是C源文件,一类是构建脚本。C源文件没什么特殊,就是普通的C语言写法,但入口不再像单片机那样是main函数,而是通过鸿蒙的系统接口来注册一个任务:

#include <stdio.h> #include "ohos_init.h" static void HelloTask(void) { printf("hello harmony, this is my first task.\n"); } SYS_RUN(HelloTask);

其中SYS_RUN是鸿蒙系统提供的内核初始化宏,功能是告诉系统在启动阶段执行这个函数。你可以理解成在系统主流程里挂了一个需要早起的钩子,任务被系统调度后就打印一行日志出来。

配套的GN构建脚本才是这里面的技术含量所在,GN就是鸿蒙使用的构建描述语言,它的作用是把C代码编译成静态库,然后告诉系统这个模块需要被链接进固件里:

static_library("hello") { sources = [ "hello.c" ] include_dirs = [ "//utils/native/lite/include" ] }

include_dirs里的路径表示编译器去哪里找头文件,我第一次写时记不清路径就随意填了一个相对路径,编出来的报错直接说找不到头文件,后来才明白在这种大型工程里,路径的写法有严格的约定,最稳妥的办法是参考同一目录下已有的示例文件,复制过来改。

3.2 编译与烧录的标准流程

代码和构建脚本准备好后,回到源码根目录,先用hb set命令选择目标平台,Hi3861对应的产品名称在列表中显示为wifiiot。这一步本质是告诉构建系统,你要为哪块板子、哪个芯片出固件。初始环境下第一次执行hb set可能会有提示,按说明完成配置即可。

接着执行hb build,我会在命令后加上-j参数来开启多线程编译,例如-j16,显著缩短编译时间。整个编译过程中,日志会刷得非常快,中间可能有一些warning,第一次编的话不用管它们,只要最终没有error就行。

编译成功后会生成固件产物,一系列文件里后缀为.bin的那些就是烧录要用的。固件不是只有一个文件,不同的文件对应不同的分区,比如内核、根文件系统、业务固件,它们会被分别烧到芯片Flash对应的地址区域。

烧录工具我推荐用官方提供的图形化工具,界面直观,通过串口连接开发板,选择对应固件文件和烧录地址,点击烧录即可。有一步非常关键却容易被忽略:绝大多数Hi3861开发板上电时默认不会进入烧录模式,需要手动操作板子上的功能按键组合来触发。通常的做法是按住下载模式按键不放,然后按一下复位键,这时板子才会进入等待烧录的引导状态。我见过有人反复点烧录都没反应,在社区求助后才发现只是没有按住按键,这种问题纯属流程不熟,没有任何技术门槛。

烧录过程中板子不能断电,串口线必须连接可靠。有些劣质USB转串口线供电不稳,烧到一半掉线,导致固件残缺,板子变砖的案例比比皆是。我后来买线都会挑带屏蔽的,虽然贵一点,但稳定性的提升值回票价。

3.3 串口日志的查看方法

烧录完成之后,板子自动重启运行新固件,需要通过串口工具查看系统输出。串口的波特率是固定的,文档里会写明,不要填错。我用的是常用的串口助手,选择正确的串口号,打开串口后复位一下板子,就能看到系统启动的日志刷刷刷地往下滚。

在新固件第一次跑起来之前,建议把串口工具的输出清空一下,这样方便观察日志从哪里开始。我实际遇到的第一个产品级问题就出在这里:板子跑起来了,但预期打印的hello字符串迟迟没出现。后来排查定位到是我的任务没有被正确调度,打印放在了初始化宏里,时机不对被系统跳过了。调整代码后,日志老老实实出现了那行字,那一刻对整个系统的运行机制才真正有了体感。

串口的日志等级也可以调,调试阶段把等级调到最详细,能看到系统所有模块的打印,信息量很大。正式发布前再把等级收回来,不然日志刷屏会影响业务逻辑的执行效率。

4. 外设操作与联网开发的核心思路

4.1 GPIO点灯的设计思路

日志打印属于内部验证,真正的对外交互要从GPIO开始。Hi3861的GPIO通过鸿蒙的IoT外设接口来操作,这套接口是鸿蒙专门给IoT设备封装好的,使用前只需要包含对应的头文件。

点灯的逻辑写起来并不复杂:先指定要操作哪个GPIO引脚,再设置引脚方向为输出,最后把引脚电平拉高或拉低来控制灯的亮灭。但一个细节值得注意:GPIO编号和芯片引脚的物理编号不是一回事,板子上的丝印标号提供的是物理引脚信息,你要去查板子的原理图,才能知道这个物理引脚对应到芯片的哪个GPIO口。

我在这里踩过一个记忆深刻的坑。板子上有一个板载LED,我以为随便选一个GPIO编号就能点亮,结果代码编译烧录全通过,灯就是不亮。折腾半天查原理图才发现,这个LED默认是被另一个功能占用的,我选的引脚恰好被复用成了其他外设,需要先在代码里把引脚的复用功能改回GPIO模式,灯才正常响应。从此以后,凡是操作新外设,第一步永远是查原理图,绝不靠猜。

4.2 WiFi联网的代码组织方式

Hi3861作为WiFi SoC,联网能力是它的看家本领。鸿蒙系统封装好了WiFi基础能力接口,可以实现在Station模式下扫描周围热点、发起连接、监听连接状态变化。

这一块的代码组织和点灯完全不同。点灯是单向输出,写完电平就结束了。WiFi联网则是一个异步过程:你发出连接指令后,系统在后台扫描信道、做认证、关联,每一步耗时不定,最终结果通过回调函数通知到你的业务代码。所以代码里要提前注册好各种回调,比如连接成功的回调、连接失败的回调、断开连接的回调,把后续的业务逻辑写在对应的回调里。

写WiFi连接代码之前,建议先把板子的天线位置放好。Hi3861板载天线的信号辐射方向是有讲究的,板子平放在桌面上和竖起来摆放,信号强度会有明显差异。如果周围环境干扰较大,连接成功率会受到不小影响。我曾在一个信号较弱的房间里测试,连自家路由器就是不稳定,后来把板子靠近路由器,问题立刻缓解。开发调试阶段,不要和环境问题较劲,先让代码逻辑在良好环境下跑通。

4.3 从点灯到物联网设备的扩展路径

跑通点灯和WiFi连接之后,整块板子算得上真正入门了,后续的扩展路径会非常清晰。你可以外接温湿度传感器,I2C总线通信,每隔几秒读一次数据,通过WiFi上报到云平台。也可以接一个按键,检测到按下后通过MQTT协议发布一条消息,做成远程控制开关。

这套开发方法的底层能力是可以迁移的。你在Hi3861上学会了鸿蒙任务的创建、消息队列的使用、外设接口的调用、WiFi的异步编程模式,换一颗更强的芯片,这些代码逻辑大部分都能复用。芯片型号只是载体,真正学到的是一整套端侧开发的思维框架,这也是为什么我一直建议新人不要纠结于“我要学最新的芯片”,而是要把一套成熟方案的开发流程彻底打通。熟悉一套完整的开发闭环,比浅尝辄止地了解十个平台有用得多。

5. 常见问题与排查技巧实录

5.1 编译阶段的典型报错

编译阶段最常见的报错可以归为三类。第一类是环境问题,比如Python版本不对、hb工具找不到,这一类通常有明确提示,按报错指引重装或切换版本即可。第二类是代码语法层面的错误,C语言报错信息非常具体,会精确到文件和行号,照着改就是。第三类最让人头疼,GN构建脚本写错导致的连锁报错,报错信息经常不直接指向你的业务代码,而是指向某个系统构建文件。

这里分享一个排查原则:编译报错时,先看第一个error而不是最后一个。很多人在终端里看到一长串红色输出就慌了,其实后面的报错大多是被第一个错误引发的连锁反应,修掉第一个,后面自然消失。同时,改动构建脚本前先备份,或者用版本管理工具提交一次。我无数次在折腾构建配置时改乱文件,最后靠git回退才救回来。

5.2 烧录和串口阶段的疑难杂症

烧录阶段的问题最诡异。有个常见现象是烧录工具提示连接失败,但板子的电源灯明明是亮的。这时候要检查串口驱动是否正确安装,尤其是一些兼容性不太好的USB转串口芯片,Windows会自动装一个错误的驱动,导致工具识别不到设备,去设备管理器里手动更新驱动通常能解决。

另一个高频问题是板子已经进入了烧录模式,但烧录到一半就卡住不动。十有八九是固件文件选错了,或者烧录地址填错了。我做过一次实验,故意把地址填错,烧录工具也没有报错,但板子重启后完全不工作,表现和变砖一模一样。所以遇到烧录后板子没反应,第一件事不是刷固件,而是核对烧录配置。

串口没有输出也是高频问题。排查顺序建议从源头往后查:先确认板子和电脑的物理连接,再确认串口号选对,然后确认波特率无误,最后确认是不是日志等级设置太低被过滤了。还有一个容易忽略的点是,有些串口工具打开串口时会占用设备,导致烧录工具无法连接,烧录前务必先关闭串口监视。我因为这个问题在烧录和调试之间来回切换,浪费了大量时间才发现是两者在抢同一个串口。

5.3 问题排查的方法论速查

调试嵌入式设备,最忌讳的是慌。一个有效的通用排查流程可以总结成四步走:

第一步,复现问题,确认它是偶发还是必现,记下触发条件。第二步,缩小范围,试着把有嫌疑的代码注释掉,看看问题是否消失。第三步,查看日志,把日志等级调到最高,从启动到出错的地方逐段翻看。第四步,对照已知问题库,很多坑前人已经踩过并且留下了记录,直接搜报错关键词往往是最快的解法。

我还养成了一个习惯,就是动代码前先做记录。在关键位置加上暂时性的日志打印,观察程序执行到哪一步停了,可以迅速定位死循环或者卡死的模块。这种打点排查法,在老工程师圈子里是基本功,效率远超盯着代码干瞪眼。

写在最后

我从这块板子上学到的,不只是几行鸿蒙接口怎么调用,而是一整套端侧设备的开发心智模型。环境搭好了,工具链通了,跑通了点灯,连上了WiFi,你会突然发现,鸿蒙开发的门槛并没有传说中那么高,它真正稀缺的是愿意一步步把链路走通的人。

最后再分享一个我常用的收尾技巧:每次完成一个阶段的开发后,把最终能编译通过的整个工程目录打包保存一份,并写好当时的步骤说明。这个习惯最开始只是以防万一,后来变成了我最有价值的资料库,版本出问题时翻出来对比一下,往往一眼就能看出哪里改坏了。如果你决定开始玩Hi3861,希望这套方法能帮你少走几段弯路,把精力留在真正有意思的代码逻辑上。

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

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

立即咨询