DshanMCU-R128s2 ADC 按键配置方法

FreeRTOS平台上使用的按键为ADC-KEY,采用的ADC模块为GPADC。

按键功能驱动的实现是通过ADC分压,使每个按键检测的电压值不同,从而实现区分不同的按键。按下或者弹起中断之后,通过中断触发,主动检测当前电压识别出对应的按键。最后再通过input子系统将获取按键的键值并上报给应用层。

GPADC-Key配置方法

按键结构体定义key_config的成员:

struct sunxikbd_config{
    unsigned int measure;    // 电压阈值
    char *name;              // 功能名
    unsigned int key_num;    // 按键数量
    unsigned int scankeycodes[KEY_MAX_CNT];    // 按键的键值
    unsigned int key_vol[KEY_MAX_CNT];         // 按键的电压值
};

不同平台的配置可能不同,以r128为例,下面是r128的成员config:

static struct sunxikbd_config key_config = {
    .measure = 2500,
    .name = "gpadc-key",
    .key_num = 5,
    .key_vol = {164,415,646,900,1157},
    .scankeycodes = {115,114,139,164,116}
};

当前按键驱动的配置都是以hardcode的方式写入驱动代码中,也就是说按键的数量,不同按键对应的电压值,不同按键对应的KeyCode等等配置如果要修改的话,需要对源码进行修改。

如上述按键结构体的定义,以下两配置按照默认配置即可。

  • measure:GPADC最大能够识别的电压值,需要根据UserMaual来设置。默认为2.5V。
  • name:注册的按键驱动名称,会注册到input子系统中。

可以自定义的配置为:key_num,key_vol,scankeycodes。

  • key_num: 按照实际硬件设计来设置。
  • key_vol: 按照硬件,实际每个按键分压的情况来设置。
  • scankeycodes:每个按键对应的KeyCode,方便应用通过input获得按下的按键时,能够识别是哪个按键按下了。

key_vol的配置方法,可以参考下图的GPADC-KEY的硬件设置。

image1

在图中,VCC输入的电压为3.3V,通过分压关系,第一个按键的电压为0.21V,因此key_vol可以设置为210,以此类推。

驱动初始化方法

默认系统启动时,不会加载GPADC驱动以及按键驱动。

如果需要加载GPADC-Key驱动,需要调用以下函数:

int sunxi_gpadc_key_init(void);

调用 sunxi_gpadc_key_init() 该函数即可完成GPADC驱动以及按键驱动的加载了,即可开始使用按键驱动。

应用调用方法

接下来继续介绍一下,应用中该如何获取按键按下的事件。

在FreeRTOS系统中,也移植了 Linux 的 input 子系统。GPADC-Key 中也是调用了 input 的接口,进行注册 input 设置,上报事件等动作。

在调用 sunxi_gpadc_key_init() 时,通过 input_set_capability() 去设置了事件的属性;通过 sunxi_input_register_device() 注册了 input 设备;在按键按下触发中断时,也是通过 input_report_key()input_sync() 上报 input 事件。

因此,在应用层想要获取input事件,可以直接通过input接口去获取,使用示例可如下例程:

int input_func(void)
{
    int fd = -1;
    struct sunxi_input_event event;

    sunxi_gpadc_key_init(); // 驱动初始化

    fd = sunxi_input_open(DEVICE_NAME);
    if (fd < 0)
        return -1;

    while (1) {
        sunxi_input_readb(fd, &event, sizeof(struct sunxi_input_event));
        if (event.type != EV_KEY)
            continue;

        if (event.value == 0) {
            printf("key up\n");
            continue;
        }
        printf("key press: KeyCode:%d\n", event.code);
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/263748.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32的以太网外设+PHY(LAN8720)使用详解(4):STM32管脚配置

0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册1 MCU管脚配置 1.1 使能外设相关时钟 STM32配置任何外设的第一步都是使能相关的外设时钟&#xff0c;根据前面的原理图我们需要使能相关的引脚时钟&#xff0c;同时我们需要使能SYSCFG时…

Linux服务器nginx部署Vue前端(详细版)

提示&#xff1a;适用于前后端项目的部署 文章目录 前言一、打包前端文件二、下载和部署Nginx三、配置conf文件启动nginx 前言 搜索到这篇文章想必你已经对Nginx比较了解&#xff0c;我也不对Nginx进行介绍赘述了&#xff0c;只需要明白Nginx本身也是一个静态资源的服务器&…

postman几种常见的请求方式

1、get请求直接拼URL形式 对于http接口&#xff0c;有get和post两种请求方式&#xff0c;当接口说明中未明确post中入参必须是json串时&#xff0c;均可用url方式请求 参数既可以写到URL中&#xff0c;也可写到参数列表中&#xff0c;都一样&#xff0c;请求时候都是拼URL 2&am…

LeetCode-17 电话号码的字母组合

LeetCode-17 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;d…

opencv入门到精通——OpenCV4.1.2之性能衡量与优化方法

目录 目标 使用OpenCV衡量性能 OpenCV中的默认优化 在IPython中衡量性能 更多IPython魔术命令 性能优化技术 目标 在图像处理中&#xff0c;由于每秒要处理大量操作&#xff0c;因此必须使代码不仅提供正确的解决方案&#xff0c;而且还必须以最快的方式提供。因此&#…

Python中__getitem__的奇妙应用

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 理解 __getitem__ 方法 1 基本概念 在Python中&#xff0c;__getitem__ 是一个重要的魔法方法&#xff0c;用于实现对象的索引访问。当使用类似 obj[index] 的方式访问对象时&#xff0c;Python 解释器会自动调…

C#线程Thread的使用

引言 在C#编程语言中&#xff0c;线程是一种并发执行的机制&#xff0c;可以实现多个任务同时执行&#xff0c;提高程序的效率和响应能力。C#提供了Thread类来处理线程相关的操作。本文将详细介绍C#中Thread类的使用方法和注意事项。 目录 引言线程的基本概念线程&#xff08;…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析!

前段时间忙于接口测试&#xff0c;也看了几款接口测试工具&#xff0c;简单从几个角度做了个比较&#xff0c;拿出来与诸位分享一下。本文从多个方面对接口测试的三款常用工具进行比较分析&#xff0c;以便于在特定的情况下选择最合适的工具&#xff0c;或者使用自己编写的工具…

Selenium Web自动化实践案例,跟着敲代码真香

1 项目背景 https://passport.csdn.net/login CSDN登录页面 2 功能实现 自动运行用例 自动生成测试报告 自动断言与截图 自动将最新测试报告发送到指定邮箱 数据&#xff0c;页面元素分离 PageObjectUnittestddt数据驱动用例 执行日志、分布式执行 3 项目架构…

多线程同步之:QWaitCondition

一、 QWaitCondition 不是通过 强制执行互斥&#xff0c;而是通过提供 条件变量 来同步线程。 1.1 使用 互斥量 和 QReadWriteLock&#xff0c;存在的一个问题 1.2 QWaitConditionQMutex 1.3 1.4 消费者线程先启动 2个线程启动的先后顺序不应调换&#xff1a;用先启动thread…

从零开发短视频电商 在AWS上用SageMaker部署自定义模型

文章目录 简介使用model.tar.gz1.从huggingface上下载模型2.自定义代码3.打包为tar 文件4.上传model.tar.gz到S35.部署推理 使用hub1.在sagemaker上新建个jupyterlab2.上传官方示例ipynb文件3.指定HF_MODEL_ID和HF_TASK进行部署和推理 inference.py官方示例 简介 原始链接&…

【RocketMQ每日一问】rocketmq事务消息原理?

rocketmq事务消息原理&#xff1f; RocketMQ的事务消息主要由三部分组成&#xff1a;半消息&#xff08;Half Message&#xff09;、执行本地事务和事务补偿机制。下面详细介绍这三部分&#xff1a; 半消息&#xff08;Half Message&#xff09;用户向RocketMQ发送半消息&…

基于ssm的星巴克咖啡店管理系统论文

基于ssm的星巴克咖啡店管理系统 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前星巴克咖啡店对于咖啡信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这…

【AI提示词艺术】第11期 家居几种类型图处理和人像生成的技巧

家居处理和人像生成的技巧 AI处理家居图像具有以下优势&#xff1a; 自动化处理&#xff1a;AI可以自动处理大量的家居图像&#xff0c;无需人工干预。这大大提高了处理效率&#xff0c;节省了时间和人力成本。 快速识别和分类&#xff1a;AI可以快速准确地识别和分类家居图…

LSTM和GRU vs 普通的循环神经网络RNN

1、考虑下列三种情况下&#xff0c;对比一下普通RNN的表现和LSTM和GRU表现&#xff1a; &#xff08;1&#xff09;早期观测值对预测未来观测者具有非常重要的意义。 考虑一个极端情况&#xff0c;其中第一个观测值包含一个校验和&#xff0c; 目标是在序列的末尾辨别校验和是…

常见的弧形导轨有哪些

弧形导轨又叫圆弧导轨、滚轮圆弧导轨&#xff0c;是通过v形滚轮在圆弧v型导轨表面滚动&#xff0c;作圆周运动&#xff0c;运用广泛&#xff1a;数控机床、包装机械、输送设备、医疗器械、航空航天等设备&#xff1b;弧形导轨也分几种&#xff0c;常见的弧形导轨有以下几种&…

关于时区处理策略

前端会通过 App-Id 请求头附带 客户端时区 信息 前端传入的如果是 字符串&#xff0c;会自动根据 请求的客户端时区 解析为对应的 日期 如果前端传入的是时间戳&#xff0c;则无需额外解析转换 如果是 商户后台、管理后台 都统一基于 商户所在国家的时区&#xff08;总台目前…

机器视觉:AI赋能缺陷检测,铸就芯片产品的大算力与高能效

导言&#xff1a;近年来&#xff0c;国内芯片行业快速发展&#xff0c;市场对芯片需求的不断增大&#xff0c;芯片的缺陷检测压力也越来越大。芯片产品在生产制造过程中&#xff0c;需要经历数道工序&#xff0c;每个生产环节的材料、环境、工艺参数等都有可能造成产品缺陷。不…

2023最新版JavaSE教程——第13天:泛型

目录 一、泛型概述1.1 生活中的例子1.2 泛型的引入 二、使用泛型举例2.1 集合中使用泛型2.1.1 举例2.1.2 练习 2.2 比较器中使用泛型2.2.1 举例2.2.2 练习 2.3 相关使用说明 三、自定义泛型结构3.1 泛型的基础说明3.2 自定义泛型类或泛型接口3.2.1 说明3.2.2 注意3.2.2 举例3.2…

react 2

1.快速搭建开发环境 2.react渲染流程 3.1 jsx基础 概念 3.2 jsx基础 本质 3.3 jsx基础 jsx表达式 3.4 jsx基础 实现列表渲染 3.5 jsx基础 实现条件渲染 3.5 jsx基础 实现复杂的条件渲染 4. react中事件绑定 5.react组建基础使用 6.1 useState 6.2 useState修改状态的规则 7.基础…