RT10XX 全新的外设ADC_ETC

Posted 何其乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RT10XX 全新的外设ADC_ETC相关的知识,希望对你有一定的参考价值。

1 解读ADC_ETC

ADC_ETC配置灵活、可扩展性强,配合2个ADC可以完美胜任多次并行模拟量采样的任务。虽然它是新外设,但是理解起来并不困难,从名字便可顾名思义:它就是一个ADC的控制器,操控ADC完成采样并存储采样结果。

下面我们结合官方参考手册中的结构图来解读。

      

图是ADC_ETC配合2个ADC工作的结构图,其中以白色为底色的是属于ADC_ETC的部分。

 这张图的信息量还是比较大的,我们挑出几个关键点进行重点介绍:

 ► 有8组采样控制队列(Queue),每个Queue通过配置可以有0~8个Chain。也就是说,整个ADC_ETC最多有64个Chain。

 ► Queue 0/1/2/3 只能操控ADC1,Queue 4/5/6/7只能操控ADC2。

 ► 每个Chain都可以操控ADC对任意一通道完成1次采样、保存1个采样结果,在采样完成后也可以选择是否使能DONE0/DONE1/DONE2这3个中断中的任意一个。

 ► 每个Queue对应1个触发输入(Trigger IN)。每次Trigger IN信号到来后,对应的Queue将从Chain0开始按顺序连续执行所有的Chains,每个Chain之间可以预设间隔时间。

 ► 每个Trigger IN都可以通过XBAR链接到PWM的触发信号,且Trigger IN之间可以共用同一个触发源。

 ► 可配置Trigger IN/Queue的优先级,一共8个优先级。如果操控同一个ADC的Trigger IN/Queue同时被触发,则先执行优先级高的,再执行优先级低的。

编程要点

1) 初始化配置 ADC 相关 IOMUXC MUX 复用配置为 IO 模式;
2) 初始化配置 ADC 目标引脚的 pad 属性;
3) 初始化配置 ADC 目标引脚为输入模式;

  IOMUXC_SetPinMux(
      IOMUXC_GPIO_AD_14_GPIOMUX_IO28,         /* GPIO_AD_14 is configured as GPIOMUX_IO28 */
      0U);   

IOMUXC_SetPinConfig(
      IOMUXC_GPIO_AD_14_GPIOMUX_IO28,         /* GPIO_AD_14 PAD functional properties : */
      0xA0U);
4) 配置 ADC 配置结构体 adc_config_t,完成 ADC 工作模式初始化

    ADC_GetDefaultConfig(&adcConfig);
    ADC_Init(DEMO_ADC_BASE, &adcConfig);
5) 设置 ADC 支持硬件触发(外部触发)模式。

    ADC_EnableHardwareTrigger(DEMO_ADC_BASE, true);
6) 配置转换通道对应的外部输入通道为 16 ,表示有 ADC_ETC 指定外部输入通道;

    adcChannelConfigStruct.channelNumber = 16;
7) 进行硬件校准;

    ADC_DoAutoCalibration(DEMO_ADC_BASE)
8) 配置 ADC_ETC 全局控制寄存器,设置选择外部触发通道

    ADC_ETC_GetDefaultConfig(&adcEtcConfig);
    adcEtcConfig.XBARtriggerMask = 1U; /* 使能外部触发请求通道0 */
    ADC_ETC_Init(DEMO_ADC_ETC_BASE, &adcEtcConfig);
9) 配置触发通道的属性,包括该触发通道的优先级、初始延时、该通道采样多少个转换通道等。

    /* Set the external XBAR trigger0 configuration. */
    adcEtcTriggerConfig.enableSyncMode      = false;
    adcEtcTriggerConfig.enableSWTriggerMode = true;
    adcEtcTriggerConfig.triggerChainLength  = DEMO_ADC_ETC_CHAIN_LENGTH; /* Chain length is 1. */
    adcEtcTriggerConfig.triggerPriority     = 0U;
    adcEtcTriggerConfig.sampleIntervalDelay = 0U;
    adcEtcTriggerConfig.initialDelay        = 0U;
    ADC_ETC_SetTriggerConfig(DEMO_ADC_ETC_BASE, 0U, &adcEtcTriggerConfig);
10) 配置 ADC_ETC 转换通道,主要设置转化通道对应的外部输入通道;

    /* Set the external XBAR trigger0 chain0 configuration. */
    adcEtcTriggerChainConfig.enableB2BMode       = false;
    adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
                                                   << DEMO_ADC_CHANNEL_GROUP; /* Select ADC_HC0 register to trigger. */
    adcEtcTriggerChainConfig.ADCChannelSelect =
        DEMO_ADC_ETC_CHANNEL; /* ADC_HC0 will be triggered to sample Corresponding channel. */
    adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable; /* Enable the Done0 interrupt. */
#if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN
    adcEtcTriggerChainConfig.enableIrq = true; /* Enable the IRQ. */
#endif                                         /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */
    //triggerGroup 3个 chainGroup 8个
    ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 0U, 0U,
                                  &adcEtcTriggerChainConfig); /* Configure the trigger0 chain0. */
11) 开启 ADC_ETC 转换完成中断,并编写中断服务函数。

    /* Enable the NVIC. */
    EnableIRQ(ADC_ETC_IRQ0_IRQn);

    void EXAMPLE_ADC_ETC_DONE0_Handler(void)
    {
        ADC_ETC_ClearInterruptStatusFlags(DEMO_ADC_ETC_BASE, kADC_ETC_Trg0TriggerSource, kADC_ETC_Done0StatusFlagMask);
        g_AdcConversionDoneFlag = true;
        g_AdcConversionValue = ADC_ETC_GetADCConversionValue(DEMO_ADC_ETC_BASE, 0U, 0U); /* Get trigger0 chain0 result. */
         __DSB();
     }

 至此,RT10XX 看门狗RTWDOG讲解何其乐便介绍完毕了,掌声在哪里~~~

以上是关于RT10XX 全新的外设ADC_ETC的主要内容,如果未能解决你的问题,请参考以下文章

玩转RT-Thread系列教程--ADC—光敏数据的采集

RT600 I2S外设介绍及应用

在 bluepill 开发板上使用 stm32f1xx_hal 对 GPIO 输出进行外设初始化

RT-Thread&ART-PI硬件RTC+软件RTC外设

RT-Thread&ART-PI硬件RTC+软件RTC外设

RT-Thread&ART-PI硬件RTC+软件RTC外设