大家好~ 最近一直在基于Hi3861开发OpenHarmony物联网相关项目,踩了不少环境配置和开发调试的坑,整理了这篇完整的VSCode开发Hi3861实操指南,从前期准备、环境搭建到项目创建、编译烧录,再到调试优化,每一步都附详细步骤和避坑说明,适合新手入门,也适合有经验的开发者参考避坑。

先简单介绍下核心工具和硬件:Hi3861是华为海思推出的一款高性能、低功耗的Wi-Fi IoT芯片,广泛用于物联网终端开发,支持OpenHarmony系统;而VSCode作为轻量且强大的代码编辑器,搭配华为官方的DevEco Device Tool插件,就能实现Hi3861的全流程开发,无需切换多个工具,效率拉满。本文将以Windows环境为例(新手最易上手),全程实操,确保大家跟着做就能成功运行第一个Hi3861程序。

一、前期准备(必做,缺一不可)

开发前需准备好硬件、软件和相关工具,避免后续因缺少组件导致流程卡壳,所有工具均提供官方下载路径,放心使用。

1.1 硬件准备

  • 核心硬件:Hi3861开发板(推荐小熊派BearPi-HM Nano、华清远见FS-Hi3861或海思HiSpark T1,本文以BearPi-HM Nano为例,其他型号操作一致);

  • 辅助硬件:Type-C数据线(支持数据传输,避免用仅充电的线材)、电脑(Windows 10/11 64位,建议内存4G以上);

  • 可选硬件:传感器(如LED灯、温湿度传感器),用于后续实战案例演示。

1.2 软件及工具准备

所有工具优先下载最新稳定版,避免版本兼容问题,下载后按步骤安装即可,无需额外配置。

  • VSCode:微软官方代码编辑器,轻量且插件丰富,下载地址:https://code.visualstudio.com/(选择Windows版本,按默认步骤安装,勾选“添加到PATH”,方便后续命令行调用);

  • DevEco Device Tool:华为官方推出的OpenHarmony开发插件,以VSCode插件形式部署,支持代码编辑、编译、烧录、调试全流程,下载地址:https://device.harmonyos.com/cn/develop/ide#download(选择Windows版本,下载后解压备用);

  • Hi3861工具链:包含编译工具、串口驱动等,下载地址:https://hispark.obs.cn-east-3.myhuaweicloud.com/DevTools_Hi3861V100_v1.0.zip(解压后放在磁盘根目录,避免路径过长);

  • Hi3861 SDK源码:OpenHarmony官方适配Hi3861的源码,可通过Git拉取,命令:git clone https://gitee.com/HiSpark/hi3861_hdu_iot_application.git(也可直接下载压缩包,同样放在磁盘根目录);

  • Git:用于拉取SDK源码,下载地址:https://git-scm.com/download/win(默认安装即可);

  • 串口驱动:CH340G驱动,用于电脑识别Hi3861开发板的串口,解压Hi3861工具链后,在usb_serial_driver目录下找到CH341SER.EXE,双击安装即可。

避坑提醒:Windows系统路径不能超过260个字符,因此Hi3861 SDK源码、工具链解压后,务必放在磁盘根目录(如D:\hi3861_sdk、D:\DevTools_Hi3861),否则后续编译会报错“文件找不到”。

二、VSCode环境搭建(核心步骤)

环境搭建的核心是安装DevEco Device Tool插件,并配置Hi3861相关工具链和SDK,全程跟着步骤来,避免遗漏配置项。

2.1 安装VSCode及基础插件

  1. 安装VSCode:双击下载的VSCode安装包,勾选“我同意此协议”,下一步,勾选“添加到PATH”(关键),其他默认即可,安装完成后启动VSCode;

  2. 安装基础插件:打开VSCode,点击左侧“扩展”图标(Ctrl+Shift+X),搜索并安装以下插件(提高开发效率):

    1. C/C++:微软官方插件,用于Hi3861的C语言代码编辑、语法高亮、代码提示;

    2. Chinese (Simplified):VSCode中文语言包,新手友好,安装后按Ctrl+Shift+P,输入“Configure Display Language”,选择“zh-cn”,重启VSCode即可切换中文;

    3. DevEco Device Tool:华为官方Hi3861开发插件,点击“扩展”→“从VSIX安装”,选择之前解压的DevEco Device Tool插件文件(后缀为.vsix),安装完成后重启VSCode,插件会自动加载。

2.2 配置DevEco Device Tool插件

重启VSCode后,左侧会出现“DevEco Device Tool”图标,点击进入插件主页,开始配置Hi3861相关参数,这一步是关键,直接影响后续编译和烧录。

  1. 打开插件主页:点击左侧“DevEco Device Tool”图标,进入主页后,点击“导入工程”(新手推荐导入现有SDK,避免新建工程踩坑);

  2. 选择SDK路径:在弹出的窗口中,选择之前下载并解压的Hi3861 SDK源码目录(如D:\hi3861_hdu_iot_application),点击“导入”;

  3. 选择芯片和开发板:弹出配置窗口,“SOC”选择“HI3861”,“开发板”选择对应的型号(如BearPi-HM Nano选择“hi3861”),点击“导入”,插件会自动识别SDK信息;

  4. 配置工具链路径:点击左侧“工程配置”,在右侧窗口找到“compiler_bin_path”选项,选择之前解压的Hi3861工具链路径,找到env_set.py文件所在的目录层级(如D:\DevTools_Hi3861V100_v1.0),保存配置;

  5. 检查环境:配置完成后,点击插件主页的“环境检查”,查看是否有缺失的组件,若有缺失,点击“修复”,插件会自动下载补充,确保所有组件都显示“正常”。

温馨提示:若环境检查时提示“Python未安装”,无需额外下载,DevEco Device Tool插件已自带Python环境,只需重启VSCode即可解决。

2.3 配置串口(用于烧录和调试)

将Hi3861开发板通过Type-C数据线连接到电脑,安装之前下载的CH340G驱动,配置串口参数,确保电脑能识别开发板。

  1. 安装串口驱动:双击Hi3861工具链中usb_serial_driver目录下的CH341SER.EXE,点击“安装”,提示“预安装成功”即可;

  2. 查看串口编号:右键点击“此电脑”→“管理”→“设备管理器”→“端口(COM和LPT)”,找到“USB-SERIAL CH340(COMx)”(x为串口编号,如COM3),记住这个编号;

  3. 配置VSCode串口:回到VSCode的DevEco Device Tool插件,点击“工程配置”,找到“upload_port”选项,选择刚才查到的串口编号(如COM3),保存配置;同时设置串口参数(默认即可):波特率115200、数据位8、停止位1、校验位无、流控无。

三、Hi3861项目开发(实操演示)

环境配置完成后,我们以“LED灯控制”为例,演示Hi3861项目的创建、代码编写、编译和烧录全流程,新手可直接照搬代码,快速上手。

3.1 创建项目目录和文件

Hi3861的项目代码需放在SDK的指定目录下,避免编译时无法识别,步骤如下:

  1. 打开SDK目录:在VSCode中,点击“文件”→“打开文件夹”,选择Hi3861 SDK源码目录(如D:\hi3861_hdu_iot_application),加载所有文件;

  2. 创建项目目录:在applications/sample/wifi-iot/app/目录下,新建一个文件夹(如led_control),用于存放我们的LED控制项目;

  3. 创建代码文件:在led_control目录下,新建两个文件:

    1. led_control.c:存放业务代码(LED控制逻辑);

    2. BUILD.gn:存放编译配置(告诉编译器如何编译当前项目)。

3.2 编写代码(LED灯控制)

Hi3861开发板中,GPIO09通常控制LED灯,GPIO05与用户按钮连接,我们通过按钮控制LED灯的亮灭,代码如下,直接复制到对应文件即可。

3.2.1 编写led_control.c代码
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_gpio.h"
#include "hi_io.h"

// 定义LED和按钮对应的GPIO引脚
#define LED_GPIO 9       // LED灯控制引脚
#define BUTTON_GPIO 5    // 用户按钮控制引脚
#define LED_TASK_STACK_SIZE 512  // 任务栈大小
#define LED_TASK_PRIO 25         // 任务优先级

// 全局变量,用于标记LED状态(0:熄灭,1:点亮)
static volatile int led_status = 0;

// 按钮中断回调函数:按下按钮后切换LED状态
static void ButtonIsrFunc(void *arg)
{
    led_status = !led_status;  // 切换LED状态
}

// LED控制任务:循环检测LED状态并控制灯的亮灭
static void LedControlTask(void *arg)
{
    (void)arg;

    // 初始化GPIO引脚
    hi_gpio_init();  // 初始化GPIO
    hi_io_set_func(LED_GPIO, HI_IO_FUNC_GPIO_9_GPIO);  // 设置LED引脚为GPIO功能
    hi_io_set_func(BUTTON_GPIO, HI_IO_FUNC_GPIO_5_GPIO);  // 设置按钮引脚为GPIO功能
    hi_gpio_set_dir(LED_GPIO, HI_GPIO_DIR_OUT);  // 设置LED引脚为输出模式
    hi_gpio_set_dir(BUTTON_GPIO, HI_GPIO_DIR_IN);  // 设置按钮引脚为输入模式

    // 注册按钮中断:下降沿触发(按下按钮时触发)
    hi_gpio_register_isr_function(BUTTON_GPIO, HI_INT_TYPE_EDGE, HI_GPIO_EDGE_FALL_LEVEL_LOW, ButtonIsrFunc, NULL);

    // 循环控制LED灯
    while (1)
    {
        // 根据led_status控制LED亮灭
        hi_gpio_set_output_val(LED_GPIO, led_status);
        osDelay(100);  // 延时100ms,降低CPU占用
    }
}

// 项目初始化函数,注册LED控制任务
static void LedControlInit(void)
{
    osThreadAttr_t attr;

    // 配置任务属性
    attr.name = "LedControlTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = LED_TASK_STACK_SIZE;
    attr.priority = LED_TASK_PRIO;

    // 创建LED控制任务
    if (osThreadNew(LedControlTask, NULL, &attr) == NULL)
    {
        printf("Failed to create LedControlTask!\r\n");
    }
}

// 注册初始化函数,系统启动时自动执行
APP_FEATURE_INIT(LedControlInit);
3.2.2 编写BUILD.gn编译配置文件

编译配置文件用于告诉编译器当前项目的编译规则,确保项目能被正确编译到固件中,代码如下:

import("//build/lite/config/component/lite_component.gni")

// 定义组件,名称为led_control,对应我们的项目
lite_component("led_control") {
    // 依赖的组件,确保能调用Hi3861的GPIO和OS相关接口
    deps = [
        "//base/iot_hardware/peripheral:gpio",
        "//third_party/cmsis_os2:cmsis_os2",
    ]

    // 要编译的源文件(当前项目的.c文件)
    sources = [
        "led_control.c",
    ]
}

// 将当前项目添加到app组件中,确保编译时能被包含
group("app") {
    deps = [
        ":led_control",
    ]
}
3.2.3 修改全局编译配置

需要修改SDK根目录下的applications/sample/wifi-iot/app/BUILD.gn文件,将我们的项目添加到全局编译中,否则编译时会忽略当前项目:

  1. 打开applications/sample/wifi-iot/app/BUILD.gn文件;

  2. 找到lite_component("app")节点,在features中添加我们的项目路径,修改后如下: import("//build/lite/config/component/lite_component.gni") lite_component("app") { features = ( "led_control:led_control", // 新增:我们的LED控制项目 # 其他默认项目(可保留,也可删除,不影响) ) }

3.3 项目编译(关键步骤,避坑重点)

编译的目的是将我们编写的代码转换成Hi3861能识别的固件文件(.bin格式),VSCode中可通过DevEco Device Tool插件一键编译,步骤如下:

  1. 打开编译面板:点击VSCode左侧“DevEco Device Tool”→“PROJECT TASKS”→“build”,点击“build”开始编译;

  2. 查看编译过程:编译过程中,VSCode终端会输出编译日志,耐心等待1-3分钟(取决于电脑配置);

  3. 判断编译成功:若终端最后输出“SUCCESS”,且无报错(红色字体),说明编译成功;若出现报错,按以下方式排查:

    1. 报错“文件找不到”:检查SDK路径是否过长,或文件路径是否正确;

    2. 报错“未定义的引用”:检查BUILD.gn文件中的依赖是否添加,或代码中是否有语法错误;

    3. 报错“权限不足”:以管理员身份运行VSCode,重新编译。

  4. 找到固件文件:编译成功后,固件文件位于out/hispark_pegasus/wifiiot_hispark_pegasus/Hi3861_wifiiot_app_allinone.bin,后续烧录时会自动识别该文件。

避坑提醒:编译时若出现“account_related_group_manager_mock.c: No such file or directory”报错,是Windows路径过长导致的,将SDK目录移动到磁盘根目录(如D:\hi3861_sdk),重新编译即可解决。

3.4 项目烧录(将固件写入Hi3861开发板)

编译成功后,将固件烧录到Hi3861开发板中,开发板才能运行我们编写的LED控制程序,步骤如下:

  1. 确认开发板连接:确保Hi3861开发板通过Type-C数据线连接到电脑,且串口配置正确(之前配置的COM口);

  2. 开始烧录:点击VSCode左侧“DevEco Device Tool”→“PROJECT TASKS”→“upload”,点击“upload”开始烧录;

  3. 触发烧录:烧录过程中,终端会提示“Connecting, please reset device...”,此时快速按下开发板上的“RST”(复位)键,烧录会继续进行;

  4. 判断烧录成功:若终端最后输出“SUCCESS”,说明烧录成功;若烧录失败,排查以下问题:

    1. 串口选择错误:重新检查设备管理器中的串口编号,修改“upload_port”配置;

    2. 数据线无法传输数据:更换一根支持数据传输的Type-C数据线;

    3. 开发板未复位:烧录时及时按下“RST”键,确保开发板进入烧录模式。

3.5 运行测试(验证成果)

烧录成功后,开发板会自动重启,运行我们编写的LED控制程序,测试步骤如下:

  1. 打开串口终端:在VSCode中,点击“终端”→“新建终端”,输入串口终端命令:serial-monitor -p COM3 -b 115200(COM3替换为你的串口编号),按下回车,终端会显示开发板的运行日志;

  2. 测试LED控制:按下开发板上的“USER”(用户)按钮,LED灯会随之切换亮灭状态;再按一次,恢复原来的状态,说明程序运行正常;

  3. 查看日志:终端会输出程序启动日志,若出现“Failed to create LedControlTask!”,说明任务创建失败,检查代码中的任务配置(如栈大小、优先级),重新编译烧录即可。

四、调试优化(新手必看,解决常见问题)

开发过程中难免会遇到各种问题,这里整理了最常见的问题及解决方案,还有调试技巧,帮助大家快速排查问题,提高开发效率。

4.1 常见问题及解决方案

  • 问题1:VSCode无法识别DevEco Device Tool插件? 解决方案:重启VSCode,若仍无法识别,重新安装插件,确保插件版本与VSCode版本兼容(优先下载最新版)。

  • 问题2:编译报错“路径过长”? 解决方案:将SDK目录、工具链目录移动到磁盘根目录,缩短路径长度,避免超过260个字符。

  • 问题3:烧录时提示“无法连接设备”? 解决方案:检查串口驱动是否安装成功、数据线是否支持数据传输、串口编号是否正确,重新连接开发板,按下“RST”键后再尝试烧录。

  • 问题4:LED灯不亮,按钮无反应? 解决方案:检查GPIO引脚定义是否正确(不同开发板的引脚可能不同,参考开发板手册)、代码中的中断注册是否正确、BUILD.gn依赖是否添加,重新编译烧录。

  • 问题5:终端无日志输出? 解决方案:检查串口编号、波特率是否正确,重新打开串口终端,或重启开发板。

4.2 调试技巧

  • 添加日志调试:在代码中添加printf语句,输出关键变量的值(如led_status),通过串口终端查看日志,定位问题所在;

  • 断点调试:在VSCode中,点击代码行号左侧,设置断点,然后点击“运行和调试”(Ctrl+Shift+D),选择“DevEco Device Tool”调试配置,启动调试,可逐步执行代码,查看变量变化;

  • 硬件排查:若程序运行异常,先检查开发板供电是否正常、传感器接线是否正确(如LED灯正负极),排除硬件问题。

4.3 进阶优化建议

  • 代码规范:遵循C语言开发规范,添加注释,方便后续维护和他人阅读;

  • 内存管理:Hi3861资源有限,避免使用过多全局变量,慎用动态内存分配,防止内存泄漏和栈溢出;

  • 中断优化:中断服务程序(ISR)应短小精悍,仅执行简单操作(如置标志位),避免在ISR中进行打印、延迟等复杂操作;

  • 版本控制:使用Git管理代码,定期提交代码,避免代码丢失,方便后续回滚和协作开发。

五、总结与拓展

到这里,VSCode开发Hi3861的全流程就结束了,从环境搭建、项目创建、代码编写,到编译烧录、调试优化,每一步都详细讲解,新手跟着做,就能成功运行第一个Hi3861程序。

Hi3861作为一款高性能的Wi-Fi IoT芯片,应用场景非常广泛,除了LED灯控制,还可以开发温湿度采集、WiFi通信、MQTT协议对接华为云物联网平台等项目(参考Gitee上的Hi3861安防系统项目)。后续我会继续分享Hi3861的进阶开发内容,比如WiFi连接、传感器数据采集、物联网平台对接等,感兴趣的朋友可以关注我~

最后,如果你在开发过程中遇到其他问题,欢迎在评论区留言,我会及时回复,帮助大家避坑。祝大家开发顺利,早日实现自己的Hi3861物联网项目!

补充说明:本文以Windows环境为例,若你使用Ubuntu环境,步骤类似,只需将工具链和SDK放在Ubuntu系统中,通过Docker编译环境(参考相关教程),即可完成开发,核心代码和配置一致。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐