Harmony OS 设备开发学习记录(四)–通过注册GPIO中断控制LED
基于hispark wifi套件采用harmony os 2.0全量代码
注:由于核心板板载的按键和led我尝试了很多次也不行,目前先采用wifi套件扩展板,当然外接外设也行。
一、看原理图确定硬件电路
这里同样采用与GPIO8相连的按键和与GPIO12相连的黄色LED
二、在源码中建立demo文件
注:这里为了省事直接采用上次建好的文件夹
三、编写代码
在gpiodemo/gpio_input_int.c中写入
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_io.h"
static volatile IotGpioValue g_ledPinValue = IOT_GPIO_VALUE1;
//中断函数
static void OnButtonPressed(char* arg){
(void)arg;
g_ledPinValue = !g_ledPinValue;
}
//Gpio线程函数
static void *GpioTask(const char *arg){
(void)arg;
unsigned int rst = 0;
//注册中断
rst = IoTGpioRegisterIsrFunc(8, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, OnButtonPressed, NULL);
printf("GpioTask is already running and IotGpioRegisterIsrFunc return: %d\n", rst);
while (1)
{
IoTGpioSetOutputVal(12, g_ledPinValue);
osDelay(10);
}
}
static void GPIOEntry(void){
printf("Led Test!\n");
osThreadAttr_t attr;
IoTGpioInit(12);
IoTGpioSetDir(12, IOT_GPIO_DIR_OUT);
IoTGpioInit(8);
IoTGpioSetDir(8, IOT_GPIO_DIR_IN);
hi_io_set_pull(HI_IO_NAME_GPIO_8, HI_IO_PULL_UP);
attr.name = "GPIOTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024;
attr.priority = 25;
if (osThreadNew((osThreadFunc_t)GpioTask, NULL, &attr) == NULL) {
printf("[GpioExample] Falied to create GpioTask!\n");
}
}
SYS_RUN(GPIOEntry);
在gpiodemo/BUILD.gn中写入
static_library("gpiodemo") {
sources = [
"gpio_input_get.c"
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/peripheral/interfaces/kits",
]
}
在上级目录的app/BUILD.gn中写入
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"gpiodemo",
]
}
四、在Linux下使用hb工具进行编译
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary# hb set
[OHOS INFO] Input code path: .
OHOS Which product do you need? wifiiot_hispark_pegasus
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary# hb build
如果曾经设置过hb set就不需要再设置了,直接这样就可以了
root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary# hb build
看到success字样即为编译成功
五、将编译好的固件烧录到开发板
将linux中的源码文件夹中的out拷贝到Windows下替换原有out文件夹就可以了,但是要先删除原有out文件夹
打开vscode使用DevEco Device Tool打开源码文件夹
选择对应的开发板型号
这里选择的是hi3861
然后在项目设置中按照实际端口情况进行如下设置
保存项目并打开
点击upload进行烧录,烧录时需要根据提示按下开发板的rst键,稍等片刻,看到success代表烧录成功。
此时可以看到红绿灯扩展板上的黄色灯已经亮起,按一次扩展板上的按键黄灯灭,再按一次黄灯又将亮起,即代码正常运行。