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
更多回帖