查看: 1323|回复: 0

[分享] RT10XX 全新的外设ADC_ETC

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32032
    最后登录
    2024-4-26
    发表于 2020-9-2 18:19:19 | 显示全部楼层 |阅读模式
    RT10XX 全新的外设ADC_ETC
    1 解读ADC_ETC


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


    下面我们结合官方参考手册中的结构图来解读。
    1.png
    图是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同时被触发,则先执行优先级高的,再执行优先级低的。


    2  编程要点


    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讲解何其乐便介绍完毕了,掌声在哪里~~~


    文章出处:何其乐

    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 22:43 , Processed in 0.111983 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表