基于RT1052 Aworks 使能ADC功能(四)

本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发

在适配ADC硬件时,先学习Aworks ADC编程的接口,查看Aworks提供的测试demo,才知道其导出什么样的接口供应用层使用。只要在注册ADC时,确认了其对应的通道号,编程起来就很轻松了。

1. 首先阅读原理图

在RT1052上面有两个ADC控制器,每个控制器各16个转换通道,RT1052有些引脚只能当作数字引脚,有些引脚同时支持数字引脚和模拟引脚功能

2. 设备资源及驱动适配

2.1 设备资源的注册

其设备资源均在awbl_hwconf_imx1050_adc1.h awbl_hwconf_imx1050_adc2.h注册
所以需要先确认硬件设计上对应的ADC引脚,在如下两个函数当中打开即可。

aw_local void __imx1050_adc1_plfm_init (void)
{
    int i = 0;

    aw_local aw_const int adc1_gpios[] = {

       //GPIO1_27,      /* channel 0 */
       //GPIO1_12,     /* channel 1 */
       //GPIO1_13,     /* channel 2 */
       //GPIO1_14,       /* channel 3 */
       //GPIO1_15,       /* channel 4 */
       //GPIO1_16,     /* channel 5 */
       //GPIO1_17,     /* channel 6 */
       //GPIO1_18,     /* channel 7 */
       //GPIO1_19,     /* channel 8 */
			 /*SWS_DET_AD*/
       GPIO1_20,     /* channel 9 */
			 /*BRAKE_DET_AD*/
       GPIO1_21,     /* channel 10 */
       //GPIO1_22,     /* channel 11 */
       //GPIO1_23,     /* channel 12 */
			 /* Reserve1_DET_AD */
       GPIO1_24,     /* channel 13 */
			 /* Reserve2_DET_AD */
       GPIO1_25,     /* channel 14 */
			 /*Reserve3_DET_AD*/
       GPIO1_26,     /* channel 15 */
    };


    if (aw_gpio_pin_request("adc1_gpios",
                             adc1_gpios,
                             AW_NELEMENTS(adc1_gpios)) == AW_OK) {

        for (i = 0; i <  AW_NELEMENTS(adc1_gpios); i++) {

            /* ÅäÖÃADÒý½Å */
            aw_gpio_pin_cfg(adc1_gpios[i], IMX1050_PAD_CTL(0));
        }
    }

    aw_clk_enable(IMX1050_CLK_CG_ADC1);
};

aw_local void __imx1050_adc2_plfm_init (void)
{
    int i = 0;
    aw_local aw_const int adc2_gpios[] = {
        /*Reserve4_DET_AD*/
        GPIO1_27,   /* channel 16 */
			  /*VDD_DET*/
        GPIO1_28,     /* channel 17 */
			  /*NTC_AD*/
        GPIO1_29,     /* channel 18 */
        //GPIO1_30,     /* channel 19 */
        //GPIO1_31,     /* channel 20 */
        //GPIO1_16,   /* channel 21  */
        //GPIO1_17,   /* channel 22  */
        //GPIO1_18,   /* channel 23  */
        //GPIO1_19,   /* channel 24  */
        //GPIO1_20,   /* channel 25 */
        //GPIO1_21,   /* channel 26 */
        //GPIO1_22,   /* channel 27 */
        //GPIO1_23,   /* channel 28 */
        //GPIO1_24,   /* channel 28 */
        //GPIO1_25,   /* channel 30 */
        //GPIO1_26,   /* channel 31 */
    };


    if (aw_gpio_pin_request("adc2_gpios",
                             adc2_gpios,
                             AW_NELEMENTS(adc2_gpios)) == AW_OK) {

        for (i = 0; i <  AW_NELEMENTS(adc2_gpios); i++) {

            /* ÅäÖÃADÒý½Å */
            aw_gpio_pin_cfg(adc2_gpios[i], IMX1050_PAD_CTL(0));
        }
    }

    aw_clk_enable(IMX1050_CLK_CG_ADC2);
};

2.2 设备驱动的注册

在aw_prj_config.c文件当中

#ifdef AW_DRV_IMX1050_ADC
    awbl_imx10xx_adc_drv_register();
#endif

2.3 设备宏开关

在aw_prj_param_auto_cfg.h文件当中,如果定义了AW_DEV_IMX1050_ADC1 AW_DEV_IMX1050_ADC2对就的宏AW_DRV_IMX1050_ADC就会被定义,ADC控制器驱动就会被注册。所以我们只需要在aw_prj_params.h中打开如下两个宏. 至此BSP适配完毕,可以通过Awork标准接口进行访问。

aw_prj_params.h

#define AW_DEV_IMX1050_ADC1             /**< rief iMX1050 ADC */
#define AW_DEV_IMX1050_ADC2             /**< rief iMX1050 ADC2 */
aw_prj_param_auto_cfg.h
/**
 * 
ame ÄÚ²¿ADC
 * @{
 */
#if defined  AW_DEV_IMX1050_ADC1 || 
    defined  AW_DEV_IMX1050_ADC2

#ifndef AW_COM_ADC
#define AW_COM_ADC
#endif

#define AW_DRV_IMX1050_ADC
#endif
/** @} */

3. 如何测式

#define ADC_TEST

#define SWS_DET_AD_CH_NUM            9
#define BRAKE_DET_AD_CH_NUM         10
#define Reserve1_DET_AD_CH_NUM      13
#define Reserve2_DET_AD_CH_NUM      14
#define Reserve3_DET_AD_CH_NUM      15
#define Reserve4_DET_AD_CH_NUM      16
#define VDD_DET_AD_CH_NUM           17
#define NTC_AD_CH_NUM               18

#define ADC_CH_NUMS  8

int ch_num_buf[ADC_CH_NUMS] = {
	SWS_DET_AD_CH_NUM,
	BRAKE_DET_AD_CH_NUM,
	Reserve1_DET_AD_CH_NUM,
	Reserve2_DET_AD_CH_NUM,
	Reserve3_DET_AD_CH_NUM,
	Reserve4_DET_AD_CH_NUM,
	VDD_DET_AD_CH_NUM,
	NTC_AD_CH_NUM,
  };

char* ch_map_string[] = {
	"SWS_DET_AD",
	"BRAKE_DET_AD",
	"Reserve1_DET_AD",
	"Reserve2_DET_AD",
	"Reserve3_DET_AD",
	"Reserve4_DET_AD",
	"VDD_DET_AD",
	"NTC_AD"
  };

#ifdef ADC_TEST

#define SAMPLES_NUM 5

void adc_test(){

    uint16_t adc_val[SAMPLES_NUM];
    uint32_t vol_val[SAMPLES_NUM];
    int      i;
  
    for(i=0; i < ADC_CH_NUMS; i++){
		
        memset(adc_val, 0, sizeof(adc_val));  

        memset(vol_val, 0, sizeof(vol_val));  
		 
        aw_adc_sync_read(ch_num_buf[i], adc_val, SAMPLES_NUM, AW_FALSE);

        aw_adc_val_to_mv(ch_num_buf[i], adc_val, SAMPLES_NUM, vol_val);

        for (i = 0; i < SAMPLES_NUM; i++) {
            aw_kprintf("adc channel %s, %d conversion result : %dmV
", ch_map_string[i], i + 1, vol_val[i]);
        }
        aw_mdelay(500);
        aw_kprintf("
");
    }

}

#endif

4. 总结

此次针对ADC的配置非常的简单,上层的接口简单易用。前提条件还是得学习Aworks的框架。

原文地址:https://www.cnblogs.com/lianghong881018/p/15169439.html