查看: 2271|回复: 0

[分享] i.MX RT1050 ADC2调试工作总结

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19945
最后登录
2024-4-19
发表于 2020-12-22 11:22:34 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2020-12-22 11:24 编辑

i.MX RT1050 ADC2调试工作总结

前段时间,小编在帮客户完成一个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采样后,触发中断,读取对应地采样值,完整代码请参考附件。
2020-12-22_11-21-34.png
代码重点修改项如下:
  • 禁止TSC_BYPASS功能
  1.     /* Initialize the ADC_ETC. */
  2.     ADC_ETC_GetDefaultConfig(&adcEtcConfig);
  3.     adcEtcConfig.XBARtriggerMask = 0x10U; /* Enable the external XBAR trigger4. */
  4.     adcEtcConfig.enableTSCBypass = false;
  5.     ADC_ETC_Init(DEMO_ADC_ETC_BASE, &adcEtcConfig);
复制代码


  • 增加B2B功能
  1.     /* Set the external XBAR trigger0 chain0 configuration. */
  2.     adcEtcTriggerChainConfig.enableB2BMode       = true;
  3.     adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
  4.                                                    << DEMO_ADC_CHANNEL_GROUP0; /* Select ADC_HC0 register to trigger. */
  5.     adcEtcTriggerChainConfig.ADCChannelSelect =
  6.         DEMO_ADC_ETC_CHANNEL1; /* ADC_HC0 will be triggered to sample Corresponding channel. */
  7.     //adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable; /* Enable the Done0 interrupt. */
  8. #if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN
  9.     adcEtcTriggerChainConfig.enableIrq = true; /* Enable the IRQ. */
  10. #endif                                         /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */
  11.     ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 4U, 0U,
  12.                                   &adcEtcTriggerChainConfig); /* Configure the trigger0 chain0. */

  13.     adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
  14.                                                    << DEMO_ADC_CHANNEL_GROUP1; /* Select ADC2_HC1 register to trigger. */
  15.     adcEtcTriggerChainConfig.ADCChannelSelect =
  16.         DEMO_ADC_ETC_CHANNEL2; /* ADC_HC1 will be triggered to sample Corresponding channel. */
  17.     //adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable; /* Enable the Done1 interrupt. */
  18. #if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN
  19.     adcEtcTriggerChainConfig.enableIrq = true; /* Enable the IRQ. */
  20. #endif                                         /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */
  21.     ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 4U, 1U,
  22.                                   &adcEtcTriggerChainConfig); /* Configure the trigger4 chain1. */

  23.     adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
  24.                                                    << DEMO_ADC_CHANNEL_GROUP2; /* Select ADC2_HC2 register to trigger. */
  25.     adcEtcTriggerChainConfig.ADCChannelSelect =
  26.         DEMO_ADC_ETC_CHANNEL3; /* ADC_HC1 will be triggered to sample Corresponding channel. */
  27.     //adcEtcTriggerChainConfig.enableB2BMode       = false;
  28.     //adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable; /* Enable the Done0 interrupt. */
  29.     adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable; /* Enable the Done1 interrupt. */
  30. #if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN
  31.     adcEtcTriggerChainConfig.enableIrq = true; /* Enable the IRQ. */
  32. #endif                                         /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */
  33.     ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 4U, 2U,
  34.                                   &adcEtcTriggerChainConfig); /* Configure the trigger4 chain2. */
复制代码


Debug技巧
在开发中,我们经常会利用debug工具(如Jlink, LPC-link2等)来观察代码运行的过程和结果,尤其是在代码运行结果与预期有出入的时候。同时,在开发过程中,使用printf打印一下信息也是一种常用的debug手段,在这里,小编分享一个宏打印的的debug技巧,帮助我们快速定位异常情况发生的位置。
具体代码如下,其中宏定义__FILE__,__func__,__LINE__分别代表调试信息所在的文件,函数及行号。除此之外,常用的宏还有:__DATE__、__TIME__,分别代表当前的编译日期与时间。
  1. #define LOG(frm,args...) {\
  2.     PRINTF("[%s : %s : %d]\n",__FILE__,__func__,__LINE__);\
  3.     PRINTF(frm,##args);\
  4.     PRINTF("\n");\
  5. }
复制代码

硬件的“坑”
在使用MIMXRT1050 EVK开发板进行验证过程中,发现板子上的一个‘小坑’,如果将WDOG_B (GPIO_B1_13)脚配置成GPIO输出高速的高低电平变换,会触发MCU复位,原因是UM805RE的MR脚会被拉低。
2020-12-21_17-58-31.png



evkbimxrt1050_adc_etc_software_trigger_conv.zip (638.1 KB, 下载次数: 47)
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-20 08:36 , Processed in 0.112594 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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