当前位置: 首页 > news >正文

Hi3861 OpenHarmony嵌入式应用入门--轮询按键

本篇介绍使用轮询方式读取gpio状态来判断按键状态。

原理图如下

GPIO API

API名称

说明

hi_u32 hi_gpio_init(hi_void);

GPIO模块初始化

hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val);

设置某个IO上下拉功能。

hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpio_dir dir);

设置GPIO引脚方向,id参数用于指定引脚,dir参数用于指定输入或输出

hi_u32 hi_gpio_get_input_val(hi_gpio_idx id, hi_gpio_value* val);

获取某个IO管脚输入电平状态

修改D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\BUILD.gn文件

# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#    http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. import("//build/lite/config/component/lite_component.gni")lite_component("demo") {features = [#"base_00_helloworld:base_helloworld_example",#"base_01_led:base_led_example","base_02_loopkey:base_loopkey_example",]
}

创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\base_02_loopkey文件夹

文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\base_02_loopkey\base_loopkey_example.c文件D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\base_02_loopkey\BUILD.gn文件

# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. static_library("base_loopkey_example") {sources = ["base_loopkey_example.c",]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/kal/cmsis","//base/iot_hardware/peripheral/interfaces/kits","//vendor/hqyj/fs_hi3861/common/bsp/include"]
}
/** Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**    http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include <stdio.h>
#include <unistd.h>#include "cmsis_os2.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "ohos_init.h"#define KEY1 HI_IO_NAME_GPIO_6  // 对应按键key1
#define KEY2 HI_IO_NAME_GPIO_5  // 对应按键key2osThreadId_t Task1_ID = 0;                       //  任务1 ID
hi_gpio_value val1, val1_last, val2, val2_last;  // GPIO的状态值
#define TASK_STACK_SIZE 1024
#define TASK_DELAY_TIME (200 * 1000)/*** @description: 任务1* @param {*}* @return {*}*/
void Task1(void)
{printf("enter Task 1.......\r\n");hi_gpio_init();                                // GPIO初始化hi_io_set_pull(KEY1, HI_IO_PULL_UP);           // 设置GPIO上拉hi_io_set_func(KEY1, HI_IO_FUNC_GPIO_6_GPIO);  // 设置IO16为GPIO功能hi_gpio_set_dir(KEY1, HI_GPIO_DIR_IN);         // 设置GPIO为输入模式hi_io_set_pull(KEY2, HI_IO_PULL_UP);           // 设置GPIO上拉hi_io_set_func(KEY2, HI_IO_FUNC_GPIO_5_GPIO);  // 设置IO15为GPIO功能hi_gpio_set_dir(KEY2, HI_GPIO_DIR_IN);         // 设置GPIO为输入模式while (1) {hi_gpio_get_input_val(KEY1, &val1);  // 获取GPIO引脚的状态if (val1 != val1_last) {// 当GPIO状态改变的时候, 打印输出printf("key1Value: %s\r\n", val1 ? "HI_GPIO_VALUE_1" : "HI_GPIO_VALUE_0");val1_last = val1;}hi_gpio_get_input_val(KEY2, &val2);  // 获取GPIO引脚的状态if (val2 != val2_last) {// 当GPIO状态改变的时候, 打印输出printf("key2Value: %s\r\n", val2 ? "HI_GPIO_VALUE_1" : "HI_GPIO_VALUE_0");val2_last = val2;}// 200ms一检测usleep(TASK_DELAY_TIME);  // 200ms sleep}
}/*** @description: 初始化并创建任务* @param {*}* @return {*}*/
static void base_key_demo(void)
{printf("[demo] Enter base_key_demo()!\r\n");osThreadAttr_t taskOptions;taskOptions.name = "Task1";                // 任务的名字taskOptions.attr_bits = 0;                 // 属性位taskOptions.cb_mem = NULL;                 // 堆空间地址taskOptions.cb_size = 0;                   // 堆空间大小taskOptions.stack_mem = NULL;              // 栈空间地址taskOptions.stack_size = TASK_STACK_SIZE;  // 栈空间大小 单位:字节taskOptions.priority = osPriorityNormal;   // 任务的优先级:wqTask1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &taskOptions);  // 创建任务1if (Task1_ID != NULL) {printf("ID = %d, Create Task1_ID is OK!\r\n", Task1_ID);}
}
SYS_RUN(base_key_demo);

目录结构

│  config.json
│
├─common
│  └─bsp
│      ├─include
│      └─src
├─demo
│  │  BUILD.gn
│  │
│  ├─base_00_helloworld
│  │      base_helloworld_example.c
│  │      BUILD.gn
│  │
│  ├─base_01_led
│  │      base_led_example.c
│  │      BUILD.gn
│  │
│  └─base_02_loopkey
│          base_loopkey_example.c
│          BUILD.gn
│
└─doc│  HarmonyOS开发板实验指导书 v2.1.pdf│  华清远见 FS_Hi3861开发指导.md│  华清远见 FS_Hi3861新手入门手册.md│├─board│      FS-Hi3861-V4.2.pdf│      FS-Hi3861QDB-V3.2.pdf│      hi-12f_kit_v1.1.0A7E6BCB9%A6-20211025.pdf│      hi-12f_v1.1.2-A7E6BCB9%A6-20211202.pdf│      nodemcu-hi-07s_12f-kit_v1.1-20210913.pdf│      RTplay2.01_2024-06-14.pdf│└─figures

使用build,编译成功后,使用upload进行烧录。

运行效果如下,按下按键会有对应按键状态输出。

http://www.lryc.cn/news/385387.html

相关文章:

  • js,uni 自定义 时间选择器 vue2
  • 搜索引擎的原理与相关知识
  • React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案
  • Taro +vue3 中的微信小程序中的分享
  • 视频监控EasyCVR视频汇聚/智能边缘网关:EasySearch无法探测到服务器如何处理?
  • openlayer 鼠标点击船舶,打开船舶简单弹框
  • 数据挖掘常见算法(关联)
  • vue项目集成CanvasEditor实现Word在线编辑器
  • Redis Stream Redisson Stream
  • threadX netx 设置IP地址以及获取IP地址
  • 计算机毕业设计hadoop+spark+hive知识图谱医生推荐系统 医生数据分析可视化大屏 医生爬虫 医疗可视化 医生大数据 机器学习 大数据毕业设计
  • lammps已经运算结束,有数据忘记算:rerun 命令
  • CARLA自动驾驶模拟器基础
  • 华为HCIP Datacom H12-821 卷16
  • Python学习打卡:day17
  • Spring Cloud Gateway 与 Nacos 的完美结合
  • vue2 element ui 表单 动态增加表单项 表单项值不可重复 select多选
  • [数据集][目标检测]电力场景下电柜箱门把手检测数据集VOC+YOLO格式1167张1类别
  • OverTheWire Bandit 靶场通关解析(上)
  • 【Python实战因果推断】4_因果效应异质性4
  • 大模型推理知识总结
  • [笔记] keytool 导入服务器证书和证书私钥
  • 【2024-热-办公软件】ONLYOFFICE8.1版本桌面编辑器测评
  • C# 23设计模式备忘
  • STL中的迭代器模式:将算法与数据结构分离
  • TCP、UDP详解
  • 【脚本工具库】批量下采样图像(附源码)
  • Web渗透:文件包含漏洞
  • 什么是yum源?如何对其进行配置?
  • Node.js全栈指南:认识MIME和HTTP