OHOS3.0标准系统编写C程序控制LED 原创 精华

丨张明亮丨
发布于 2021-9-22 15:05
浏览
13收藏

前言:

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

OHOS3.0标准系统编写C程序控制LED-鸿蒙开发者社区

3.点亮开发板LED

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

OHOS3.0标准系统编写C程序控制LED-鸿蒙开发者社区

OHOS3.0标准系统编写C程序控制LED-鸿蒙开发者社区

OHOS3.0标准系统编写C程序控制LED-鸿蒙开发者社区

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

OHOS3.0标准系统编写C程序控制LED-鸿蒙开发者社区

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

OHOS3.0标准系统编写C程序控制LED-鸿蒙开发者社区

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

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
HiSpark AI Camera 原理图 Hi3516.zip 1.23M 77次下载
已于2021-9-22 15:15:56修改
12
收藏 13
回复
举报
4条回复
按时间正序
/
按时间倒序
mb609898e2cfb86
mb609898e2cfb86

每一次新版本发布都能见到楼主的文章。

回复
2021-9-23 09:54:14
wx60a4dde2a34e8
wx60a4dde2a34e8

我希望拥有我们自己的芯片,关于碳基芯片,我希望可以用字迹临摹的方式入手

回复
2021-9-24 01:07:49
董昱
董昱

厉害厉害!

回复
2021-9-24 09:05:46
解路
解路

开发板是hi3516dv300,在3.1版的源码上编译,然后烧录到开发版中,找不到对应的bin下面的helloworld和ledtest

回复
2022-7-11 15:20:14
回复
    相关推荐