学习系统的人一般会从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",
}