出门莫恨无人随,书中车马多如簇。这篇文章主要讲述OHOS3.0标准系统编写C程序控制LED相关的知识,希望能为你提供帮助。
前言:OpenHarmony分为轻量系统、小型系统、标准系统,目前对应LiteOS-M、LiteOS-A、Linux内核。但好像并没有说一定是按照使用内核来划分。我们这里姑且先这么区分。本文使用的是比较新的OpenHarmony 3.0 LTS版本,Linux内核,编译标准系统。官方文档已经说明了,如何使用DevEco Studio开发hap包,并运行在开发板,但是ACE框架能力有限。设备硬件开发还是需要C,所以这篇文章,将在标准系统下编译C控制Hi3516开发板的LED闪烁。
::: hljs-center
文章图片
:::
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 Hi3516DV300
2.编写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下。
::: hljs-center
文章图片
:::
3.点亮开发板LED能打印helloworld说明环境是没问题的,接下来尝试点亮开发板的LED。查看Hi3516DV300原理图,请添加链接描述
::: hljs-center
文章图片
文章图片
文章图片
:::
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;
【OHOS3.0标准系统编写C程序控制LED】然后新建
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 1int32_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_tGPIO5_1 = 5 * 8 + 1;
uint16_tGPIO2_3 = 2 * 8 + 3;
uint16_tGPIO3_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
::: hljs-center
文章图片
:::
就可以看到LED闪烁起来了。
::: hljs-center
文章图片
:::
本来是打算使用鸿蒙的GPIO接口来实现这个功能的,不过调试了很久也没调通,最后无奈还是用的system自己实现的GPIO函数。有没使用OpenHarmony的GPIO成功的小伙伴可以留言一起交流啊。
想了解更多关于鸿蒙的内容,请访问:
51CTO和华为官方战略合作共建的鸿蒙技术社区
https://harmonyos.51cto.com/#bkwz
::: hljs-center
文章图片
:::
推荐阅读
- RDMARoCEv2 帧结构|RoCE和RRoCE|Soft-RoCE
- ubuntu21.04下终端路径显示优化
- 文件传输不止有FTP还有SCP,真的秀
- 如何正确添加基于Linux的Veeam 备份存储库
- ngixnfpm开机自启动,使用composer安装laravel5.8
- ThingMap一键城市2.0重新出发(快速生成三维城市)
- 如何在Redux框架中设置模板路径()
- 如何设置meta-box中复选框的默认值
- 如何在WordPress中设置背景大小以覆盖Preus主题