写点什么

基于 OpenHarmony 的 Nexus_Geometry_Nano_Board 亮灯实验

  • 2025-08-14
    广东
  • 本文字数:4559 字

    阅读完需:约 15 分钟

基于OpenHarmony的Nexus_Geometry_Nano_Board亮灯实验

在开发一个项目的时候,首先是对开发板的了解,然后是对 OpenHarmony 操作系统的解读,知道要使用哪些系统能力。在开发的过程中要了解 git 与相关命令(比如说 repo),可以更高效的获取 OpenHarmony 源码。开发的过程中要注意开发环境是否装好,首次获取 OpenHarmony 源码可以通过进行编译来验证开发环境与源码的完整性。开发后进行编译如果有报错建议逐行解决报错,在没有报错后将编译产生最终的目标文件使用烧录软件进行烧录,验证逻辑是否有问题,是否可以正常运行等。本文中有很详细的对开发环境安装命令,案例源码等的解释。如果是基础的开发者,建议可以先研究编译过程的理论和案例源码的理论,再去按照步骤进行实验。

一.环境搭建

1.1 安装码云 repo 工具

mkdir ~/bincurl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repochmod a+x ~/bin/repopip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
复制代码



1.2 环境变量 path 中增加 repo 路径

vim ~/.bashrc #编辑环境变量#进入后按键盘i键进入输入模式,把下面这段复制粘贴到最后一行。export PATH=~/bin:$PATH #这行用于加在尾部#然后点击键盘左上角的Esc键后输入:wq回车就保存好了。source ~/.bashrc #应用变量(相当于刷新,会清空命令行)或者使用echo xxx >> ~/.bashrc也可以,比如说echo 'export PATH="~/bin:$PATH"' >> ~/.bashrcsource ~/.bashrc
复制代码




1.3 安装 git-lfs

注:首次 apt install 之前要运行 apt update -y

apt update -yapt install git-lfs
复制代码



1.4 下载 OpenHarmony 5.1 源码

cd ~/code #将命令行的路径移动到目标目录mkdir ws63_ohos #新建文件夹cd ~/code/ws63_ohos #命令的位置移动到这个目录下git config --global user.email “lengqinjie@lengqinjie.xyz”git config --global user.name “lengqinjie.#上面带user.email和user.name的为两行,一起复制粘贴为命令行,建议使用自己在gitcode的邮箱
复制代码




1.5 初始化本地代码仓库

repo init -u https://gitee.com/HiSpark/manifest.git -b OpenHarmony-v5.1.0-Release -m default-ws63-without-xts.xml --no-repo-verify
复制代码



1.6 下载源代码

repo sync -c
复制代码


1.7 下载大文件

repo forall -c 'git lfs pull'
复制代码



1.8 下载编译工具链

./build/prebuilts_download.sh
复制代码



1.9 vim ~/.bashrc

vim ~/.bashrc#进入后按键盘i键进入输入模式,把下面这段复制粘贴到最后一行export PATH=/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/tools/bin/compiler/riscv/cc_riscv32_musl_100/cc_riscv32_musl/bin:$PATH #这行用于加在尾部#然后点击键盘左上角的Esc键后输入:wq回车就保存好了。source ~/.bashrc #应用变量或者使用也可以达到相同效果的命令:echo 'export PATH="/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/tools/bin/compiler/riscv/cc_riscv32_musl_100/cc_riscv32_musl/bin:$PATH"' >> ~/.bashrcsource ~/.bashrc重复问题,可以通过grep命令先判断一下:grep 'export PATH="/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/tools/bin/compiler/riscv/cc_riscv32_musl_100/cc_riscv32_musl/bin:$PATH"' ~/.bashrc | sort | uniq -dbash脚本本身也可以支持if判断#!/bin/bash# 目标工具名称(假设为 "mytool")TOOL_NAME="mytool"# 工具所在的绝对路径(替换为你的实际路径)TOOL_PATH="/opt/custom_tools/mytool/bin"echo "=== Step 1: 检查当前 PATH 是否包含 ${TOOL_PATH} ==="sleep 2 # 停顿以便阅读输出# 检查工具是否已在 PATH 中if command -v "$TOOL_NAME" &> /dev/null; thenecho "'${TOOL_NAME}' 已存在于 PATH 中!当前版本:""$TOOL_NAME" --version | head -n 1 # 显示版本号(假设支持 --version 参数)elseecho "未找到 '${TOOL_NAME}',尝试添加到 PATH..."# 检查是否已手动添加过该路径(避免重复)if grep -qF "${TOOL_PATH}" ~/.bashrc; thenecho "错误:${TOOL_PATH} 已存在于 ~/.bashrc 但未生效!请检查配置。"exit 1fi# 追加路径到 .bashrc 并立即生效echo "export PATH=\"${TOOL_PATH}:\$PATH\"" >> ~/.bashrcecho "已将 ${TOOL_PATH} 添加到 ~/.bashrc"sleep 3 # 长时间停顿强调关键操作完成# 重新加载配置source ~/.bashrcecho "新 PATH 已加载,再次检查..."sleep 2# 最终验证if command -v "$TOOL_NAME" &> /dev/null; thenecho "成功!'${TOOL_NAME}' 现在可用:""$TOOL_NAME" --help # 显示帮助信息证明可用elseecho "失败!虽然添加了路径但仍无法找到 '${TOOL_NAME}'。请检查实际文件是否存在。"exit 1fifiecho
复制代码



1.10 安装 hb

pip install build/hb
复制代码



1.11 显示当前系统的 PATH 环境变量的值

echo $PATH
复制代码



1.12 apt update

apt update
复制代码



1.13 安装 cmake

apt install cmake
复制代码



1.14 安装 pycparser

pip install pycparser
复制代码



1.15 选中要编译哪个

hb set (执行这个命令后通过键盘上下键选择到要编译的,然后按enter键选中)
复制代码



1.16 执行编译

hb build -f
复制代码



二.第一个案例

由亮灯案例来验证开发环境是否正确,同时熟悉 OpenHarmony 的开发方式。

2.1 在/root/code/ws63_ohos/applications/sample/wifi-iot/app 路径下新建文件夹 light_tricolor,在新建的文件夹目录下新建文件 light_tricolor.c 与 BUILD.gn。


2.2 在/root/code/ws63_ohos/applications/sample/wifi-iot/app/light_tricolor/light_tricolor.c 文件放入源码:

#include <stdio.h> // 标准输入输出库#include <unistd.h> // 提供 sleep() 函数用于延时#include "cmsis_os2.h" // ARM Cortex-M 的 RTOS API 接口#include "ohos_init.h" // OpenHarmony的初始化接口#include "iot_gpio.h" // 物联网设备GPIO操作接口// 按照原理图,定义三色LED对应的GPIO引脚编号#define LED_R_PIN 10 // GPIO10#define LED_G_PIN 12 // GPIO12#define LED_B_PIN 13 // GPIO13void LedInit(void) {// 初始化GPIO,设置为输出IoTGpioInit(LED_R_PIN);IoTGpioSetDir(LED_R_PIN, IOT_GPIO_DIR_OUT);// 初始化GPIO,设置为输出IoTGpioInit(LED_G_PIN);IoTGpioSetDir(LED_G_PIN, IOT_GPIO_DIR_OUT);// 初始化GPIO,设置为输出IoTGpioInit(LED_B_PIN);IoTGpioSetDir(LED_B_PIN, IOT_GPIO_DIR_OUT);}void LightTricolorEntry(void) {LedInit(); // 初始化LED的GPIOwhile (1) { // 循环IoTGpioSetOutputVal(LED_R_PIN, 1); // 点亮sleep(1); // 延时IoTGpioSetOutputVal(LED_R_PIN, 0); // 关闭sleep(1); // 延时}}SYS_RUN(LightTricolorEntry);放入源码后如下:
复制代码



2.3 在/root/code/ws63_ohos/applications/sample/wifi-iot/app/light_tricolor/BUILD.gn 文件放入源码:

static_library("AAA") {sources = [ "light_tricolor.c" ]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/kal","//base/iothardware/peripheral/interfaces/inner_api",]}
复制代码

放入源码后如下:


2.4 在/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/build/config/target_config/ws63/config.py 中加入"AAA",如下图所示:


2.5 在/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/libs_url/ws63/cmake/ohos.cmake 下加入“AAA”,入下图所示:


2.6 编译好直接右键下载/root/code/ws63_ohos/out/nearlink_dk_3863/nearlink_dk_3863/ws63-liteos-app/ws63-liteos-app_all.fwpkg 文件:


2.7 在路径为/root/code/ws63_ohos/applications/sample/wifi-iot/app 的文件 BUILD.gn 改为:

import("//build/lite/config/component/lite_component.gni")lite_component("app") {features = ["light_tricolor:AAA",]}
复制代码

如下图所示:


三.使用华为云的 MQTT 实验

3.1 华为云上打开 iotDA 后创建产品,然后注册设备,在注册设备后点击设备右侧的详情查看 MQTT 连接参数,在 MQTTX 输入了华为云的 MQTT 连接参数后会显示设备在线



3.2 打开华为云在线调试,使用代码里有 MQTT 连接参数的开发板或 MQTTX 后连接华为云平台,可在华为云在线调试里看到设备在线


3.3 使用开发板或 MQTTX 发送消息,华为云接收到则调试成功


3.4 MQTT 案例

void mqtt_callback(MessageData *msg_data)    { size_t res_len = 0;        uint8_t *response_buf = NULL;        char topicname[45] = { "$crsp/" };        LOS_ASSERT(msg_data); printf("topic %.*s receive a message\r\n",    msg_data->topicName->lenstring.len, msg_data->topicName->lenstring.data); printf("message is %.*s\r\n", msg_data->message->payloadlen, msg_data->message->payload);    }    int mqtt_connect(void)    {        int rc = 0; NetworkInit(&n); NetworkConnect(&n, "xxxxxxxxxx.iot-mqtts.cn-north-4.myhuaweicloud.com", 1883); buf_size  = 4096+1024; onenet_mqtt_buf = (unsigned char *) malloc(buf_size); onenet_mqtt_readbuf = (unsigned char *) malloc(buf_size);        if (!(onenet_mqtt_buf && onenet_mqtt_readbuf))        { printf("No memory for MQTT client buffer!");            return -2;        } MQTTClientInit(&mq_client, &n, 1000, onenet_mqtt_buf, buf_size, onenet_mqtt_readbuf, buf_size); MQTTStartTask(&mq_client); data.keepAliveInterval = 30; data.cleansession = 1; data.clientID.cstring = "xxxxxxxxxxxxxxxxxxx_88888888_0_0_xxxxxxxxxx"; data.username.cstring = "xxxxxxxxxxxxxxxxxxx_88888888"; data.password.cstring = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; data.cleansession = 1; mq_client.defaultMessageHandler = mqtt_callback;        //连接服务器 rc = MQTTConnect(&mq_client, &data);        //订阅消息,设置回调函数 MQTTSubscribe(&mq_client, "porsche", 0, mqtt_callback); while(1)        { MQTTMessage message; message.qos = QOS1; message.retained = 0; message.payload = (void *)"huaweiyun"; message.payloadlen = strlen("huaweiyun");        //上报            if (MQTTPublish(&mq_client, "hi", &message) < 0)            { printf("MQTTPublish faild !\r\n");            } IoTGpioSetOutputVal(9, 0);      //9gpio 0 light on usleep(1000000);        }        return 0;       }
复制代码

四.烧录与运行

4.1 在编译后在 ws63-liteos-app 中产生.fwpkg 文件,这就是要烧录的文件点击文件后右键下载就可以下载到本地,注意文件路径。


4.2 装好驱动(CH341SER)后开发板通过数据线连接电脑,电脑同时打开设备管理器查看 COM 口的编号,注意不要看错,以免无法烧录。


4.3 打开 hitool,选择对应要烧录的文件路径,按照下图进行勾选,然后点击 connect 后于开发板进行连接,然后点击开发板的复位键就可以进行烧录了,烧录完成会在下面的文字框内显示完成。hitool 对于是一个此系列芯片的烧录软件,由芯片的厂商提供。


4.4 烧录完成后重写插拔数据线就可以让板子运行写好的测试程序,运行成功如下图。


最终的效果如上图,烧录时要注意波特率,波特率太低会导致烧录缓慢,波特率太高可能会导致开发板烧录坏,建议按照烧录软件的默认波特率进行烧录。烧录之后需要重新通电测试,观察是否灯已经闪烁。编译没有出现报错不意味着烧录后也可以正常运行,因为可能会有的时候是代码的逻辑出现错误导致最终运行不了。

关注“华为云开发者联盟”,了解更多技术动态。

用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
基于OpenHarmony的Nexus_Geometry_Nano_Board亮灯实验_华为云开发者联盟_InfoQ写作社区