OHOS3.0标准系统编写C程序控制LED

开发
OpenHarmony分为轻量系统、小型系统、标准系统,目前对应LiteOS-M、LiteOS-A、Linux内核。但好像并没有说一定是按照使用内核来划分。

[[425375]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前言:

OpenHarmony分为轻量系统、小型系统、标准系统,目前对应LiteOS-M、LiteOS-A、Linux内核。但好像并没有说一定是按照使用内核来划分。我们这里姑且先这么区分。本文使用的是比较新的OpenHarmony 3.0 LTS版本,Linux内核,编译标准系统。官方文档已经说明了,如何使用DevEco Studio开发hap包,并运行在开发板,但是ACE框架能力有限。设备硬件开发还是需要C,所以这篇文章,将在标准系统下编译C控制Hi3516开发板的LED闪烁。

OHOS3.0标准系统编写C程序控制LED-鸿蒙HarmonyOS技术社区

1.环境准备

3.0源码下载:

  1. repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.0-LTS --no-repo-verify 
  2. repo sync -c 
  3. repo forall -c 'git lfs pull' 

区别于2.0需要安装ruby,其他基本都一样。

  1. sudo apt-get install ruby-full 

编译命令

  1. build/prebuilts_download.sh 
  2. ./build.sh --product-name Hi3516DV300 

2.编写helloworld.c

在applications\standard目录下新建一个app目录来存放.c的业务代码。比如applications\standard\app\helloworld.c内容容下:

  1. #include <stdio.h> 
  2. int main(){ 
  3.     printf("Hello world.\n"); 
  4.     return 0; 

然后在当前目录新建编译脚本BUILD.gn内容如下:

  1. import("//build/ohos.gni"
  2. import("//drivers/adapter/uhdf2/uhdf.gni"
  3.  
  4. ohos_executable("helloworld") { 
  5.   sources = [ 
  6.     "helloworld.c" 
  7.   ] 
  8.   subsystem_name = "applications" 
  9.   part_name = "prebuilt_hap" 

然后添加到编译框架applications\standard\hap\ohos.build增加如下内容。

  1. "//applications/standard/app:helloworld" 

最后执行编译命令即可,开发板使用的是Hi3516,在不指定out目录时,缺省生成在/system/lib64或/system/lib下。

OHOS3.0标准系统编写C程序控制LED-鸿蒙HarmonyOS技术社区

3.点亮开发板LED

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

OHOS3.0标准系统编写C程序控制LED-鸿蒙HarmonyOS技术社区
OHOS3.0标准系统编写C程序控制LED-鸿蒙HarmonyOS技术社区
OHOS3.0标准系统编写C程序控制LED-鸿蒙HarmonyOS技术社区

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

由此可以得出:

  1. GPIO5_1 = 5 * 8 + 1; 
  2. GPIO2_3 = 2 * 8 + 3; 
  3. GPIO3_4 = 3 * 8 + 4; 

 然后新建applications\standard\app\ledtest.c内容如下

  1. #include <stdlib.h>     // standard library 标准库函数头文件 
  2. #include <stdio.h>      // standard input output 标准输入输出函数 
  3. #include <stdint.h>     // 定义了扩展的整数类型和宏 
  4.  
  5. #include <unistd.h>     // POSIX 系统 API 访问功能的头文件 
  6. #include <fcntl.h>      // unix标准中通用的头文件 define O_WRONLY and O_RDONLY   
  7.  
  8. // #include <string.h> 
  9. #define GPIO_DIR_IN "in" 
  10. #define GPIO_DIR_OUT "out" 
  11. #define GPIO_VAL_LOW 0 
  12. #define GPIO_VAL_HIGHT 1 
  13.  
  14. int32_t GpioSetDir(uint16_t gpio, char* dir){ 
  15.     char path[100] = {0}; 
  16.     sprintf(path,"echo %d > /sys/class/gpio/export",gpio); 
  17.     system(path); 
  18.     printf("info:%s\n",path); 
  19.  
  20.     char direction[100] = {0}; 
  21.     sprintf(direction,"echo %s > /sys/class/gpio/gpio%d/direction",dir,gpio); 
  22.     system(direction); 
  23.     printf("info:%s\n",direction); 
  24.     return 0; 
  25.  
  26. int32_t GpioWrite(uint16_t gpio, uint16_t val) 
  27.     char path[100] = {0}; 
  28.     sprintf(path,"echo %d > /sys/class/gpio/gpio%d/value",val,gpio); 
  29.     system(path); 
  30.     printf("info:%s\n",path); 
  31.     return 0; 
  32.  
  33. int main(){ 
  34.     uint16_t  GPIO5_1 = 5 * 8 + 1; 
  35.     uint16_t  GPIO2_3 = 2 * 8 + 3; 
  36.     uint16_t  GPIO3_4 = 3 * 8 + 4; 
  37.      
  38.     printf("LED test start\n"); 
  39.      
  40.     int32_t ret; 
  41.     // uint16_t val; 
  42.     ret = GpioSetDir(GPIO5_1,GPIO_DIR_OUT); 
  43.     if (ret != 0) { 
  44.         printf("GpioSerDir: failed, ret %d\n", ret); 
  45.         return 0; 
  46.     } 
  47.     ret = GpioSetDir(GPIO2_3,GPIO_DIR_OUT); 
  48.     if (ret != 0) { 
  49.         printf("GpioSerDir: failed, ret %d\n", ret); 
  50.         return 0; 
  51.     } 
  52.     ret = GpioSetDir(GPIO3_4,GPIO_DIR_OUT); 
  53.     if (ret != 0) { 
  54.         printf("GpioSerDir: failed, ret %d\n", ret); 
  55.         return 0; 
  56.     } 
  57.  
  58.     while(1) 
  59.     { 
  60.         GpioWrite(GPIO5_1, GPIO_VAL_HIGHT); 
  61.         usleep(1000000); 
  62.         GpioWrite(GPIO5_1, GPIO_VAL_LOW); 
  63.         usleep(1000000); 
  64.         GpioWrite(GPIO2_3, GPIO_VAL_HIGHT); 
  65.         usleep(1000000); 
  66.         GpioWrite(GPIO2_3, GPIO_VAL_LOW); 
  67.         usleep(1000000); 
  68.         GpioWrite(GPIO3_4, GPIO_VAL_HIGHT); 
  69.         usleep(1000000); 
  70.         GpioWrite(GPIO3_4, GPIO_VAL_LOW); 
  71.         usleep(1000000); 
  72.     } 
  73.     return 0; 

 将业务代码添加到BUILD.gn

  1. import("//build/ohos.gni"
  2. import("//drivers/adapter/uhdf2/uhdf.gni"
  3.  
  4. ohos_executable("helloworld") { 
  5.   sources = [ 
  6.     "helloworld.c" 
  7.   ] 
  8.   subsystem_name = "applications" 
  9.   part_name = "prebuilt_hap" 
  10.  
  11. ohos_executable("ledtest") { 
  12.   sources = [ 
  13.     "ledtest.c" 
  14.   ] 
  15.   subsystem_name = "applications" 
  16.   part_name = "prebuilt_hap" 

 applications\standard\hap\ohos.build

  1. "//applications/standard/app:ledtest" 

之后将程序烧录到开发板,执行./system/bin/ledtest

OHOS3.0标准系统编写C程序控制LED-鸿蒙HarmonyOS技术社区

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

OHOS3.0标准系统编写C程序控制LED-鸿蒙HarmonyOS技术社区

本来是打算使用鸿蒙的GPIO接口来实现这个功能的,不过调试了很久也没调通,最后无奈还是用的system自己实现的GPIO函数。有没使用OpenHarmony的GPIO成功的小伙伴可以留言一起交流啊。

文章相关附件可以点击下面的原文链接前往下载

https://harmonyos.51cto.com/resource/1269

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-11-23 15:35:05

鸿蒙HarmonyOS应用

2021-10-20 10:04:47

鸿蒙HarmonyOS应用

2021-11-08 07:19:45

鸿蒙HarmonyOS应用

2021-12-09 10:11:04

鸿蒙HarmonyOS应用

2022-09-27 15:57:20

OHOS代码仓库

2022-09-08 15:27:11

OHOSSafwk组件

2022-09-13 15:54:41

samgr鸿蒙

2023-12-29 08:45:40

Python3.8鸿蒙解释器

2021-10-09 10:12:39

鸿蒙HarmonyOS应用

2022-10-12 15:14:08

开机动画鸿蒙

2010-10-08 09:26:45

JavaScript程

2010-11-08 11:41:38

2022-09-15 14:56:12

GDB调试鸿蒙

2022-04-02 20:45:04

Hi3516开发板操作系统鸿蒙

2022-08-10 15:58:54

LED灯鸿蒙

2022-01-07 09:56:16

鸿蒙HarmonyOS应用

2021-09-16 15:04:28

鸿蒙HarmonyOS应用

2020-07-29 17:01:29

VSCode RTOSPython编程

2022-06-10 14:37:24

鸿蒙操作系统

2022-09-07 15:08:58

操作系统鸿蒙
点赞
收藏

51CTO技术栈公众号