前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全志R128 SDK HAL 模块开发指南——GPADC

全志R128 SDK HAL 模块开发指南——GPADC

作者头像
阿志小管家
发布2024-03-29 10:10:57
890
发布2024-03-29 10:10:57
举报

GPADC

模块介绍

GPADC 是 12bit 采集精度的模数转换模块,支持 4 路通道,模拟输入范围 0-1.8v,最高采样率 1MHZ,并且支持数据比较,自校验功能,同时工作于可配置的四种工作模式:

  • Single mode:在指定的通道完成一次转换并将数据放在响应数据寄存器中;
  • Single-cycle mode:在指定的通道完成一个周期转换并将数据放在响应数据寄存器中;
  • Continuous mode:在指定的通道持续转换并将数据放在响应数据寄存器中;
  • Burst mode:边采样边转换并将数据放入 32 字节的 FIFO,支持中断控制。

一般来说 GPADC 接口用于 KEY 模块按键的读取,一般包括 VOL+、VOL-、HOME、MENU、ENTER 等等,GPADC0 用于 KEY 的电路如上图。AVCC-AP 为 1.8V 的供电,不同的按键按下,GPADC 口的电压不同,CPU 通过对这个电压的采样来确定具体是那一个按键按下。如下图,VOL+、VOL-、MENU、ENTER、HOME对应的电压分别为 0.21V、0.41V、0.59V、0.75V、0.88V。

在这里插入图片描述
在这里插入图片描述

模块配置

其 menuconfig 的配置如下:

代码语言:javascript
复制
Kernel Setup --->
    Drivers Setup --->
        SoC HAL Drivers --->
            GPADC devices --->
                [*] enable gpadc driver
                [*] enbale gpadc hal APIs Test command

源码结构

GPADC 模块源码结构如下所示:

代码语言:javascript
复制
rtos-hal/
|--hal/source/gpadc/hal_gpadc.c    // hal层接口代码
|--include/hal/sunxi_hal_gpadc.h   // 头文件

模块接口说明

头文件:

代码语言:javascript
复制
#include <sunxi_hal_gpadc.h>
GPADC 初始化接口

GPADC 模块初始化,主要初始化时钟,中断以及采样率配置等

代码语言:javascript
复制
int hal_gpadc_init(void)

参数:

返回值:

  • 0 代表成功
  • 负数代表失败
GPADC 通道配置接口

选择并配置 GPADC 某个通道

代码语言:javascript
复制
hal_gpadc_status_t hal_gpadc_channel_init(hal_gpadc_channel_t channal)

参数:

  • channel:通道号

返回值:

  • 0 代表成功
  • 负数代表失败
GPADC 通道取消配置接口

取消 GPADC 某个通道配置

代码语言:javascript
复制
hal_gpadc_status_t hal_gpadc_channel_exit(hal_gpadc_channel_t channal)

参数:

  • channel:通道号

返回值:

  • 0 代表成功
  • 负数代表失败
GPADC 去初始化接口

GPADC 模块去初始化

代码语言:javascript
复制
hal_gpadc_status_t hal_gpadc_deinit(void)

参数:

返回值:

  • 0 代表成功
  • 负数代表失败
GPADC 注册回调接口

向应用层提供注册回调接口的功能

代码语言:javascript
复制
hal_gpadc_status_t hal_gpadc_register_callback(hal_gpadc_channel_t channal, gpadc_callback_t user_callback)

参数:

  • channel:通道号
  • user_callback:应用层回调接口

返回值:

  • 0 代表成功
  • 负数代表失败

模块使用范例

读取电压
代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>

#include <hal_log.h>
#include <hal_cmd.h>
#include <sunxi_hal_gpadc.h>

int channel = -1;

int cmd_test_gpadc(int argc, char **argv)
{
    int ret = -1;
    uint32_t vol_data;

    printf("Run gpadc test\n");

    if (argc < 2)
    {
	    hal_log_err("usage: hal_gpadc channel\n");
	    return -1;
    }

    ret = hal_gpadc_init();
    if (ret) {
        hal_log_err("gpadc init failed!\n");
        return -1;
    }

    channel = strtol(argv[1], NULL, 0);

    if (channel < 0 || channel > CHANNEL_NUM)
    {
        hal_log_err("channel %d is wrong, must between 0 and %d\n", CHANNEL_NUM);
        return -1;
    }

    hal_gpadc_channel_init(channel);
    vol_data = gpadc_read_channel_data(channel);
    printf("channel %d vol data is %u\n", channel, vol_data);
    hal_gpadc_channel_exit(channel);
    hal_gpadc_deinit();

    return 0;
}

FINSH_FUNCTION_EXPORT_CMD(cmd_test_gpadc, hal_gpadc, gpadc hal APIs tests)
回调方式读取电压
代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>

#include <hal_log.h>
#include <hal_cmd.h>
#include <sunxi_hal_gpadc.h>

int channel = -1;

int sunxigpadc_irq_callback(uint32_t dada_type, uint32_t data)
{
    int vol_data;
    data = ((VOL_RANGE / 4096) * data);
    vol_data = data / 1000;
    printf("channel %d vol data: %d\n", channel, vol_data);
    hal_gpadc_channel_exit(channel);
    hal_gpadc_deinit();
    return 0;
}

int cmd_test_gpadc_callback(int argc, char **argv)
{
    int ret = -1;
    uint32_t vol_data;

    printf("Run gpadc test\n");

    if (argc < 2)
    {
	    hal_log_err("usage: hal_gpadc channel\n");
	    return -1;
    }

    ret = hal_gpadc_init();
    if (ret) {
        hal_log_err("gpadc init failed!\n");
        return -1;
    }

    channel = strtol(argv[1], NULL, 0);

    if (channel < 0 || channel > CHANNEL_NUM)
    {
        hal_log_err("channel %d is wrong, must between 0 and %d\n", CHANNEL_NUM);
        return -1;
    }

    hal_gpadc_channel_init(channel);
    hal_gpadc_register_callback(channel, sunxigpadc_irq_callback);

    return 0;
}

FINSH_FUNCTION_EXPORT_CMD(cmd_test_gpadc_callback, hal_gpadc callback, gpadc hal APIs tests callback)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GPADC
    • 模块介绍
      • 模块配置
        • 源码结构
          • 模块接口说明
            • GPADC 初始化接口
            • GPADC 通道配置接口
            • GPADC 通道取消配置接口
            • GPADC 去初始化接口
            • GPADC 注册回调接口
          • 模块使用范例
            • 读取电压
            • 回调方式读取电压
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档