RT1052-ADC问题

使用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。

《RT1052-ADC问题》

4. 关于ADC2的使用

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

《RT1052-ADC问题》

    adc_etc_config_t adcEtcConfig;    
    ADC_ETC_GetDefaultConfig(&adcEtcConfig);
    adcEtcConfig.enableTSCBypass = false; /* To use ADC2, this bit should be cleared */

5. 关于ADC使用DMA的坑

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

这里需要注意的是使用8Byte传输时,如果运气好,在MDK下可以很完美的使用,大部分情况下,MDK编译后8Byte传输是不能使用的,这时候不要怀疑是代码的原因,换在IAR下就可以完美的运行。

在MDK下编译RT1052代码遇到了很多奇葩的问题,可能是MDK目前对RT1052的支持不太好,所以建议大家使用IAR开发RT1052的代码,NXP的原厂均使用的是IAR。

    assert((srcWidth == 1U) || (srcWidth == 2U) || (srcWidth == 4U) || (srcWidth == 8U) || (srcWidth == 32U));
    assert((destWidth == 1U) || (destWidth == 2U) || (destWidth == 4U) || (destWidth == 8U) || (destWidth == 32U));
    assert(transferBytes % bytesEachRequest == 0);

    config->destAddr = (uint32_t)destAddr;
    config->srcAddr = (uint32_t)srcAddr;
    config->minorLoopBytes = bytesEachRequest;
    config->majorLoopCounts = transferBytes / bytesEachRequest;
    switch (srcWidth)
    {
        case 1U:
            config->srcTransferSize = kEDMA_TransferSize1Bytes;
            break;
        case 2U:
            config->srcTransferSize = kEDMA_TransferSize2Bytes;
            break;
        case 4U:
            config->srcTransferSize = kEDMA_TransferSize4Bytes;
            break;
        case 8U:
            config->srcTransferSize = kEDMA_TransferSize8Bytes;
            break;
        case 32U:
            config->srcTransferSize = kEDMA_TransferSize32Bytes;
            break;
        default:
            break;
    }
    switch (destWidth)
    {
        case 1U:
            config->destTransferSize = kEDMA_TransferSize1Bytes;
            break;
        case 2U:
            config->destTransferSize = kEDMA_TransferSize2Bytes;
            break;
        case 4U:
            config->destTransferSize = kEDMA_TransferSize4Bytes;
            break; 
        case 8U:
            config->destTransferSize = kEDMA_TransferSize8Bytes;
            break;
        case 32U:
            config->destTransferSize = kEDMA_TransferSize32Bytes;
            break;
        default:
            break;
    }

 

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/xinghuanmeiying/article/details/85008545
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞