【OpenHarmony】 IoT嵌入式开发学习总结 原创

拓维信息Abin
发布于 2021-8-5 17:10
浏览
3收藏

1、Hi3861开发板外设操作能力接口的不同之处总结

Hi3861开发板Iot设备开发的外设操作能力接口和其他Hi35xx开发板的外设操作能力接口不一样,两者在OpenHarmony源码目录中的位置也不相同。

Hi3861开发板的外设操作能力接口位于base\iot_hardware目录下,具体目录如下:

base\iot_hardware\peripheral\interfaces\kits\

Hi35xx开发板的外设操作能力接口位于drivers\framework目录下,具体目录如下:

drivers\framework\include\platform\

2、Hi3861开发板iothardware模块的led案例编译失败总结

通过官方获取的OpenHarmony 1.1.0版本源代码,在源代码的applications\sample\wifi-iot\app目录下面有个led点灯案例,此案例在编译时会出现错误,编译失败,原因是最新代码中的led_example.c文件中引入的iot_gpio.h头文件在BUILD.gn文件中配置的路径错误,应该是最新代码对头文件的路径进行了变更,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",  #编译报错错误路径位置
    ]
}

变更正确的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/peripheral/interfaces/kits/", #正确路径配置
    ]
}

3、Hi3861开发板iothardware模块的led案例运行结果和实际效果不一致总结

通过官方获取的OpenHarmony 1.1.0版本源代码,在源代码的applications\sample\wifi-iot\app目录下面有个led点灯案例。案例实现了点灯,关灯和闪灯三种操作led等的GPIO外设能力接口操作。在Hi3861开发板上运行案例时,发现点灯和关灯预期效果与实际运行效果截然相反,点灯操作成了关灯,关灯操作成了点灯。

分析Hi3861开发板的电路图得到原因,Hi3861开发板led发光二极管的阴极接在GPIO的9号引脚之上,应该是通过低电平才可以点灯,而案例代码是通过的高电平进行的点灯操作,低电平进行的关灯操作。为了实现预计效果和实际运行效果一直,必须修改代码,使用低电平进行点灯操作,高电平进行关灯操作。

修改前的代码如下:

static void *LedTask(const char *arg)
{
    (void)arg;
    while (1) {
        switch (g_ledState) {
            case LED_ON:
                GpioSetOutputVal(LED_TEST_GPIO, 1);
                usleep(LED_INTERVAL_TIME_US);
                break;
            case LED_OFF:
                GpioSetOutputVal(LED_TEST_GPIO, 0);
                usleep(LED_INTERVAL_TIME_US);
                break;
            case LED_SPARK:
                GpioSetOutputVal(LED_TEST_GPIO, 0);
                usleep(LED_INTERVAL_TIME_US);
                GpioSetOutputVal(LED_TEST_GPIO, 1);
                usleep(LED_INTERVAL_TIME_US);
                break;
            default:
                usleep(LED_INTERVAL_TIME_US);
                break;
        }
    }

    return NULL;
}

修改后的代码如下:

static void *LedTask(const char *arg)
{
    (void)arg;

    while (1) {
        switch (g_ledState) {
        case LED_ON:
            IoTGpioSetOutputVal(LED_TEST_GPIO, IOT_GPIO_VALUE0);
            usleep(LED_INTERVAL_TIME_US);
            break;
        case LED_OFF:
            IoTGpioSetOutputVal(LED_TEST_GPIO, IOT_GPIO_VALUE1);
            usleep(LED_INTERVAL_TIME_US);
            break;
        case LED_SPARK:
            IoTGpioSetOutputVal(LED_TEST_GPIO, IOT_GPIO_VALUE0);
            usleep(LED_INTERVAL_TIME_US);
            IoTGpioSetOutputVal(LED_TEST_GPIO, IOT_GPIO_VALUE1);
            usleep(LED_INTERVAL_TIME_US);
            break;
        default:
            usleep(LED_INTERVAL_TIME_US);
            break;
        }
    }

    return NULL;
}

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-9-10 08:51:20修改
5
收藏 3
回复
举报
回复
    相关推荐