#创作者激励#【木棉花】:基于启航KP_IOT开发板的按键点灯案例 原创

木棉花潘颖琳
发布于 2023-3-27 17:09
浏览
1收藏

【本文正在参加2023年第一期优质创作者激励计划】

前言

学而时习之,本次分享的案例是我之前学到的南向开发知识,于此记录与分享,欢迎交流学习吖~

概述

  • 开发板套件:启航KP_IOT
  • 实验环境:win10+WSL(Ubuntu20.04)+docker+VScode
  • 实验内容:GPIO编程,按键点灯的两种实现方式(状态记录值或高低电平控制)

正文

一、准备工作

运行一个已构建好的镜像,在VScode上的“远程资源管理器”与容器做好连接,然后就可以开始编程啦!
在如下图的文件路径device>isoftstone>app下创建文件夹KP_KEY_led,再创建文件BUILD.gnkey_led.c。然后在开发板原理图上查找复用的GPIO对应的编号,这里用到的按键对应GPIO 5,灯对应GPIO 8。

#创作者激励#【木棉花】:基于启航KP_IOT开发板的按键点灯案例-鸿蒙开发者社区 #创作者激励#【木棉花】:基于启航KP_IOT开发板的按键点灯案例-鸿蒙开发者社区

二、代码部分

状态记录值ON、OFF、SPARK分别对应灯亮、灯关、灯闪烁三种状态,

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"

//GPIO8 控制 LED
#define LED_TASK_GPIO 8
//GPIO5 控制按键
#define IOT_GPIO_KEY 5
#define LED_INTERVAL_TIME 30
#define LED_TASK_STACK_SIZE 2048
#define LED_TASK_PRIO 25
enum LedState{
    LED_ON = 0,
    LED_OFF,
    LED_SPARK,
};
enum LedState g_ledState = LED_SPARK;

static void *LedTask(const char *arg)
{
    (void)arg;
    while(1){
        /*根据按键切换LED的显示状态*/
        printf("g_ledState = %d\n",g_ledState);
        switch(g_ledState){
            case LED_ON:
                IoTGpioSetOutputVal(LED_TASK_GPIO,0);
                osDelay(LED_INTERVAL_TIME);
                break;
            case LED_OFF:
                IoTGpioSetOutputVal(LED_TASK_GPIO,1);
                osDelay(LED_INTERVAL_TIME);
                break;
            case LED_SPARK:
                IoTGpioSetOutputVal(LED_TASK_GPIO,0);
                osDelay(LED_INTERVAL_TIME);
                IoTGpioSetOutputVal(LED_TASK_GPIO,1);
                osDelay(LED_INTERVAL_TIME);
                break;
            default:
                osDelay(LED_INTERVAL_TIME);
                break;
        }
    }
    return NULL;
}

unsigned int lastTickCount;
//中断回调函数,根据按键状态实现对应逻辑
static void OnButtonPressed(char *arg)
{
    (void) arg;
    //消除按键抖动
    unsigned int tickCount = osKernelGetTickCount();
    unsigned int count = tickCount - lastTickCount;
    lastTickCount = tickCount;

    if(count<50)
    {
        printf("----return\n");
        return ;
    }

    usleep(20*1000);

    /*按下按键的状态切换*/
    enum LedState nextState = LED_SPARK;

    switch(g_ledState){
        case LED_ON:
            nextState = LED_SPARK;
            break;
        case LED_OFF:
            nextState = LED_ON;
            break;
        case LED_SPARK:
            nextState = LED_OFF;
            break;
        default:
            break;
    }
    g_ledState = nextState;
    printf("nextState=%d\n",nextState);
}

static void LedExampleEntry(void)
{
 osThreadAttr_t attr;
 /*LED 的 GPIO 初始化*/
 IoTGpioInit(LED_TASK_GPIO);
 /*灯GPIO 设置为输出*/
 IoTGpioSetDir(LED_TASK_GPIO,IOT_GPIO_DIR_OUT);
 
 /*按键 GPIO 初始化*/
 IoTGpioInit(IOT_GPIO_KEY);
 IoTGpioSetFunc(IOT_GPIO_KEY, 0);
 /*按键 GPIO 初始化为输入*/
 IoTGpioSetDir(IOT_GPIO_KEY, IOT_GPIO_DIR_IN);
 IoTGpioSetPull(IOT_GPIO_KEY, 1);
/*注册按键执行函数*/
 IoTGpioRegisterIsrFunc(IOT_GPIO_KEY, IOT_INT_TYPE_EDGE, 
                        IOT_GPIO_EDGE_FALL_LEVEL_LOW,
                        OnButtonPressed,
                        NULL);
 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;
 if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
    printf("[LedExample] Falied to create LedTask!\n");
 }
}
SYS_RUN(LedExampleEntry);

然后在BUILD.gn文件配置好:

static_library("keyled_example"){
    sources=[
        "key_led.c",
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/kal",
        "//base/iot_hardware/peripheral/interfaces/kits",
    ]
}

最后在app>BUILD.gn下配置如下代码以加入编译:

"KP_KEY_led:keyled_example",

以上方式是通过设置变量记录灯的状态值的方式,实现按键控制灯的功能;接下来再讲讲另一种方式:通过获取按键GPIO的电平值是高低与否来判断按键是否按下,进一步响应灯的输出。在aPP路径下新建一个文件夹(同理创建一个C文件和BUILD.gn文件)主要代码如下:

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"

//GPIO8 控制 LED
#define LED_TASK_GPIO 8
//GPIO5 控制按键
#define IOT_GPIO_KEY 5
#define LED_INTERVAL_TIME 30
#define LED_TASK_STACK_SIZE 2048
#define LED_TASK_PRIO 25

static void Task(void)
{
    IotGpioValue Val={1};
    while(1){
        IoTGpioGetInputVal(IOT_GPIO_KEY,&Val);
        if(Val==0){
            //按键为低电平时,LED亮
            IoTGpioSetOutputVal(LED_TASK_GPIO,1);
        }else{
            IoTGpioSetOutputVal(LED_TASK_GPIO,0);
        }
        usleep(500*1000);
    }
}

static void LedExampleEntry(void)
{
 osThreadAttr_t attr;
 /*LED 的 GPIO 初始化*/
 IoTGpioInit(LED_TASK_GPIO);
 /*LED 的 GPIO 设置为输出*/
 IoTGpioSetDir(LED_TASK_GPIO,IOT_GPIO_DIR_OUT);
 
 /*按键 GPIO 初始化*/
 IoTGpioInit(IOT_GPIO_KEY);
 IoTGpioSetFunc(IOT_GPIO_KEY, 0);
 /*按键 GPIO 初始化为输入*/
 IoTGpioSetDir(IOT_GPIO_KEY, IOT_GPIO_DIR_IN);
 IoTGpioSetPull(IOT_GPIO_KEY, 1);

 attr.name = "Task";
 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;
 if (osThreadNew((osThreadFunc_t)Task, NULL, &attr) == NULL) {
    printf("[LedExample] Falied to create Task!\n");
 }
}
SYS_RUN(LedExampleEntry);

结语

以上就是本次的小分享啦!❀❀

更多资料请关注我们的项目 : Awesome-Harmony_木棉花

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2023-3-27 17:09:43修改
6
收藏 1
回复
举报
4条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

万物从点灯开始

回复
2023-3-28 10:44:01
离北况归
离北况归

膜拜大佬,开始转向openharmony喽


回复
2023-3-29 00:04:58
软通动力HOS
软通动力HOS

这个我们的微信可以转载嘛

回复
2023-3-29 10:23:42
木棉花潘颖琳
木棉花潘颖琳 回复了 软通动力HOS
这个我们的微信可以转载嘛

可以O(∩_∩)O

回复
2023-3-29 15:02:46
回复
    相关推荐