[文章] 【HarmonyOS HiSpark Wi-Fi IoT 套件试用连连载(3)】入门点LED灯

阅读量0
0
0
学习系统的人一般会从Hello world 开始学习,但是从单片机的角度来学习的人,我首先是试着去点亮一个LED灯,看看对IO口的控制能不能成功, 只要对IO 口操作成功了,其他操作就可以一步步向前摸索。

为了控制一个IO口,首先看了官方提供的示例程序,其实里面已经有对GPIO9对应的LED灯操作的示例,
/applications/sample/wifi-iot/app/Iothardware /led_example.c

是这个板子点亮WIFI 板的LED 的示例,按示例程序的方法,烧录完成,应该是有希望看到LED亮灭循环显示,但是编译和烧录了程序之后,并没有看到想要的结果, 蓝色LED灯控制不了, 一直不亮的状态,GPIO9口的控制代码有,但却没有作用,那就应该是调用任务的问题,于是找了论坛里前辈们发的贴子,希望能找到问题所在,检查了下面向个点:
1,首先查的是SYS_RUN有没有写错,
SYS_RUN(LedExampleEntry);

2,然后检查了将业务构建成静态库的BUILD.gn文件
/applications/sample/wifi-iot/app/Iothardware/BUILD.gn里面指定的业务模块,目标,源文件,头文件路径都没有问题,

static_library("led_example") {
    sources = [
        "led_example.c"

    include_dirs= [
       "//utils/native/lite/include",
       "//kernel/liteos_m/components/cmsis/2.0",
       "//base/iot_hardware/interfaces/kits/wifiiot_lite",
}
3,检查  /applications/sample/wifi-iot/app/ BUILD.gn的features列表内容,是一个默认的feature索引值已经指向了startup 业务模块,因为对startup不了解,暂时不知道这个指向是对还是不对。

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
     features = [
         "startup",
}
那尝试烧录进去看效果,板上是没有任何变化的,除了一个蓝色电源led是常亮的,GPIO9对应的灯一直是不亮的状态

几次测试不行的情况下, 我怀疑是不是板子在操作的时候不小心被静电打坏了,在开发群里请大神李隆和乔帮主帮忙发了系统原自带的程序,烧录上去之后,屏是有显示的, 按键也是有反应的,红绿灯板也是可以控制的。看来硬件是没有问题,问题还是出在程序上面。

然后回过头去看官网的入门贴,按照Hello world程序的步骤操作下来之后,我发现LED灯受控制的问题原因是漏掉了在/applications/sample/wifi-iot/app/BUILD.gn文件中的features字段中增加增加索引,所以iothardware模块下的程序并没有参与编译。也就不会启动led的测试程序。

于是在/applications/sample/wifi-iot/app/BUILD.gn文件加的是如下代码。

import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
   features = [
       "iothardware:led_example",
}

编译烧录完成后再reset启动,LED灯即可以被程序控制开关了,按LED灯一闪一闪亮了起来。LED总算是驱动成功了。
于是把红绿板灯LED对应的GPIO10, GPIO11,GPIO12,也设置成输出脚,按延时去控制这几个灯的显示状态,红绿灯板的控制也顺利实现。控制红绿灯板的程序在官方下载的程序里只改动了以下3个文件的代码作如下改动:
1 /applications/sample/wifi-iot/app/iothardware/BUILD.gn
static_library("led_example"){
    sources = [
        "led_example.c"

    include_dirs = [
       "//utils/native/lite/include",
       "//kernel/liteos_m/components/cmsis/2.0",
       "//base/iot_hardware/interfaces/kits/wifiiot_lite",
}

2/applications/sample/wifi-iot/app/iothardware/led_sample.c

#include

#include

#include"ohos_init.h"
#include"cmsis_os2.h"
#include"wifiiot_gpio.h"
#include"wifiiot_gpio_ex.h"

#define LED_INTERVAL_TIME_US300000
#define LED_TASK_STACK_SIZE512
#define LED_TASK_PRIO 25

enum LedState {
    LED_ON = 0,
    LED_OFF,
    LED_SPARK,
};

enum LedState g_ledState =LED_SPARK;

static void *LedTask(constchar *arg)
{
    (void)arg;
    while (1) {

        GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
        switch (g_ledState) {
            case LED_ON:
               GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
                usleep(LED_INTERVAL_TIME_US);
                break;
            case LED_OFF:
               GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
                usleep(LED_INTERVAL_TIME_US);
                break;
            case LED_SPARK:
               GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
                usleep(LED_INTERVAL_TIME_US);
               GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
                usleep(LED_INTERVAL_TIME_US);
                break;
            default:
                usleep(LED_INTERVAL_TIME_US);
                break;
        }
    }

    return NULL;
}

static voidLedExampleEntry(void)
{
    osThreadAttr_t attr;

    GpioInit();
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9,WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9,WIFI_IOT_GPIO_DIR_OUT);

    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12,WIFI_IOT_GPIO_DIR_OUT);


    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_GPIO_DIR_OUT);

    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10,WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10,WIFI_IOT_GPIO_DIR_OUT);

    attr.name = "LedTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = LED_TASK_STACK_SIZE;
    attr.priority = LED_TASK_PRIO;
   printf("[LedExample] try to createLedTask!n");
    if (osThreadNew((osThreadFunc_t)LedTask,NULL, &attr) == NULL) {
        printf("[LedExample] Falied tocreate LedTask!n");
    }
}

SYS_RUN(LedExampleEntry);


3/applications/sample/wifi-iot/app/BUILD.gn

import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
   features = [
       "iothardware:led_example",
}      

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友