当前位置:   article > 正文

Harmony OS 设备开发学习记录(九)-- 通过ADC值区分按键(中断方式)_adc设置中断连续读取不同按键程序

adc设置中断连续读取不同按键程序

Harmony OS 设备开发学习记录(九)-- 通过ADC值区分按键(中断方式)

基于hispark wifi套件采用harmony os 2.0全量代码

一、看原理图确定硬件电路

oled板上的两个按键
在这里插入图片描述

二、在源码中建立demo文件

在app下建立adcdemo文件夹并创建BUILD.gn和adc_botton_int.c文件
在这里插入图片描述

三、编写代码

在adcdemo/adc_botton_int.c中写入

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_adc.h"
#include "hi_errno.h"

#define MSGQUE_COUNT 1
#define MSG_SIZE 1

#define ACT_DOWN 0
#define ACT_UP 1

#define KEY2_BUTTON 2
#define KEY3_BUTTON 3
#define KEY4_BUTTON 4
#define NOKEY_BUTTON 0

static osMessageQueueId_t button_msgq;

void button_status_callback(uint8_t button_id, uint8_t button_action){
    uint32_t rst;
    rst = osMessageQueuePut(button_msgq, &button_id, 0, 0);
    if (rst != osOK)
    {
        printf("button_status_callback error! \n");
        return;
    }
    
    printf("button_status_callback %d\n", rst);
}


static void key234_isr_handler(char *arg)
{
    hi_u16 data;
    static uint8_t btn_record;
    // static enum button_id btn_record;
    hi_adc_read(HI_ADC_CHANNEL_2, &data, HI_ADC_EQU_MODEL_4, HI_ADC_CUR_BAIS_DEFAULT, 0);
    if ((5<(int)data) && ((int)data<228)){
        button_status_callback(KEY2_BUTTON, ACT_DOWN);
        btn_record = KEY2_BUTTON;
    }
    else if ((228<(int)data) && ((int)data<455)){
        button_status_callback(KEY3_BUTTON, ACT_DOWN);
        btn_record = KEY3_BUTTON;
    }
    else if ((455<(int)data) && ((int)data<682)){
        button_status_callback(KEY4_BUTTON, ACT_DOWN);
        btn_record = KEY4_BUTTON;
    }

    if ((int)data > 1422)
    {
        btn_record = NOKEY_BUTTON;
        button_status_callback(btn_record, ACT_UP);
        hi_gpio_register_isr_function(HI_GPIO_IDX_5, HI_INT_TYPE_EDGE, HI_GPIO_EDGE_FALL_LEVEL_LOW, key234_isr_handler, NULL);
    }
    else
    {
        hi_gpio_register_isr_function(HI_GPIO_IDX_5, HI_INT_TYPE_EDGE, HI_GPIO_EDGE_RISE_LEVEL_HIGH, key234_isr_handler, NULL);
    }
}

static void ButtonThreadTask(void *arg){
    (void)arg;
    key234_isr_handler(arg);
    uint8_t value = 0;

    osMessageQueueId_t msgq;
    msgq = osMessageQueueNew(MSGQUE_COUNT, MSG_SIZE, NULL);
    if (msgq == NULL){
        printf("The key234_isr_handler falied to create button queue!\n");
        return;
    } else {
        button_msgq = msgq;
    }

    while (1)
    {
        if (osMessageQueueGet(button_msgq, &value, 0, osWaitForever) == osOK){
            printf("success! get button value %d\n", value);
        }
    }
}


static void AdcGpioEntry(void){
    printf("ADC Test!\n");
    osThreadAttr_t attr;
    

    hi_gpio_init();
    hi_io_set_func(HI_GPIO_IDX_5, HI_IO_FUNC_GPIO_5_GPIO);
    hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_IN);
    hi_io_set_pull(HI_GPIO_IDX_5, HI_IO_PULL_UP);

    attr.name = "ButtonThreadTask";
    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(ButtonThreadTask, NULL, &attr) == NULL) {
        printf("[LedExample] Falied to create LedTask!\n");
    }
}

SYS_RUN(AdcGpioEntry);

  • 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

在adcdemo/BUILD.gn中写入

static_library("adcdemo") {
    sources = [
        "adc_botton_int.c"
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//base/iot_hardware/peripheral/interfaces/kits",
        "//device/hisilicon/hispark_pegasus/sdk_liteos/include"
    ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在上级目录的app/BUILD.gn中写入

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
    features = [
        "adcdemo",
    ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

四、在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
  • 1
  • 2
  • 3
  • 4

如果曾经设置过hb set就不需要再设置了,直接这样就可以了

root@DESKTOP-QAO2AOK:~/harmonyos/code-2.0-canary# hb build
  • 1

看到success字样即为编译成功

五、将编译好的固件烧录到开发板

将linux中的源码文件夹中的out拷贝到Windows下替换原有out文件夹就可以了,但是要先删除原有out文件夹
打开vscode使用DevEco Device Tool打开源码文件夹
选择对应的开发板型号
这里选择的是hi3861
然后在项目设置中按照实际端口情况进行如下设置
在这里插入图片描述
保存项目并打开
在这里插入图片描述
点击upload进行烧录,烧录时需要根据提示按下开发板的rst键,稍等片刻,看到success代表烧录成功。
在这里插入图片描述
烧录完成后打开串口调试助手
在这里插入图片描述

按下rst键重启开发板,这时候分别按下核心板上的usr按键,和oled板上的s1按键与s2按键可以看到串口中会输出对应按下的按键,按键弹起时会输出0。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/553311
推荐阅读
相关标签
  

闽ICP备14008679号