基于BearPi开发板的语音控制开关(二)搭建小熊派的开发环境

前文介绍,我已经准备了一块小熊派开发板及其智慧农业模块,下边开始根据 BearPi-HM Nano 十分钟上手教程 搭建小熊派的开发环境。因为VMware的限制,这一步只能在Windows系统操作。

下载工具

下载官方提供镜像 - 镜像里提供OpenHarmony系统开发环境和工具:
https://pan.baidu.com/share/init?surl=T0Tcl3y48C1p5L6y-6HJNg?pwd=eusr
下载并安装虚拟机VMwareWorkstation:
https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html
下载HiBurn - 编译好的程序,烧录到开发板:
https://pan.baidu.com/s/1bp2ypAfH2HaNPTY2KwEhEA?pwd=1234
下载并安装开发板USB驱动 - 下载 CH341SER.EXE (USB转串口Windows一键式安装驱动程序),用于驱动小熊派的usb接口以烧入程序:
http://www.wch.cn/search?q=ch340g&t=downloads
下载并安装MobaXterm工具 - 通过SSH登陆上边下载的镜像系统,操作里的内容;通过Serial连接、调试开发板:
https://en.softonic.com/download/moba/windows/post-download

文档里还提到了RaiDrive工具,用于将虚拟机的目录映射到本地,我平时Linux用的比较多,就没有用这个工具,直接在Ubuntu上操作了。VS Code程序员应该比较熟悉,如果不知道用记事本等文本编辑器也可以代替。

运行Ubuntu镜像

根据文档第三、四、五步完成Ubuntu镜像的运行和连接。第四步里,找到镜像运行的ip后,只要在同网段的电脑都可以连接,不用必须在Ubuntu的宿主机上。第五步我没有做,修改、编译代码直接在Ubuntu上命令行操作了。

获取源码并编译

登陆到Ubuntu上,默认进入 /home/bearpi 目录,如果不是则切换到该目录下。
新建一个存放代码的目录并进入:

mkdir project/bearpi && cd project/bearpi

使用hpm命令初始化项目:

hpm init -t default

HPM是华为鸿蒙推出的HarmonyOS组件包管理和分发工具,可以方便地根据当前项目需要从官网获取需要的组件,主要面向设备开发,可以获取、定制鸿蒙os的源码,是执行安装、编译、打包、升级等操作的工具集合。


看到 Initialization finished. 字样,初始化完成。

下载项目代码:

hpm i @bearpi/bearpi_hm_nano


一般等待几分钟,屏幕中出现 Installed,代码下载成功。

编译代码:

hpm dist


看到BUILD SUCCESS字样,编译完成。第一次编译有点慢,可能需要等待几分钟,以后编译一次大概十几秒。
编译完成的固件为项目根目录下的 out/BearPi-HM_Nano/Hi3861_wifiiot_app_allinone.bin ,该固件可直接烧录到开发板上运行。

固件烧录到开发板

把上边编译好的固件Hi3861_wifiiot_app_allinone.bin下载到本地,等待烧录到开发板中。
安装开始下载的驱动程序 CH341SER.EXE
用TypeC数据线把开发板与电脑连接。连接的时候VMware会询问是否允许连接USB设备,记住不允许!!

打开电脑的设备管理器端口下会显示USB-SERIAL CH340(COM**),说明连接成功。*星号代表端口号,不同电脑可能不一样。

打开开始下载的Hiburn软件,打开Setting菜单中的Com settings,设置Baud921600,然后确定

COM选择上边连接成功COM端口号,点击Select file,选择刚下载的固件Hi3861_wifiiot_app_allinone.bin,勾选Auto burn,点击Connect按钮。

此时Connect按钮变成Disconnect,按一下开发板上的RESET按键,开始烧录。


直到出现 Execution Successful 字样并清除日志窗口,只显示Connecting...,程序烧录完成,点击Disconnect按钮断开连接,便于后面调测使用。

查看串口日志

使用串口调试软件或MobaXterm的Serial连接功能,设置波特率(Speed)115200,设置好后按一下开发板上的RESET按键,即可看到日志信息。

开发板体验

下载的程序包里包含很多示例代码,默认button_example是运行的,上边烧录完固件后,按一下开发板上F1按键,LED灯亮起,按一下开发板上F2按键,LED灯熄灭。

该示例的代码路经为 ./applications/BearPi/BearPi-HM_Nano/sample/B2_basic_button/,下边为该示例的完整代码:

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"

static void F1_Pressed(char *arg)
{
    (void)arg;
    GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2, 1);
}
static void F2_Pressed(char *arg)
{
    (void)arg;
    GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2, 0);
}
static void ButtonExampleEntry(void)
{
    GpioInit();

    //初始化LED灯
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_GPIO);

    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_DIR_OUT);

    //初始化F1按键,设置为下降沿触发中断
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);

    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_GPIO_DIR_IN);
    IoSetPull(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_PULL_UP);
    GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, F1_Pressed, NULL);

    //初始化F2按键,设置为下降沿触发中断
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);

    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_IN);
    IoSetPull(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_PULL_UP);
    GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, F2_Pressed, NULL);
}

APP_FEATURE_INIT(ButtonExampleEntry);

GPIO_2初始化为输出,LED灯在该引脚。GPIO_11GPIO_12两个引脚分别串联在F1和F2键,初始化为输入且为高电平。GpioRegisterIsrFunc()方法设置了GPIO_11引脚中断时回调F1_Pressed()方法,GPIO_12引脚中断时回调F2_Pressed()方法,这两个回调方法分别设置GPIO_2为高电平和低电平,就是设置LED灯的点亮和熄灭。那么当F1键按下时,GPIO_11接地变为低电平触发中断,回调F1_Pressed()方法点亮LED。

开发板第一个示例程序

下边开始根据 BearPi-HM_Nano开发板第一个示例程序 完成第一个 Hello World 程序。

./applications/BearPi/BearPi-HM_Nano/sample/ 目录下创建目录 FirstApp,用来存放代码
FirstApp目录下创建代码文件hello_world.c,创建用于将业务构建成静态库的BUILD.gn文件
hello_world.c

#include <stdio.h>
#include "ohos_init.h"
#include "ohos_types.h"

void HelloWorld(void)
{
    printf("++++++++++ Hello man!!!! ++++++++++\n\n");
}
SYS_RUN(HelloWorld);

视频教程 里还把 SYS_RUN() 方法换成了 APP_FEATURE_INIT(),我也试过,执行成功。

BUILD.gn

static_library("firstapp") {
    sources = [
        "hello_world.c"
    ]
    include_dirs = [
        "//utils/native/liteos/include"
    ]
}

配置 ./applications/BearPi/BearPi-HM_Nano/sample/BUILD.gn 文件,在 features 字段中增加索引 FirstApp:firstapp,使目标模块参与编译。

lite_component("app") {
    features = [
        ......
        #"D12_iot_cloud_oc_agriculture:cloud_oc_agriculture",
        #"D13_iot_cloud_oc_gps:cloud_oc_gps",
        "FirstApp:firstapp",
    ]
}

示例代码编译、烧录、运行、调测后,会显示如下结果: