This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294KCPDT:定时器- UDMA-SSI 同步问题

Guru**** 2526700 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1006356/tm4c1294kcpdt-timer-udma-ssi-synchronization-problem

器件型号:TM4C1294KCPDT

您好!

在我的设计中、我使用计时器和 UDMA 通过基于 SPI 的 DAC 连续生成正弦波形。 我的正弦频率为10kHz、我每周期使用32个样本来生成它、因此 DAC 写入的采样周期为375个时钟周期。

设置代码为:

    uDMAChannelAttributeDisable(18, UDMA_ATTR_ALTSELECT | UDMA_ATTR_HIGH_PRIORITY |
                                UDMA_ATTR_REQMASK);
    uDMAChannelScatterGatherSet(18, 2, SSIDACTasks, true);
    memcpy(DMASave + 8, pui8ControlTable + (18 * 16), 16);
    uDMAChannelAttributeEnable(18, UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY);
    uDMAChannelEnable(18);

...

    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
    TimerConfigure(TIMER1_BASE, TIMER_CFG_SPLIT_PAIR / TIMER_CFG_A_PERIODIC);
    TimerLoadSet(TIMER1_BASE, TIMER_A, g_ui32SysClock / 320000);
    TimerDMAEventSet(TIMER1_BASE, TIMER_DMA_TIMEOUT_A);
    TimerEnable(TIMER1_BASE, TIMER_A);

散聚表:

tDMAControlTable SSIDACTasks[] =
{
 uDMATaskStructEntry(32, UDMA_SIZE_16, UDMA_SRC_INC_16, SinT, UDMA_DST_INC_NONE, SSI3_BASE + SSI_O_DR, UDMA_ARB_1, UDMA_MODE_PER_SCATTER_GATHER),
 uDMATaskStructEntry(4, UDMA_SIZE_32, UDMA_SRC_INC_32, DMASave + 8, UDMA_DST_INC_32, pui8ControlTable + (18 * 16), UDMA_ARB_1, UDMA_MODE_MEM_SCATTER_GATHER)
};

然后、我在示波器中看到良好的正弦波形。 但我需要设置一些任务、以便在下一个正弦周期结束时执行 当我执行该操作时、我注意到我的任务(包括数据采集)与正弦周期不同步。

然后我设置另一个计时器来切换不同的引脚、精确周期为375*32个时钟周期、该周期应与正弦波周期完全同步:

    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3);
    TimerConfigure(TIMER3_BASE, TIMER_CFG_PERIODIC | TIMER_CFG_A_ACT_TOGGLE);
    TimerLoadSet(TIMER3_BASE, TIMER_A, g_ui32SysClock / (320000 / 32));
    TimerSynchronize(TIMER3_BASE, TIMER_1A_SYNC);
    TimerEnable(TIMER3_BASE, TIMER_A);
    GPIOPinTypeTimer(GPIO_PORTA_BASE, GPIO_PIN_6);
    GPIOPinConfigure(GPIO_PA6_T3CCP0);

我在示波器上看到正弦波与计时器输出不同步、计时器生成的频率与 正弦波的加倍频率不匹配。

出什么问题了?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    所提供的信息不足以让我识别出什么是错误。 UDMA 必须等待空闲总线周期才能进行读取或写入。 CPU 始终优先。  

    哪个输出不正确、正弦波的频率或定时器产生的引脚切换?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    DAC 输出的周期时间略长于预期、计时器输出准确。

    据我了解、uDMA 等待状态可能会导致一些信号失真、但不会导致相移。

    最奇怪的是、移位远小于一个采样时间。 这是怎么可能的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我同意、除非 UDMA 的第二个任务无法在下一个计时器中断发生之前重置表、否则您不应获得任何延长的周期。 但是、如果发生这种情况、则周期应延长一个完整的采样周期。  

    其他任务是否可以操纵 timer3? 这是 RTOS 项目吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不可以、TIMER3专门用于此任务、而不是 RTOS 项目。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您说正弦波是正确的、您开始添加任务。 我唯一的建议是、您开始删除这些任务、直到看到具有正确周期的正弦波。 这可能会为您提供有关正在发生的情况的线索。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我确实删除了除正弦波生成计时器之外的所有任务。 结果相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我不知道在你的实现中发生了什么、但是如果我在每个周期结束时需要一个中断、我会在乒乓模式下执行 uDMA。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在数据采集期间无法使用中断-它会破坏收集的数据...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否考虑使用嵌套中断?