嵌入式技术论坛
直播中

杨静

7年用户 1452经验值
私信 关注
[经验]

浅析基于AB32VG1开发板的ADC外设测评步骤

1.RT-Thread Studio工程创建

首先打开Rtt studio创建AB32VG1开发板的工程,如图1.1所示

由于这款“骁龙”开发板已经内置RTTHREAD所以在创建工程的时候可以直接点击基于开发板创建,如图1.2所示

由此已经创建好基于这款AB32VG1芯片开发板的基础工程,点击编译看看是否有没有配置的选项导致编译失败。

2.添加官方ADC驱动

在建立好基础工程并且编译完成无错后,下一步骤先添加官方ADC驱动,第一步打开软件包中心,点击更多配置找到使用ADC设备驱动程序选项点击添加,如图2.1所示

然后点击保存,由此官方ADC驱动添加完成。

3.编写AB32VG1 ADC底层代码

由于这款开发板并没有官方人员提供ADC的底层驱动,想要实现ADC采集测试需要自行编写ADC底层驱动,第一步在图3.1所示文件位置新建ab32vg1_hal_adc.h drv_adc.c adc_config.h文件

如代码3.1所示,在adc_config.h文件添加如下代码

#ifndef LIBRARIES_HAL_DRIVERS_CONFIG_ADC_CONFIG_H_

#define LIBRARIES_HAL_DRIVERS_CONFIG_ADC_CONFIG_H_

#include <rtthread.h>

#ifdef __cplusplus

extern "C" {

#endif

#ifdef BSP_USING_ADC9

#ifndef ADC9_CONFIG

#define ADC9_CONFIG \

{                                                   \

   .adc_dat_handle      = (hal_sfr_t)&SADCDAT9,     \

   .name                = "adc9",                   \

}

#endif /* ADC9_CONFIG */

#endif /* BSP_USING_ADC9 */

#ifdef __cplusplus

}

#endif

#endif /* LIBRARIES_HAL_DRIVERS_CONFIG_ADC_CONFIG_H_ */

如代码3.2所示,在drv_adc.c文件中添加如下代码

#include "drv_gpio.h"

#ifdef BSP_USING_ADC9

#include "adc_config.h"

#define LOG_TAG "drv.adc"

#include <drv_log.h>

struct ab32_adc

{

struct rt_adc_device ab32_adc_device;

hal_sfr_t adc_dat_handle;

char *name;

};

enum

{

#ifdef BSP_USING_ADC9

ADC9_INDEX,

#endif

ADC_INDEX_END

};

static struct ab32_adc ab32_adc_obj[] =

{

#ifdef BSP_USING_ADC9

ADC9_CONFIG,

#endif

};

static rt_err_t ab32_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled)

{

RT_ASSERT(device != RT_NULL);

hal_adc_enable(enabled);

return RT_EOK;

}

static rt_err_t ab32_get_adc_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value)

{

hal_sfr_t ab32_adc_handler;

RT_ASSERT(device != RT_NULL);

RT_ASSERT(value != RT_NULL);

ab32_adc_handler = device->parent.user_data;

hal_adc_start((1u <<  9));

*value = ab32_adc_handler[channel];

return RT_EOK;

}

static const struct rt_adc_ops _adc_ops =

{

.enabled = ab32_adc_enabled,

.convert = ab32_get_adc_value,

};

static int ab32_adc_init(void)

{

int result = RT_EOK;

int i = 0;

if (ADC_INDEX_END == 0) {

    return result;

}

for (i = 0; i < sizeof(ab32_adc_obj) / sizeof(ab32_adc_obj[0]); i++) {

    if (rt_hw_adc_register(&ab32_adc_obj[i].ab32_adc_device,

        ab32_adc_obj[i].name, &_adc_ops,

        (const void *)ab32_adc_obj[i].adc_dat_handle) == RT_EOK){

        LOG_D("%s init success", ab32_adc_obj[i].name);

    }

    else{

        LOG_E("%s register failed", ab32_adc_obj[i].name);

        result = -RT_ERROR;

    }

}

return result;

}

INIT_BOARD_EXPORT(ab32_adc_init);

#endif

如代码3.3所示,在ab32vg1_hal_conf.h中开启使用adc

#define HAL_ADC_MODULE_ENABLED

#ifdef HAL_ADC_MODULE_ENABLED

#include "ab32vg1_hal_adc.h"

#endif

最后由代码3.4所示,在rtconfig.h中添加如下代码启用通道adc9

#define BSP_USING_ADC

#define BSP_USING_ADC9

4.实现ADC应用

由此我们添加完成了ADC的所以驱动,下一步骤编写上层ADC应用,在application文件新建一个.c文件,并在里面添加如下代码,代码由4.1所示

#include <rtthread.h>

#include <rtdevice.h>

#define ADC_DEV_NAME "adc9" /* ADC 设备名称 */

#define ADC_DEV_CHANNEL 9 /* ADC 通道 */

#define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/

#define CONVERT_BITS (1 << 12) /* 转换位数为12位 */

static int adc_vol_sample(int argc, char *argv[])

{

rt_adc_device_t adc_dev;

rt_uint32_t value, vol;

rt_err_t ret = RT_EOK;

/* 查找设备 */

adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);

if (adc_dev == RT_NULL)

{

    rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);

    return RT_ERROR;

}

/* 使能设备 */

ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);

/* 读取采样值 */

value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);

rt_kprintf("the value is :%d \n", value);

/* 转换为对应电压值 */

vol = value * REFER_VOLTAGE / CONVERT_BITS;

rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);

/* 关闭通道 */

ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);

return ret;

}

/* 导出到 msh 命令列表中 */

MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);

当然由于官方人员并没有提供完整的ADC寄存器定义,并且RTTHREAD STUDIO中添加的工程文件也缺乏ADC相关的寄存器定义,导致底层的定义代码编写无法展开,亦由于本人技术有限,在有效文件信息下缺乏驱动开发的思路,所以如果由官方人员看到此文章望尽快完善ADC相关文件。

5.Finsh控制台控制ADC设备

在前面的步骤下,基本上完成了ADC驱动的开发,打开官方提供的downloader软件,并连接相应串口,效果如图5.1所示

下一步骤在控制台输入list_device命令查看adc设备是否添加成功,如图5.2所示

最后,在控制台输入 adc_vol_sample命令启用代码4.1来运行ADC,效果如图5.2所示

这里可以明显的看到,显示的电压和AD值均为0,因为底层的驱动没有添加,导致实际物理设备没有采集ADC的功能。

6.总结

至此,我的测评应该算告一段落,在实现ADC功能之前我体验了此款开发板的其他功能,感觉这个芯片功能非常强大,但是ADC功能并没有真正的实现,这在我心里始终是一个结,所以我会继续关注此芯片的相关信息,并认真的去学习这款芯片的具体操作,希望在我以后的工作中能用上这款功能强大的芯片。

原作者:CPU_X_2048

更多回帖

发帖
×
20
完善资料,
赚取积分