引言
本文通过一个非常简单的程序,展现了在小熊派BearPi-HM_Micro_Small开发板上进行鸿蒙设备开发的完整流程:下载源码、创建工程、编写源程序、编写/修改编译脚本、编译、烧写、测试。
提示: 请先按照《搭建小熊派BearPi-HM_Micro_Small的纯Ubuntu开发环境》搭建好开发环境。
本文参考了小熊派BearPi-HM_Micro_Small开发板的部分教程。
https://gitee.com/bearpi/bearpi-hm_micro_small
一、下载源码
1、如果没有安装git,先参考《git与gitee快速入门》第二部分,安装git。
2、在希望放置小熊派鸿蒙源码的目录下执行以下命令,下载源码。
git clone https://gitee.com/bearpi/bearpi-hm_micro_small.git

二、创建工程
1、打开DevEco Device Tool。(1)单击左侧工具栏中的DevEco图标;(2)单击Projects;(3)单击Import Project按钮;(4)在弹出的窗口中,选择文件夹Projects;(5)选择项目bearpi-hm_micro_small;(6)单击Import按钮。

2、在下图所示窗口中,单击Import。

3、在下图所示窗口中,选择Import from OpenHarmony Source。

4、按下图设置完毕后,单击Open。

5、在下图所示窗口中,选择Current Window,打开项目。


三、编写源程序
1、在路径applications/BearPi/BearPi-HM_Micro/samples下新建一个文件夹:dandelion。
2、在文件夹dandelion下新建一个文件夹:hello_world。
3、在文件夹hello_world下新建一个文件:hello_world.c,在这个文件中编写源程序:
#include <stdio.h>
int main(int argc, char **argv)
{
printf("\n************************************************\n");
printf("\n\t\tHello BearPi!\n");
printf("\n************************************************\n\n");
return 0;
}
四、编写/修改编译脚本
1、在文件夹hello_world下新建一个文件:BUILD.gn,在这个文件中编写源程序hello_world.c的编译脚本:
executable("hello_world_exe") {
output_name = "hello_world"
sources = [ "hello_world.c" ]
include_dirs = []
defines = []
cflags_c = []
ldflags = []
}
executable("hello_world_exe"):指示编译构建子系统去完成一个名为hello_world_exe的编译构建“小目标”。executable是这个“小目标”类型;这个“小目标”的具体内容:将sources列表中的源文件(也就是hello_world.c)编译成一个可执行文件,生成的可执行文件的名字由output_name指定,也就是hello_world。
2、在文件夹dandelion下新建一个文件:BUILD.gn。
import("//build/lite/config/component/lite_component.gni")
lite_component("dandelion_app") {
features = [
"hello_world:hello_world_exe",
]
}
lite_component("dandelion_app"):指示编译构建子系统去完成一个类型为lite_component的、名为dandelion_app的编译构建目标。
lite_component这种类型是在lite_component.gni定义的,用于指示编译构建子系统去编译构建一个组件(Component)。
目前,在dandelion_app这个编译构建目标中只包含了hello_world目录中的编译构建“小目标” hello_world_exe。也就是说,这里要构建的组件(Component)中只包含一个可执行程序:hello_world。至于这个组件的名称,是在下个文件applications.json中指定的。
3、打开路径build/lite/components下的子系统applications的配置文件applications.json,将之前要编译构建的组件添加到子系统applications的组件列表中。

{
"component": "bearpi_dandelion_app",
"description": "app written by dandelion",
"optional": "true",
"dirs": [
"applications/BearPi/BearPi-HM_Micro/samples/dandelion"
],
"targets": [
"//applications/BearPi/BearPi-HM_Micro/samples/dandelion:dandelion_app"
],
"rom": "",
"ram": "",
"output": [],
"adapted_kernel": [ "liteos_a" ],
"features": [],
"deps": {
"components": [],
"third_party": []
}
},
4、打开路径vendor/bearpi/bearpi_hm_micro下的产品bearpi_hm_micro的配置文件config.json,将之前要编译构建的组件bearpi_dandelion_app添加到子系统applications的组件列表中。

{
"subsystem": "applications",
"components": [
{ "component": "bearpi_dandelion_app", "features":[] },
{ "component": "bearpi_sample_app", "features":[] },
{ "component": "bearpi_screensaver_app", "features":[] },
{ "component": "bearpi_sample_communication", "features":[] }
]
},
五、编译
1、选择产品。在项目的根目录下执行以下命令:
hb set

如上图所示,只有一个产品选项,所以直接回车即可。
2、编译。在项目的根目录下执行以下命令:
hb build -t notest --tee -f

等待,直到终端中出现如下图所示的build success字样,说明编译成功。

六、烧写
1、复制镜像
编译完成后,生成的镜像文件在目录:out/bearpi_hm_micro/bearpi_hm_micro中,将三个镜像文件:OHOS_Image.stm32、rootfs_vfat.img和userfs_vfat.img拷贝到目录:applications/BearPi/BearPi-HM_Micro/tools/download_img/kernel中。
cp out/bearpi_hm_micro/bearpi_hm_micro/OHOS_Image.stm32 applications/BearPi/BearPi-HM_Micro/tools/download_img/kernel/
cp out/bearpi_hm_micro/bearpi_hm_micro/rootfs_vfat.img applications/BearPi/BearPi-HM_Micro/tools/download_img/kernel/
cp out/bearpi_hm_micro/bearpi_hm_micro/userfs_vfat.img applications/BearPi/BearPi-HM_Micro/tools/download_img/kernel/
2、用USB线将开发板接入Ubuntu虚拟机。


3、将开发板的拨码开关上拨到“000”烧录模式,并按一下开发板的RESET按键。

4、双击打开STM32CubeProgrammer;选择接口类型:USB;单击刷新按钮;单击Connect连接开发板。

5、连接上以后,单击Open file;在工程目录下选中烧录配置的tvs文件,单击Open。


6、点击Browse按钮,然后选择工程源码下的烧录镜像路径,单击Open


7、点击Download按钮启动镜像烧录,并等待烧录完毕。


8、烧写完毕后,在弹出的窗口中单击OK;关闭STM32CubeProgrammer。

9、点击DevEco Device Tool左侧工具栏中的DevEco图标,在“PROJECT TASKS”–鸿蒙工程bearpi-hm_micro_small下,单击Monitor按钮,打开串口终端。

终端窗口如下图所示:

10、将开发板的拨码开关拨至“010”emmc启动模式,并按一下开发板的“RESET”按钮复位开发板,开发板开始启动。

在串口终端中打印出启动日志信息。
七、测试
在串口终端中输入指令:./bin/hello_world,然后回车,在串口终端中会显示下图所示结果:
