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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RT1052是一款微控制器芯片,具有定时器功能。根据引用和引用的信息,RT1052支持硬件定时器,并且可以通过aw_hwtimer编程来使用定时器功能。通过调用aw_hwtimer_alloc_byname函数可以为系统分配一个符合指定名字和设备单元号的定时器,通过aw_hwtimer_enable函数可以使能定时器并设置定时中断频率。另外,引用中提到RT1052的定时器使用PIT定时器(Periodic Interrupt Timer),它是一个32位递减计数器,用于提供周期信号给其他外设使用。PIT定时器具有独立设置计数器的计数值、启动和停止的特性,并且可以在不重新启动计时器的情况下更改计数器周期。因此,RT1052可以使用PIT定时器来实现定时器功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于RT1052 Aworks 使能硬件定时器功能(九)](https://blog.csdn.net/weixin_30965175/article/details/109537413)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [RT1052的PIT定时器](https://blog.csdn.net/qq_42312125/article/details/103114594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式实操

希望博文有助于您,您不必加班。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值