前段时间,小编在帮客户完成一个i.MX RT1050的项目,在项目中会用到ADC2去采样压力传感器的值,由于项目前期,小编只能在MIMXRT1050 EVK开发板上做验证,中间遇到一些软件和硬件的问题,虽然问题现在回想起来都很不起眼,但在当时还是很头疼的,所有小编在这里复盘一下当时遇到的问题及解决过程。
ADC_ETC触发ADC2代码实现
基于SDK软件包中的evkbimxrt1050_adc_etc_software_trigger_conv例程,使用ADC_ETC模块中trigger chain功能依次不间断地采样ADC2_IN5,ADC2_IN6,ADC2_IN8引脚(具体引脚对应关系如表1所示),在连续完成3个ADC采样后,触发中断,读取对应地采样值,完整代码请参考附件。
代码重点修改项如下:
- 禁止TSC_BYPASS功能
- /* Initialize the ADC_ETC. */
- ADC_ETC_GetDefaultConfig(&adcEtcConfig);
- adcEtcConfig.XBARtriggerMask = 0x10U; /* Enable the external XBAR trigger4. */
- adcEtcConfig.enableTSCBypass = false;
- ADC_ETC_Init(DEMO_ADC_ETC_BASE, &adcEtcConfig);
复制代码
- 增加B2B功能
- /* Set the external XBAR trigger0 chain0 configuration. */
- adcEtcTriggerChainConfig.enableB2BMode = true;
- adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
- << DEMO_ADC_CHANNEL_GROUP0; /* Select ADC_HC0 register to trigger. */
- adcEtcTriggerChainConfig.ADCChannelSelect =
- DEMO_ADC_ETC_CHANNEL1; /* 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 */
- ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 4U, 0U,
- &adcEtcTriggerChainConfig); /* Configure the trigger0 chain0. */
- adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
- << DEMO_ADC_CHANNEL_GROUP1; /* Select ADC2_HC1 register to trigger. */
- adcEtcTriggerChainConfig.ADCChannelSelect =
- DEMO_ADC_ETC_CHANNEL2; /* ADC_HC1 will be triggered to sample Corresponding channel. */
- //adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable; /* Enable the Done1 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 */
- ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 4U, 1U,
- &adcEtcTriggerChainConfig); /* Configure the trigger4 chain1. */
- adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
- << DEMO_ADC_CHANNEL_GROUP2; /* Select ADC2_HC2 register to trigger. */
- adcEtcTriggerChainConfig.ADCChannelSelect =
- DEMO_ADC_ETC_CHANNEL3; /* ADC_HC1 will be triggered to sample Corresponding channel. */
- //adcEtcTriggerChainConfig.enableB2BMode = false;
- //adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable; /* Enable the Done0 interrupt. */
- adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable; /* Enable the Done1 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 */
- ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 4U, 2U,
- &adcEtcTriggerChainConfig); /* Configure the trigger4 chain2. */
复制代码
Debug技巧
在开发中,我们经常会利用debug工具(如Jlink, LPC-link2等)来观察代码运行的过程和结果,尤其是在代码运行结果与预期有出入的时候。同时,在开发过程中,使用printf打印一下信息也是一种常用的debug手段,在这里,小编分享一个宏打印的的debug技巧,帮助我们快速定位异常情况发生的位置。
具体代码如下,其中宏定义__FILE__,__func__,__LINE__分别代表调试信息所在的文件,函数及行号。除此之外,常用的宏还有:__DATE__、__TIME__,分别代表当前的编译日期与时间。
- #define LOG(frm,args…) {/
- PRINTF(“[%s : %s : %d]/n”,__FILE__,__func__,__LINE__);/
- PRINTF(frm,##args);/
- PRINTF(“/n”);/
- }
复制代码
硬件的“坑”
在使用MIMXRT1050 EVK开发板进行验证过程中,发现板子上的一个‘小坑’,如果将WDOG_B (GPIO_B1_13)脚配置成GPIO输出高速的高低电平变换,会触发MCU复位,原因是UM805RE的MR脚会被拉低。
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/268371.html