#创作者激励#【木棉花】:基于启航KP_IOT开发板的按键点灯案例 原创
木棉花潘颖琳
发布于 2023-3-27 17:09
浏览
1收藏
前言
学而时习之,本次分享的案例是我之前学到的南向开发知识,于此记录与分享,欢迎交流学习吖~
概述
- 开发板套件:启航KP_IOT
- 实验环境:win10+WSL(Ubuntu20.04)+docker+VScode
- 实验内容:GPIO编程,按键点灯的两种实现方式(状态记录值或高低电平控制)
正文
一、准备工作
运行一个已构建好的镜像,在VScode上的“远程资源管理器”与容器做好连接,然后就可以开始编程啦!
在如下图的文件路径device>isoftstone>app下创建文件夹KP_KEY_led,再创建文件BUILD.gn和key_led.c。然后在开发板原理图上查找复用的GPIO对应的编号,这里用到的按键对应GPIO 5,灯对应GPIO 8。
二、代码部分
状态记录值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
回复
相关推荐
万物从点灯开始
膜拜大佬,开始转向openharmony喽
这个我们的微信可以转载嘛
可以O(∩_∩)O