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

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

创新互联是专业的潘集网站建设公司,潘集接单;提供成都做网站、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行潘集网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

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

https://harmonyos.

前言:

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

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  
  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下。

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

由此可以得出:

 
 
 
 
  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      // standard library 标准库函数头文件 
  2. #include       // standard input output 标准输入输出函数 
  3. #include      // 定义了扩展的整数类型和宏 
  4.  
  5. #include      // POSIX 系统 API 访问功能的头文件 
  6. #include       // unix标准中通用的头文件 define O_WRONLY and O_RDONLY   
  7.  
  8. // #include  
  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

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

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

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

https://harmonyos./resource/1269

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

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

https://harmonyos.

当前标题:OHOS3.0标准系统编写C程序控制LED
标题路径:http://www.36103.cn/qtweb/news39/24439.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联