家星 · 2021年12月31日

linux小白从零开始的XR806体验 2.编译三个ohosdemo+点灯+呼吸灯

本文基于wsl2搭建的ubuntu18.04 + vscode编辑器~~~~

linux小白从零开始的XR806体验 1.环境配置篇(详细说明我遇到的坑)
linux小白从零开始的XR806体验 2.使用vscode连接wsl搭建的ubuntu环境

在各位优秀工程师产出的指导博客的帮助下,我终于完成了官方3个demo的测试,完成了第一步输出hello word。

记录一下,同时说明下编译demo可能会遇到的问题,希望对你有所帮助(整理自试用群)

1编译我的第一个demo

请确保你已经走到了官方教程中hb build -f这一步。
1.首先打开ohosdemo文件夹,打开BUILD.gn文件
gn.JPG

2.去掉"hello_demo:app_hello"前的#号(如上图所示。#表示注释)
完成这一步,实际上就可以编译了,不过在此之前,我想先说一个对小白有帮助的概念,(大佬完全没必要看我的这篇教程吧~~ )
hello_demo:app_hello这行什么意思?
hello_demo:我们hello-world这里例程所属的文件夹
app_hello:这是hello_demo文件下内的build.gn里的内容,如下图hellogn.JPG

3.直接hb build -f编译了就可以了

4.烧录
在前面用vscode连接wsl教程里,我已经对ubuntu的进行了硬盘映射,所以我现在只需要像打开C盘,D盘一样,打开Ubuntu盘,按照路径找到我编译好的文件就可以了
Z:\home\shaon\device\xradio\xr806\xr_skylark\out
在out文件夹中找到xr_system.img,这个就是我们的编译文件,
然后在tools文件夹中找到phoenixMC_v3.1.21014b.exe
Z:\home\shaon\device\xradio\xr806\xr_skylark\tools
**上面的编译好的固件,和烧录工具,我都拷贝到外面了
6.JPG

烧录完毕后,你就可以打开串口调试助手,波特率选择115200,就可以看到hello world 啦

7.JPG
8.JPG

之后,去尝试编译其他demo,也是一样

编译其他demo可能会遇到问题

1.bin文件flash重叠
2.jpg
图片中,bin1的结束地址是0x18c00,而bin2的起始地址是0x17c00
bin2的起始地址应该大于0x18c00,所以导致报错,
解决方式:
3.jpg
按照上图路径,删除image.cfg,将image_auto_cal.cfg改成为image.cfg
或者赋值image_auto_cal.cfg里面的所有内容,替换到image.cfg内。

2.未安装32位支持库导致的编译报错,错误如下图所示
4.jpg
5.jpg
大佬发言👆👆👆
这个问题我没有遇到,群众有人遇到并解决了,所以我整理出来供大家参考

大佬提供的解决方式:

`sudo apt install qemu-user-static

sudo update-binfmts \ --install i386 /usr/bin/qemu-i386-static \ --magic \ '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' \ --mask \ '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'

sudo service binfmt-support start`

2.点亮板子上的led

2.1 在ohosdemo下新建一个led文件夹,将iot_peropheral这个demo内的所有内容赋值到led内
led.JPG
2.2分别修改两个BUILD.gn文件
修改led文件夹内的BUILD.gn将static_library("app_peripheral") 改成static_library("app_led")
这个名字你们可以自定义,之后和下一步对应就可以了
修改ohosdemo下的BUILD.gn文件,注释前面的demo,增加新的一行"led:app_led",上面解释过为什么这么写,忘了可以往上翻翻
9.JPG10.JPG

2.3修改main.c
官方已经提供了参考例程,在我这里就是参考test_gpio.c(其实就是抄了)
113.JPG test_gpio.c文件
参考参考,然后复制到mian.c内,
别忘了include GPIO相关的头文件
#include "iot_gpio.h"

看原理图,知道了小灯的IO口是21

下面贴我的mian文件内的代码

#include <stdio.h>
#include "ohos_init.h"
#include "kernel/os/os.h"
#include "iot_gpio.h"

#define GPIO_ID_PA21 21

static uint32_t g_irqCnt = 0;

static OS_Thread_t g_main_thread;

static void MainThread(void *arg)
{
    unsigned int gpio_id = GPIO_ID_PA21; /* GPIOA_PIN21 */
    unsigned int gpio_cnt = 0;

    IotGpioDir dir;

    printf("gpio%d output test start\r\n", gpio_id);
    IoTGpioInit(gpio_id);
    IoTGpioSetDir(gpio_id, IOT_GPIO_DIR_OUT);
    IoTGpioGetDir(gpio_id, &dir);
    printf("gpio%d getdir %d\r\n", gpio_id, dir);

    while (1) {
        printf("gpio%d output value hign\r\n", gpio_id);
        IoTGpioSetOutputVal(gpio_id, 1);
        OS_MSleep(500);
        printf("gpio%d output value low\r\n", gpio_id);
        IoTGpioSetOutputVal(gpio_id, 0);
        OS_MSleep(500);

        if (gpio_cnt++ >= 10) {
            break;
        }
    }

    IoTGpioDeinit(gpio_id);
    printf("gpio%d output test end\r\n", gpio_id);

}

void PeripheralTestMain(void)
{
    printf("\r\nPeripheral Test Start\r\n");

    if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,
                OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
        printf("[ERR] Create MainThread Failed\n");
    }
}

SYS_RUN(PeripheralTestMain);

上面的程序中,PA21对应的值是21,那我假如想要换个IO口初始化,那这个IO口对应的值是多少?去哪里查?
在iot_gpio.c中可以看到

/home/shaon/device/xradio/xr806/adapter/hals/iot_hardware/wifiiot_lite/iot_gpio.c



typedef enum {
    GPIOA_PIN0 = 0,
    GPIOA_PIN1 = 1,
    GPIOA_PIN2 = 2,
    GPIOA_PIN3 = 3,
    GPIOA_PIN4 = 4,
    GPIOA_PIN5 = 5,
    GPIOA_PIN6 = 6,
    GPIOA_PIN7 = 7,
    GPIOA_PIN8 = 8,
    GPIOA_PIN9 = 9,
    GPIOA_PIN10 = 10,
    GPIOA_PIN11 = 11,
    GPIOA_PIN12 = 12,
    GPIOA_PIN13 = 13,
    GPIOA_PIN14 = 14,
    GPIOA_PIN15 = 15,
    GPIOA_PIN16 = 16,
    GPIOA_PIN17 = 17,
    GPIOA_PIN18 = 18,
    GPIOA_PIN19 = 19,
    GPIOA_PIN20 = 20,
    GPIOA_PIN21 = 21,
    GPIOA_PIN22 = 22,
    GPIOA_PIN23 = 23,
    GPIOA_PIN_MAX = GPIOA_PIN23,

    GPIOB_PIN0 = 24,
    GPIOB_PIN1 = 25,
    GPIOB_PIN2 = 26,
    GPIOB_PIN3 = 27,
    GPIOB_PIN4 = 28,
    GPIOB_PIN5 = 29,
    GPIOB_PIN6 = 30,
    GPIOB_PIN7 = 31,
    GPIOB_PIN8 = 32,
    GPIOB_PIN9 = 33,
    GPIOB_PIN10 = 34,
    GPIOB_PIN11 = 35,
    GPIOB_PIN12 = 36,
    GPIOB_PIN13 = 37,
    GPIOB_PIN14 = 38,
    GPIOB_PIN15 = 39,
    GPIOB_PIN16 = 40,
    GPIOB_PIN17 = 41,
    GPIOB_PIN18 = 42,
    GPIO_PIN_MAX
} IotGpioID;

最后,编译一下,烧录

12.jpg

3.做一盏呼吸灯

3.1直接将上的led复制下来,命名为pwm_led
3.2参考test_pwm.c文件中,pwm的用法
相关函数:

    IoTPwmInit(pwm_channl);
    IoTPwmStart(pwm_channl, pwm_duty_ratio, pwm_freq);

这里需要查询相应引脚的pwm值,PA21对应的pwm_channl=2
pwm_duty_ratio:占空比
pwm_freq:频率
上程序:
main.c

#include <stdio.h>
#include "ohos_init.h"
#include "kernel/os/os.h"
#include "iot_gpio.h"
#include "iot_pwm.h"


#define GPIO_ID_PA21 21

static uint32_t g_irqCnt = 0;

static OS_Thread_t g_main_thread;

static void MainThread(void *arg)
{
    unsigned int gpio_id = GPIO_ID_PA21; /* GPIOA_PIN21 */
    unsigned int pwm_delay_cnt = 0;
    unsigned int pwm_channl = 2;
    unsigned int pwm_duty_ratio = 20;
    unsigned int pwm_freq = 10000;

    printf("pwm test ch%d start\r\n", pwm_channl);
    printf("pwm ch%d output duty ratio = %d, freq = %d\r\n", pwm_channl,
           pwm_duty_ratio, pwm_freq);
    IoTGpioInit(gpio_id);//IO口初始化
    IoTGpioSetDir(gpio_id, IOT_GPIO_DIR_OUT); //设置IO口为输出
    IoTPwmInit(pwm_channl);  //初始化该IO口的PWM功能
    
    

    while (1) {
            //亮到暗
            for (int i = 0; i < pwm_duty_ratio; i++) 
            {
                IoTPwmStart(pwm_channl, i, pwm_freq);
                OS_MSleep(100);
            }
                //暗到亮
            for (int i = pwm_duty_ratio; i > 0; i--) {
                IoTPwmStart(pwm_channl, i, pwm_freq);
                OS_MSleep(100);
            }

    }


}

void PeripheralTestMain(void)
{
    printf("\r\nPWM LED TEST\r\n");

    if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,
                OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
        printf("[ERR] Create MainThread Failed\n");
    }
}

SYS_RUN(PeripheralTestMain);

pwm_led文件夹内build.gn

static_library("app_pwmled") {
   configs = []

   sources = [
      "src/main.c",
      "src/test_flash.c",
      "src/test_gpio.c",
      "src/test_i2c.c",
      "src/test_lowpower.c",
      "src/test_pwm.c",
      "src/test_reset.c",
      "src/test_uart.c",
      "src/test_watchdog.c",
   ]

   cflags = board_cflags

   include_dirs = board_include_dirs
   include_dirs += [
      "//kernel/liteos_m/kernel/arch/include",
      "include",
      "//base/iot_hardware/peripheral/interfaces/kits",
   ]
}

外部build.gn

group("ohosdemo") {
    deps = [
        #"hello_demo:app_hello",
        #"iot_peripheral:app_peripheral",
        #"wlan_demo:app_WlanTest",
        #"led:app_led",
        "pwm_led:app_pwmled",
    ]
}

呼吸灯就都差不多,就不传视频了,大家脑部一下。哈哈哈

推荐阅读
关注数
13823
内容数
139
全志XR806开发板相关的知识介绍以及应用专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息