【OpenHarmony】 IoT嵌入式开发学习总结 原创
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;
}