GPADC 是 12bit 采集精度的模数转换模块,支持 4 路通道,模拟输入范围 0-1.8v,最高采样率 1MHZ,并且支持数据比较,自校验功能,同时工作于可配置的四种工作模式:
一般来说 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 的配置如下:
Kernel Setup --->
Drivers Setup --->
SoC HAL Drivers --->
GPADC devices --->
[*] enable gpadc driver
[*] enbale gpadc hal APIs Test command
GPADC 模块源码结构如下所示:
rtos-hal/
|--hal/source/gpadc/hal_gpadc.c // hal层接口代码
|--include/hal/sunxi_hal_gpadc.h // 头文件
头文件:
#include <sunxi_hal_gpadc.h>
GPADC 模块初始化,主要初始化时钟,中断以及采样率配置等
int hal_gpadc_init(void)
参数:
返回值:
选择并配置 GPADC 某个通道
hal_gpadc_status_t hal_gpadc_channel_init(hal_gpadc_channel_t channal)
参数:
返回值:
取消 GPADC 某个通道配置
hal_gpadc_status_t hal_gpadc_channel_exit(hal_gpadc_channel_t channal)
参数:
返回值:
GPADC 模块去初始化
hal_gpadc_status_t hal_gpadc_deinit(void)
参数:
返回值:
向应用层提供注册回调接口的功能
hal_gpadc_status_t hal_gpadc_register_callback(hal_gpadc_channel_t channal, gpadc_callback_t user_callback)
参数:
返回值:
#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)
#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)
更多回帖