本篇介绍使用轮询方式读取gpio状态来判断按键状态。
原理图如下
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 // 对应按键key2
-
- osThreadId_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; // 任务的优先级:wq
-
- Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &taskOptions); // 创建任务1
- if (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进行烧录。
运行效果如下,按下按键会有对应按键状态输出。