CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

APP ADC驱动

结构体

app_adc_params_t

结构体定义如下:

表 286 app_adc_params_t结构体成员
成员 描述 取值

app_adc_pin_cfg_t pin_cfg

配置ADC模块输入通道

参考app_adc_pin_cfg_t结构体

app_adc_dma_cfg_t dma_cfg

ADC DMA参数配置

参考app_adc_dma_cfg_t结构体

adc_init_t init

ADC需要的初始化配置

参考adc_init_t结构体

adc_env_t adc_env 仅用于记录初始化设备的句柄、相关参数等,不需要配置

详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h

app_adc_pin_cfg_t

结构体定义如下:

表 287 app_adc_pin_cfg_t结构体成员
成员 描述 取值

app_adc_pin_t channel_p

通道P引脚

参考app_adc_pin_t结构体

app_adc_pin_t channel_n

通道N引脚

参考app_adc_pin_t结构体

app_adc_pin_t extern_ref

外部参考源引脚

参考app_adc_pin_t结构体

详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h

app_adc_dma_cfg_t

结构体定义如下:

表 288 app_adc_dma_cfg_t结构体成员
成员 描述 取值

dma_regs_t * dma_instance

ADC模块ID

参考app_adc_params_t中DMA支持的外设

dma_channel_t dma_channel

ADC配置DMA通道

参考app_adc_params_t中通道描述

详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h

app_adc_pin_t

结构体定义如下:

表 289 app_adc_pin_t结构体成员
成员 描述 取值

app_io_type_t type

IO类型

APP_IO_TYPE_MSIO

app_io_mux_t mux

设置IO映射功能

APP_IO_MUX

uint32_t pin

IO引脚

GR551x:
  • APP_IO_PIN0~ APP_IO_PIN4
GR5526/GR5x25/GR533x/GR5405:
  • APP_IO_PIN0~ APP_IO_PIN7

详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h

adc_init_t

结构体定义如下:

表 290 adc_init_t结构体成员
成员 描述 取值

uint32_t channel_p

配置通道P映射

GR551x取值选项:
  • ADC_INPUT_SRC_IO0
  • ADC_INPUT_SRC_IO1
  • ADC_INPUT_SRC_IO2
  • ADC_INPUT_SRC_IO3
  • ADC_INPUT_SRC_IO4
  • ADC_INPUT_SRC_TMP
  • ADC_INPUT_SRC_BAT
  • ADC_INPUT_SRC_REF
GR5526/GR5x25/GR533x/GR5405取值选项:
  • ADC_INPUT_SRC_IO0
  • ADC_INPUT_SRC_IO1
  • ADC_INPUT_SRC_IO2
  • ADC_INPUT_SRC_IO3
  • ADC_INPUT_SRC_IO4
  • ADC_INPUT_SRC_IO5
  • ADC_INPUT_SRC_IO6
  • ADC_INPUT_SRC_IO7
  • ADC_INPUT_SRC_REF

说明:

与通道P配置结构体app_adc_pin_t的pin引脚对应,例如:通道P配置为MSIO0,则该参数为ADC_INPUT_SRC_IO0。

uint32_t channel_n

配置通道N映射

GR551x取值选项:
  • ADC_INPUT_SRC_IO0
  • ADC_INPUT_SRC_IO1
  • ADC_INPUT_SRC_IO2
  • ADC_INPUT_SRC_IO3
  • ADC_INPUT_SRC_IO4
  • ADC_INPUT_SRC_TMP
  • ADC_INPUT_SRC_BAT
  • ADC_INPUT_SRC_REF
GR5526/GR5x25/GR533x/GR5405取值选项:
  • ADC_INPUT_SRC_IO0
  • ADC_INPUT_SRC_IO1
  • ADC_INPUT_SRC_IO2
  • ADC_INPUT_SRC_IO3
  • ADC_INPUT_SRC_IO4
  • ADC_INPUT_SRC_IO5
  • ADC_INPUT_SRC_IO6
  • ADC_INPUT_SRC_IO7
  • ADC_INPUT_SRC_TMP
  • ADC_INPUT_SRC_BAT
  • ADC_INPUT_SRC_REF

说明:

ADC_INPUT_SRC_BAT表示测量芯片的供电电压,ADC_INPUT_SRC_TMP表示测量芯片内部温度,除此之外该参数与通道N配置结构体app_adc_pin_t的pin引脚对应,例如:通道N配置为MSIO0,则该参数为ADC_INPUT_SRC_IO0。

uint32_t input_mode

输入模式设置

该参数的取值可以是下列值中的任意一个:
  • ADC_INPUT_SINGLE(单端采样)
  • ADC_INPUT_DIFFERENTIAL(差分采样)

uint32_t ref_source

参考源设置

该参数的取值可以是下列值中的任意一个:
  • ADC_REF_SRC_BUF_INT(内部参考源)
  • ADC_REF_SRC_IO0
  • ADC_REF_SRC_IO1
  • ADC_REF_SRC_IO2
  • ADC_REF_SRC_IO3

uint32_t ref_value

内部参考源参考电压设置(外部参考,该参数无意义)

该参数的取值可以是下列值中的任意一个:
  • ADC_REF_VALUE_0P8(0.85 V)
  • ADC_REF_VALUE_1P2(1.28V)
  • ADC_REF_VALUE_1P6(1.6 V)
  • ADC_REF_VALUE_2P0(2.0 V,GR551x/GR533x/GR5405不适用)

uint32_t clock

ADC时钟设置

该参数的取值可以是下列值中的任意一个:

GR5526/GR5x25/GR533x/GR5405:

  • ADC_CLK_16M
  • ADC_CLK_8M
  • ADC_CLK_4M
  • ADC_CLK_2M
  • ADC_CLK_1M
  • ADC_CLK_16K
  • ADC_CLK_8K
  • ADC_CLK_4K
  • ADC_CLK_NONE(关闭时钟)
GR551x:
  • ADC_CLK_16M
  • ADC_CLK_1P6M
  • ADC_CLK_8M
  • ADC_CLK_4M
  • ADC_CLK_2M
  • ADC_CLK_1M
详细信息请参考文件:
  • GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_ll_adc.h
  • GR533x:SDK_Folder\drivers\inc\hal\gr533x_ll_adc.h
  • GR5405:SDK_Folder\hal_drv\include\ll_adc.h

枚举

app_adc_evt_t

枚举定义如下:

表 291 app_adc_evt_t枚举成员
成员 描述 取值

app_adc_evt_type_t type

ADC事件结构体

APP_ADC_EVT_CONV_CPLT转换完成

详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h

app_adc_sample_node_t

说明:

该枚举仅适用于GR551x。

枚举定义如下:

表 292 app_adc_samle_node_t枚举成员
成员 描述 取值

uint32_t channel

ADC采样通道

该参数的取值可以是下列值中的任意一个:
  • ADC_INPUT_SRC_IO0
  • ADC_INPUT_SRC_IO1
  • ADC_INPUT_SRC_IO2
  • ADC_INPUT_SRC_IO3
  • ADC_INPUT_SRC_TMP
  • ADC_INPUT_SRC_BAT
  • ADC_INPUT_SRC_REF

uint16_t *p_buf

采样得到的原始数据,由用户分配空间。

uint32_t len

采样的原始数据个数,由用户指定个数。

struct link_node *next

用于多通道采样的输入参数,采完一个通道后,自动采样下一个节点对应的通道。

详细信息请参考文件:SDK_Folder\drivers\inc\app_adc.h

app_adc_evt_type_t

枚举定义如下:

表 293 app_adc_evt_type_t枚举成员
成员 描述

APP_ADC_EVT_CONV_CPLT

ADC转换完成

app_adc_dma_state_t

枚举定义如下:

表 294 app_adc_dma_state_t枚举成员
成员 描述
APP_ADC_DMA_INVALID ADC DMA模式不可用
APP_ADC_DMA_ACTIVITY ADC DMA模式激活

app_adc_state_t

枚举定义如下:

表 295 app_adc_state_t枚举成员
成员 描述

APP_ADC_INVALID = 0

ADC不可用

APP_ADC_ACTIVITY

ADC激活

APP_ADC_SLEEP

ADC睡眠

接口函数

表 296 ADC驱动接口函数
API 芯片
GR551x GR5526 GR5x25 GR533x GR5405

app_adc_init

Y

Y

Y

Y

Y

app_adc_deinit

Y

Y

Y

Y

Y

app_adc_conversion_sync

Y

Y

Y

Y

Y

app_adc_conversion_async

Y

Y

Y

Y

Y

app_adc_voltage_intern

Y

Y

Y

Y

Y

app_adc_voltage_extern

Y

Y

Y

Y

Y

app_adc_temperature_conv

N

Y

Y

Y

Y

app_adc_vbat_conv

N

Y

Y

Y

Y

app_adc_get_handle

Y

Y

Y

Y

Y

app_adc_multi_channel_conversion_async

Y

N

N N N

app_adc_init

表 297 app_adc_init接口
函数原型

uint16_t app_adc_init(app_adc_params_t *p_params, app_adc_evt_handler_t evt_handler)

功能说明

初始化ADC

输入参数
  • p_params:初始化参数的结构体指针
  • evt_handler:用户自己实现的中断回调函数
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

回调函数形式参照typedef void (*app_adc_evt_handler_t)(app_adc_evt_t *p_evt);

HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理。

app_adc_deinit

表 298 app_adc_deinit接口
函数原型

uint16_t app_adc_deinit(void)

功能说明

反初始化ADC

输入参数
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_adc_conversion_sync

表 299 app_adc_conversion_sync接口
函数原型

uint16_t app_adc_conversion_sync(uint16_t *p_data, uint32_t length, uint32_t timeout)

功能说明

开启ADC同步转换

输入参数
  • p_data:ADC数据的buffer
  • length:采样数据长度
  • timeout:超时时间,以ms为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_adc_conversion_async

表 300 app_adc_conversion_async接口
函数原型

uint16_t app_adc_conversion_async(uint16_t *p_data, uint32_t length)

功能说明

开启ADC异步转换

输入参数
  • p_data:ADC数据的buffer
  • length:采样数据长度
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_adc_voltage_intern

表 301 app_adc_voltage_intern接口
函数原型

uint16_t app_adc_voltage_intern(uint16_t *inbuf, double *outbuf, uint32_t buflen)

功能说明

将使用内部参考源的ADC数值转换为电压值

输入参数
  • inbuf:ADC数据的buffer
  • outbuf:电压值的buffer
  • buflen:转换的数据长度
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注 参考源采用内部参考时调用该函数

app_adc_voltage_extern

表 302 app_adc_voltage_extern接口
函数原型

uint16_t app_adc_voltage_extern(double ref, uint16_t *inbuf, double *outbuf, uint32_t buflen)

功能说明

将使用外部参考源的ADC数值转化为电压值

输入参数
  • ref:外部参考电压的大小
  • inbuf:ADC数据的buffer
  • outbuf:电压值的buffer
  • buflen:转换的数据长度
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注 参考源采用外部参考时使用

app_adc_temperature_conv

表 303 app_adc_temperature_conv接口
函数原型

uint16_t app_adc_temperature_conv(uint16_t *inbuf, double *outbuf, uint32_t buflen)

功能说明

ADC数值转换为内部芯片温度

输入参数
  • inbuf:ADC数据的buffer
  • outbuf:内部芯片温度数据的buffer
  • buflen:转换的数据长度
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_adc_vbat_conv

表 304 app_adc_vbat_conv接口
函数原型

uint16_t app_adc_vbat_conv(uint16_t *inbuf, double *outbuf, double *outbuf, uint32_t buflen)

功能说明

ADC数值转换为电池电压

输入参数
  • inbuf:ADC数据的buffer
  • outbuf:电池电压数据的buffer
  • buflen:转换的数据长度
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_adc_get_handle

表 305 app_adc_get_handle接口
函数原型

adc_handle_t *app_adc_get_handle(void)

功能说明

获取ADC句柄

输入参数
返回值
adc句柄,详见
  • GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_ll_adc.h
  • GR533x:SDK_Folder\drivers\inc\hal\gr533x_ll_adc.h
  • GR5405:SDK_Folder\hal_drv\include\ll_adc.h
备注

app_adc_multi_channel_conversion_async

表 306 app_adc_multi_channel_conversion_async接口
函数原型

uint16_t app_adc_multi_channel_conversion_async(app_adc_samle_node_t *p_begin_node, uint32_t total_nodes)

功能说明

开启ADC多通道异步转换

输入参数
  • p_begin_node:多通道采样的通道链表指针
  • total_nodes:采样通道数
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

DMA接口函数

表 307 接口函数
API 芯片
GR551x GR5526 GR5x25 GR533x GR5405

app_adc_dma_init

Y

Y

Y

Y

Y

app_adc_dma_deinit

Y

Y

Y

Y

Y

app_adc_dma_conversion_async

Y

Y

Y

Y

Y

app_adc_dma_init

表 308 app_adc_dma_init接口
函数原型

uint16_t app_adc_dma_init(app_adc_params_t *p_params)

功能说明

初始化DMA方式传输的ADC模块

输入参数

p_params:初始化参数的结构体指针

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_adc_dma_deinit

表 309 app_adc_dma_deinit接口
函数原型

uint16_t app_adc_dma_deinit(void)

功能说明

反初始化DMA方式传输的ADC模块

输入参数
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_adc_dma_conversion_async

表 310 app_adc_dma_conversion_async接口
函数原型

uint16_t app_adc_dma_conversion_async(uint16_t *p_data, uint32_t length)

功能说明

开启ADC异步DMA转换

输入参数
  • p_data:ADC数值的buffer
  • length:采样数据长度
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

示例工程

ADC实现DMA方式对输入电压测量

ADC有两种采样模式:单端采样和差分采样。

  • 单端采样时,用户需将有效信号连接至MSIO其中的一个引脚,单端输入信号幅值范围在0 ~ 2*Vref,且不大于VBAT。
  • 差分采样时,用户需输入差分信号至MSIO中的两个引脚,差分输入信号幅值范围在-2*Vref ~ +2*Vref,共模值大于0.8 V。

示例工程实现ADC单端DMA采样,工程路径:SDK_Folder\projects\peripheral\adc\adc

流程图

示例工程初始化ADC模块,采样单端采样,仅通道N为有效输入信号,配置通道N为MSIO1;用户将有效信号接入MSIO1引脚,开启ADC采样后将采集MSIO1有效信号,最后将有效信号的值转换为内部电压值并打印。

图 23 ADC输入电压测量流程

初始化参数

app_adc_params_t adc_params = {
    .pin_cfg = {
        .channel_p = {
            .type = APP_IO_TYPE_MSIO,
            .mux  = APP_IO_MUX_7,
            .pin  = APP_ADC_P_INPUT_PIN,
        },
        .channel_n = {
            .type = APP_IO_TYPE_MSIO,
            .mux  = APP_IO_MUX_7,
            .pin  = APP_ADC_N_INPUT_PIN,
        },
    },
    .dma_cfg = {
        .dma_instance = DMA0,
        .dma_channel  = DMA_Channel0,
    },
    .init = {
        .channel_p  = ADC_INPUT_SRC_IO0,
        .channel_n  = ADC_INPUT_SRC_IO1,
        .input_mode = ADC_INPUT_SINGLE,
        .ref_source = ADC_REF_SRC_BUF_INT,
        .ref_value  = ADC_REF_VALUE_1P6,
        .clock      = ADC_CLK_1M,
    },
};
  • pin_cfg:引脚配置
    • pin_cfg.channel_p:ADC通道p引脚配置
    • pin_cfg.channel_n:ADC通道n引脚配置
  • dma_cfg:DMA参数配置
    • dma_cfg.dma_instance:DMA实例使用DMA0
    • dma_cfg.dma_channel:DMA实例使用DMA0通道0
    • init.channel_p:配置通道P映射,选择ADC_INPUT_SRC_IO0(和通道P引脚配置对应,MSIO0对应ADC_INPUT_SRC_IO0)
    • init.channel_n:配置通道N映射,选择ADC_INPUT_SRC_IO1(和通道N引脚配置对应,MSIO1对应ADC_INPUT_SRC_IO1)
  • init:ADC采集参数配置
    • init.input_mode:采样模式选择ADC_INPUT_SINGLE(单端采样)
    • init.ref_source:参考源选择ADC_REF_SRC_BUF_INT(选择内部参考源)
    • init.ref_value:内部参考源参考电压:ADC_REF_VALUE_1P6(选择1.6 V,输入量程为0 V~3.2 V)
    • init.clock:ADC时钟设置:ADC_CLK_1M(1 MHz)

重要函数

  • 初始化ADC
    app_adc_init(&adc_params, app_adc_evt_handler)
  • 配置DMA方式
    app_adc_dma_init(&adc_params)
  • 开启ADC DMA采集
    app_adc_dma_conversion_async(conversion, TEST_CONV_LENGTH)
    • conversion:采集的ADC数值集合
    • TEST_CONV_LENGTH:采集ADC数据的个数
  • 转换成内部电压
    app_adc_voltage_intern(conversion, voltage, TEST_CONV_LENGTH)
    • voltage:转换后电压值集合
    • TEST_CONV_LENGTH:数据个数

测试验证

外部输入电压到MSIO1,连接开发板到PC端,打开串口助手,连接串口,查看串口日志,观察串口打印,ADC 测量的电压等于输入电压,表明ADC采集电压准确。

电源输出0.5 V电压,将电源输出接到MSIO1,连接开发板到PC端,串口打印如下,测量电压为0.5 V左右。

Start single sampling.
DMA conversion is done.
Conversion value:
0.503V  0.506V  0.498V  0.490V  0.469V  0.498V  0.503V  0.501V  0.506V  0.502V  0.505V  0.495V  0.501V  0.497V  0.500V  0.495V  0.496V  0.492V  0.484V  0.504V  0.490V  0.501V  0.489V  0.493V  0.495V  0.499V  0.509V  0.498V  0.502V  0.501V  0.497V  0.494V  0.500V  0.510V  0.500V  0.485V  0.506V  0.499V  0.493V  0.502V  0.498V  0.499V  0.497V  0.503V  0.496V  0.502V  0.503V  0.498V  0.496V  0.503V  0.501V  0.500V  0.495V  0.504V  0.498V  0.503V  0.497V  0.494V  0.506V  0.500V  0.493V  0.501V  0.490V  0.500V  0.498V  0.493V  0.501V  0.486V  0.495V  0.495V  0.493V  0.506V  0.501V  0.491V  0.494V  0.494V  0.496V  0.498V  0.498V  0.492V  0.499V  0.492V  0.498V  0.495V  0.495V  0.497V  0.496V  0.508V  0.506V  0.522V  0.506V  0.500V  0.501V  0.501V  0.495V  0.500V  0.500V  0.502V  0.493V  0.499V  0.497V  0.492V  0.497V  0.503V  0.498V  0.492V  0.492V  0.495V  0.492V  0.492V  0.489V  0.495V  0.498V  0.492V  0.492V  0.493V  0.489V  0.491V  0.496V  0.489V  0.500V  0.501V  0.501V  0.506V  0.505V  0.500V  0.494V  0.505V

ADC电池电压的测量

工程路径:SDK_Folder\projects\peripheral\adc\adc

流程图

图 24 ADC电池电压测量流程图

ADC能实现电池电压的测量,通道应该选择ADC_INPUT_SRC_BAT,开启采样求取采样平均值,将平均采样值转换成电池电压。

初始化参数

实现对电池电压的采集,主要修改如下参数,其它参数参考ADC实现DMA方式对输入电压测量

adc_params_t.init.channel_n = ADC_INPUT_SRC_BAT; 
adc_params_t.init.ref_value = ADC_REF_VALUE_0P8;
  • init.channel_n:ADC_INPUT_SRC_BAT(通道为BAT,测量的信号来自内部的分压电路)
  • init.ref_value:ADC_REF_VALUE_0P8(0.85 V)

可检测的VBAT范围请参考对应芯片系列Datasheet,当选择ADC的通道为BAT时,测量的信号来自内部的分压电路(确保输入在0 ~ 1.6 V),所以参考电压应选择0.85 V,以提升测量精度。

重要函数

采集值转换成电池电压:

app_adc_vbat_conv((uint16_t *)&aver, &vbat, 1)

测试验证

连接开发板到PC端,打开串口助手,连接串口,查看串口日志,串口将打印电池电压值。

Start Vbattery sampling.
DMA conversion is done.
Average Vbattery cocdes = 4000
Vbattery= 3.307 V

ADC实现DMA方式对芯片内部温度测量

工程路径:SDK_Folder\projects\peripheral\adc\adc

流程图

图 25 ADC芯片内部温度测量流程

ADC能实现芯片内部温度的测量,通道应选择ADC_INPUT_SRC_TMP,开启采样求取采样平均值,将平均采样值转换成芯片内部温度。

初始化参数

实现对芯片内部温度的采集,主要修改如下参数,其他参数参考ADC实现DMA方式对输入电压测量

adc_params_t.init.channel_n = ADC_INPUT_SRC_TMP; 
adc_params_t.init.ref_value = ADC_REF_VALUE_0P8;
  • init.channel_n:ADC_INPUT_SRC_TMP(通道为TMP,测量的信号来自内部的分压电路)
  • init.ref_value:ADC_REF_VALUE_0P8(0.85 V)

重要函数

采样值转换成芯片内部温度:

app_adc_temperature_conv((uint16_t *)&aver, &temp, 1)

测试验证

连接开发板到PC端,打开串口助手,连接串口,查看串口日志,串口将打印芯片内部温度。

Start temperature sampling.
DMA conversion is done.
Average Temperature cocdes = 1594
Temperature value= 26.6 C

扫描关注

打开微信,使用“扫一扫”即可关注。