#创作者激励#【木棉花】:基于启航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);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.

然后在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",
    ]
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

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

"KP_KEY_led:keyled_example",
  • 1.

以上方式是通过设置变量记录灯的状态值的方式,实现按键控制灯的功能;接下来再讲讲另一种方式:通过获取按键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);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.

结语

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

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

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2023-3-27 17:09:43修改
6
收藏 1
回复
举报
6
4
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


回复
    相关推荐