您好!
在我的设计中、我使用计时器和 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);
我在示波器上看到正弦波与计时器输出不同步、计时器生成的频率与 正弦波的加倍频率不匹配。
出什么问题了?