OHOS3.0标准系统编写C程序控制LED
想了解更多内容,标准编写请访问:
和华为官方合作共建的系统序控鸿蒙技术社区
https://harmonyos.51cto.com
前言:
OpenHarmony分为轻量系统、小型系统、标准编写标准系统,系统序控目前对应LiteOS-M、标准编写LiteOS-A、系统序控Linux内核。标准编写但好像并没有说一定是系统序控按照使用内核来划分。我们这里姑且先这么区分。标准编写本文使用的系统序控是比较新的OpenHarmony 3.0 LTS版本,Linux内核,标准编写编译标准系统。系统序控官方文档已经说明了,标准编写如何使用DevEco Studio开发hap包,系统序控并运行在开发板,标准编写但是ACE框架能力有限。设备硬件开发还是需要C,所以这篇文章,将在标准系统下编译C控制Hi3516开发板的LED闪烁。

1.环境准备
3.0源码下载:
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.0-LTS --no-repo-verify repo sync -c repo forall -c git lfs pull区别于2.0需要安装ruby,其他基本都一样。高防服务器
sudo apt-get install ruby-full编译命令
build/prebuilts_download.sh ./build.sh --product-name Hi3516DV3002.编写helloworld.c
在applications\standard目录下新建一个app目录来存放.c的业务代码。比如applications\standard\app\helloworld.c内容容下:
#include <stdio.h> int main(){ printf("Hello world.\n"); return 0; }然后在当前目录新建编译脚本BUILD.gn内容如下:
import("//build/ohos.gni") import("//drivers/adapter/uhdf2/uhdf.gni") ohos_executable("helloworld") { sources = [ "helloworld.c" ] subsystem_name = "applications" part_name = "prebuilt_hap" }然后添加到编译框架applications\standard\hap\ohos.build增加如下内容。
"//applications/standard/app:helloworld"最后执行编译命令即可,开发板使用的是Hi3516,在不指定out目录时,缺省生成在/system/lib64或/system/lib下。

3.点亮开发板LED
能打印helloworld说明环境是没问题的,接下来尝试点亮开发板的LED。查看Hi3516DV300原理图,请添加链接描述



Hi3516DV300共有4层板,由原理图可知:最上层板的红外补光灯接在GPIO5_1,绿色LED指示灯在GPIO2_3,核心板的红色LED在GPIO3_4。
接下来参考OpenHarmony GPIO驱动说明。
确定GPIO管脚号
不同SOC芯片由于其GPIO控制器型号、参数、以及控制器驱动的不同,GPIO管脚号的换算方式不一样。网站模板
Hi3516DV300控制器管理12组GPIO管脚,每组8个。
GPIO号 = GPIO组索引 (0~11) * 每组GPIO管脚数(8) + 组内偏移
举例:GPIO10_3的GPIO号 = 10 * 8 + 3 = 83
Hi3518EV300控制器管理10组GPIO管脚,每组10个。
GPIO号 = GPIO组索引 (0~9) * 每组GPIO管脚数(10) + 组内偏移
举例:GPIO7_3的GPIO管脚号 = 7 * 10 + 3 = 73
由此可以得出:
GPIO5_1 = 5 * 8 + 1; GPIO2_3 = 2 * 8 + 3; GPIO3_4 = 3 * 8 + 4;然后新建applications\standard\app\ledtest.c内容如下
#include <stdlib.h> // standard library 标准库函数头文件 #include <stdio.h> // standard input output 标准输入输出函数 #include <stdint.h> // 定义了扩展的整数类型和宏 #include <unistd.h> // POSIX 系统 API 访问功能的头文件 #include <fcntl.h> // unix标准中通用的头文件 define O_WRONLY and O_RDONLY // #include <string.h> #define GPIO_DIR_IN "in" #define GPIO_DIR_OUT "out" #define GPIO_VAL_LOW 0 #define GPIO_VAL_HIGHT 1 int32_t GpioSetDir(uint16_t gpio, char* dir){ char path[100] = { 0}; sprintf(path,"echo %d > /sys/class/gpio/export",gpio); system(path); printf("info:%s\n",path); char direction[100] = { 0}; sprintf(direction,"echo %s > /sys/class/gpio/gpio%d/direction",dir,gpio); system(direction); printf("info:%s\n",direction); return 0; } int32_t GpioWrite(uint16_t gpio, uint16_t val) { char path[100] = { 0}; sprintf(path,"echo %d > /sys/class/gpio/gpio%d/value",val,gpio); system(path); printf("info:%s\n",path); return 0; } int main(){ uint16_t GPIO5_1 = 5 * 8 + 1; uint16_t GPIO2_3 = 2 * 8 + 3; uint16_t GPIO3_4 = 3 * 8 + 4; printf("LED test start\n"); int32_t ret; // uint16_t val; ret = GpioSetDir(GPIO5_1,GPIO_DIR_OUT); if (ret != 0) { printf("GpioSerDir: failed, ret %d\n", ret); return 0; } ret = GpioSetDir(GPIO2_3,GPIO_DIR_OUT); if (ret != 0) { printf("GpioSerDir: failed, ret %d\n", ret); return 0; } ret = GpioSetDir(GPIO3_4,GPIO_DIR_OUT); if (ret != 0) { printf("GpioSerDir: failed, ret %d\n", ret); return 0; } while(1) { GpioWrite(GPIO5_1, GPIO_VAL_HIGHT); usleep(1000000); GpioWrite(GPIO5_1, GPIO_VAL_LOW); usleep(1000000); GpioWrite(GPIO2_3, GPIO_VAL_HIGHT); usleep(1000000); GpioWrite(GPIO2_3, GPIO_VAL_LOW); usleep(1000000); GpioWrite(GPIO3_4, GPIO_VAL_HIGHT); usleep(1000000); GpioWrite(GPIO3_4, GPIO_VAL_LOW); usleep(1000000); } return 0; }将业务代码添加到BUILD.gn
import("//build/ohos.gni") import("//drivers/adapter/uhdf2/uhdf.gni") ohos_executable("helloworld") { sources = [ "helloworld.c" ] subsystem_name = "applications" part_name = "prebuilt_hap" } ohos_executable("ledtest") { sources = [ "ledtest.c" ] subsystem_name = "applications" part_name = "prebuilt_hap" }applications\standard\hap\ohos.build
"//applications/standard/app:ledtest"之后将程序烧录到开发板,执行./system/bin/ledtest

就可以看到LED闪烁起来了。

本来是打算使用鸿蒙的GPIO接口来实现这个功能的,不过调试了很久也没调通,最后无奈还是用的system自己实现的GPIO函数。有没使用OpenHarmony的GPIO成功的小伙伴可以留言一起交流啊。
文章相关附件可以点击下面的原文链接前往下载
https://harmonyos.51cto.com/resource/1269
想了解更多内容,请访问:
和华为官方合作共建的鸿蒙技术社区
https://harmonyos.51cto.com