查看: 6813|回复: 1

[分享] 关于RT1052-ADC问题的总结

[复制链接]
  • TA的每日心情
    开心
    2025-7-10 13:07
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    56

    主题

    546

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1524

    热心会员

    最后登录
    2025-7-10
    发表于 2020-4-21 13:48:56 | 显示全部楼层 |阅读模式
    使用RT1052已经有一段时间了,在使用过程中也遇到了很多问题,这里针对ADC的使用作出如下的一些总结。


    1. ADC和ADC_ETC的区别

    使用RT1052时,会发现ADC和ST的有很大的区别。RT1050的ADC只能实现一些简单的功能,不具备扫描模式,适用于软件触发采集单个通道的应用,例如定时采集电池电量的任务。

    而要实现较为复杂的多个通道数据采集时,我们就需要用到ADC_ETC了,ADC_ETC能够实现多个通道扫描模式的数据采集,而在RT1052的库函数里,并没有提到扫描模式。而是使用了叫做Chain的概念,看开发手册里,最多有8个Chain,也就是说最多可以使用8个通道的扫描模式采样,我们会发现RT1050的ADC并没有ST里面的注入分组的概念。

    在需要使用定时采样多个通道数据时,RT1052里面有个很方便的触发模式,这里叫外部触发External Trigger,这也是ADC_ETC真正的用处了,可以配置定时器PIT来实现周期性触发ADC采样,配置的例程可以参考官方的SDK库。

    总的来说,简单的应用使用ADC就可以了,需要多个通道采集数据的就需要使用ADC_ETC了。


    2. 关于ADC_ETC里Group的概念

    对于RT1052里ADC关于Group的概念一直比较迷糊,我的建议是在使用ADC_ETC时,每个通道最好单独分配一个Group,官方的例程也是这样配置的,理解的还不够彻底。


    3. 关于外部触发的概念

    看RT1052的ADC_ETC手册时,里面介绍特点描述到每一个ADC支持8个硬件外部触发控制,然而使用时就会发现有坑了,ADC1只支持trigger0~trigger3,ADC2只支持trigger4~trigger7。
    21.png
    4. 关于ADC2的使用

    可以说RT1052芯片使用时,IO引脚非常的灵活,可以任意接入一个片内外设上,在使用ADC1和ADC2时,通道绝大部分都可以通用。在使用ADC2时,很多朋友会发现使用不起来,如果是使用PIT触发的周期采样的话,可以查看ADC2是否使用的是trigger4~trigger7,其次在使用ADC2时,有个寄存器需要配置。ADC_ETC (CTRL),也可以通过库函数调用。

    22.png
    1. <font size="3" face="微软雅黑">    adc_etc_config_t adcEtcConfig;   
    2.     ADC_ETC_GetDefaultConfig(&adcEtcConfig);
    3.     adcEtcConfig.enableTSCBypass = false; /* To use ADC2, this bit should be cleared */

    4. </font>
    复制代码
    5. 关于ADC使用DMA的坑

    在使用RT1052的ADC并用DMA传输数据时,会发现DMA里面竟然没有8Byte传输,这里可能是官方遗漏了,可以手动加上,且使用16Byte传输时,会发现DMA不工作,后来官方直接把16Byte去掉了。

    1. <font size="3" face="微软雅黑">assert((srcWidth == 1U) || (srcWidth == 2U) || (srcWidth == 4U) || (srcWidth == 8U) || (srcWidth == 32U));
    2.     assert((destWidth == 1U) || (destWidth == 2U) || (destWidth == 4U) || (destWidth == 8U) || (destWidth == 32U));
    3.     assert(transferBytes % bytesEachRequest == 0);
    4. </font> <font size="3" face="微软雅黑">
    5.     config->destAddr = (uint32_t)destAddr;
    6.     config->srcAddr = (uint32_t)srcAddr;
    7.     config->minorLoopBytes = bytesEachRequest;
    8.     config->majorLoopCounts = transferBytes / bytesEachRequest;
    9.     switch (srcWidth)
    10.     {
    11.         case 1U:
    12.             config->srcTransferSize = kEDMA_TransferSize1Bytes;
    13.             break;
    14.         case 2U:
    15.             config->srcTransferSize = kEDMA_TransferSize2Bytes;
    16.             break;
    17.         case 4U:
    18.             config->srcTransferSize = kEDMA_TransferSize4Bytes;
    19.             break;
    20.         case 8U:
    21.             config->srcTransferSize = kEDMA_TransferSize8Bytes;
    22.             break;
    23.         case 32U:
    24.             config->srcTransferSize = kEDMA_TransferSize32Bytes;
    25.             break;
    26.         default:
    27.             break;
    28.     }
    29.     switch (destWidth)
    30.     {
    31.         case 1U:
    32.             config->destTransferSize = kEDMA_TransferSize1Bytes;
    33.             break;
    34.         case 2U:
    35.             config->destTransferSize = kEDMA_TransferSize2Bytes;
    36.             break;
    37.         case 4U:
    38.             config->destTransferSize = kEDMA_TransferSize4Bytes;
    39.             break;
    40.         case 8U:
    41.             config->destTransferSize = kEDMA_TransferSize8Bytes;
    42.             break;
    43.         case 32U:
    44.             config->destTransferSize = kEDMA_TransferSize32Bytes;
    45.             break;
    46.         default:
    47.             break;
    48.     }

    49. </font>
    复制代码
    这里需要注意的是使用8Byte传输时,如果定义的目标地址数组未使用数据对齐预处理指令,DMA可能会出现运行不起来的情况,需要在定义的目标地址处加上数据对齐的预处理指令。SDK_ALIGN(目标地址 , 对齐长度),我们这里使用4Byte对齐。
    1. <font size="3" face="微软雅黑">SDK_ALIGN(uint16_t g_AdcArcResult[ARC_ADC_SAMPLE_LENGTH], 4);</font>
    复制代码








    签到签到
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24864
    最后登录
    2025-7-18
    发表于 2020-4-24 11:30:59 | 显示全部楼层
    感谢楼主的经验分享!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-19 05:25 , Processed in 0.083479 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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