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同时被触发,则先执行优先级高的,再执行优先级低的。
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讲解何其乐便介绍完毕了,掌声在哪里~~~
以上是关于RT10XX 全新的外设ADC_ETC的主要内容,如果未能解决你的问题,请参考以下文章