1. 程式人生 > 其它 >基於RT1052 Aworks 使能ADC功能(四)

基於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             /**< \brief iMX1050 ADC */
#define AW_DEV_IMX1050_ADC2             /**< \brief iMX1050 ADC2 */
aw_prj_param_auto_cfg.h
/**
 * \name ÄÚ²¿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\n", ch_map_string[i], i + 1, vol_val[i]);
        }
        aw_mdelay(500);
        aw_kprintf("\r\n");
    }

}

#endif

4. 總結

此次針對ADC的配置非常的簡單,上層的介面簡單易用。前提條件還是得學習Aworks的框架。