• 基于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的框架。

  • 相关阅读:
    字符串与字典常用命令
    Python学习之路:字符串常用操作
    Python学习之路:购物车实例
    面试题2017
    c#语法学习
    结构化设计模式-桥接模式
    结构型设计模式-适配器模式
    .Net Cache
    设计模式的六大原则
    uml类图关系
  • 原文地址:https://www.cnblogs.com/lianghong881018/p/15169439.html
Copyright © 2020-2023  润新知