工具/软件:Code Composer Studio
大家好、
我正在使用 cc3200 wifi - launchpad。我每20毫秒就会在通过 UART 发送数据时遇到问题。 使用 UDMA 发送数据。 我可以连续发送数据、但我需要将 DMA 传输速率降低到每20ms 一次。 总数据传输大小为368字节。 我尝试配置硬件计时器并从 ISR 触发 DMA 传输。 但启用 DMA TX 时,计时器中断不会发生。 我很难解决这个问题。 请尽快帮助我解决此问题。
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.
工具/软件:Code Composer Studio
大家好、
我正在使用 cc3200 wifi - launchpad。我每20毫秒就会在通过 UART 发送数据时遇到问题。 使用 UDMA 发送数据。 我可以连续发送数据、但我需要将 DMA 传输速率降低到每20ms 一次。 总数据传输大小为368字节。 我尝试配置硬件计时器并从 ISR 触发 DMA 传输。 但启用 DMA TX 时,计时器中断不会发生。 我很难解决这个问题。 请尽快帮助我解决此问题。
您好!
您的代码是基于 SDK 中的一个示例(例如 UART_DEMO 项目)、还是从头开始使用您自己的 UART + DMA 代码?
此外、您如何实现20ms 延迟的高电平 UART 发送? 我假设您已将 UART 外设设置为使用 DMA、然后在计时器中断时配置 DMA 传输、以便向 UART TX 寄存器馈送要发送的数据。
您的定时器中断中有什么代码来配置和启动 DMA 传输? 此外、您如何配置计时器? 计时器外设应独立于 DMA 控制器运行、因此在 DMA 传输过程中、您仍应能够接收计时器中断。
此致、 
Michael
您好、Michael、
是的、我使用 SDK 中的 UART_DEMO 示例。 我实施了一个硬件计时器,如计时器示例项目中所示。 请找到以下代码
//计时器处理程序
空 TimerBaseIntHandler (空) 
{ 
// 
//清除计时器中断。 
// 
Timer_IF_InterruptClear (TIMERERA0_BASE); 
Timer_IF_Stop (TIMERERA0_BASE、TIMER_A); 
//重新初始化 DMA 传输以发送数据
UDMASetupTransfer (UDMA_CH11_UARTA1_TX、UDMA_MODE_BASIC、 
CONTRAL_CMD_SIZE、UDMA_SIZE、UDMA_ARB_2、 
(void *) voice_pktt、UDMA_SRC_INC_8、 
(void *)(CONTROL_CMD_PREIPH + UART_O_DR)、UDMA_DST_INC_NONE); 
MAP_uDMAChannelEnable (UDMA_CH11_UARTA1_TX); 
}
// DMA 处理程序
静态空 UARTIntHandler()
{
unsigned long ulStatus;
无符号超长整型;
map_uDMAIntClear (map_uDMAIntStatus ()); 
// 
//读取 UART 的中断状态。 
// 
ulStatus = MAP_UARTIntStatus (CONTRAL_CMD_PREIPH、1); 
// 
//清除任何挂起状态,即使由于没有 UART,应该没有任何挂起状态 
//中断已启用。 
// 
MAP_UARTIntClear (CONTRAL_CMD_PREIPH、ulStatus); 
//Tx
ulMode = MAP_uDMAChannelModeGet (UDMA_CH11_UARTA1_TX);
if (ulMode = UDMA_MODE_STOP) 
{ 
   TIMER_IF_Start (TIMER_RA0_BASE、TIMER_A、20);//启动超时为20ms 的计时器 
}
}
MAIN ()
{
。
。
Timer_IF_Init (PRCM_TIMERERA0、TIMERERA0_BASE、TIMER_CFG_PERIODICRAE、TIMER_A、0); 
TIMER_IF_IntSetup (TIMERERA0_BASE、TIMER_A、TimerBaseIntHandler); 
UDMAInit(); 
MAP_UARTIntEnable (CONTRAL_CMD_PREIPH、UART_INT_DMATX); 
MAP_UARTConfigSetExpClk (CONTRAL_CMD_PREIPH、MAP_PRCMPeripheralClockGet (CONTRAL_CMD_CLK)、 
                        UART_BAUD_RATE、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | 
                        UART_CONFIG_PAR_NONE)); 
MAP_uDMAChannelAssign (UDMA_CH11_UARTA1_TX); 
MAP_UARTIntRegister (CONTRAL_CMD_PREIPH、UARTIntHandler); 
UARTFIFOLevelSet (CONTROL_CMD_PREIPH、UART_FIFO_TX1_8、UART_FIFO_RX1_8); 
UDMASetupTransfer (UDMA_CH11_UARTA1_TX、UDMA_MODE_BASIC、 
                  CONTRAL_CMD_SIZE、UDMA_SIZE、UDMA_ARB_2、 
                  (void *) voice_pktt、UDMA_SRC_INC_8、 
                  (void *)(CONTROL_CMD_PREIPH + UART_O_DR)、UDMA_DST_INC_NONE); 
                  MAP_UARTDMAEnable (CONTRAL_CMD_PREIPH、UART_DMA_RX); 
MAP_UARTDMAEnable (CONTRAL_CMD_PREIPH、UART_DMA_TX);
while (1)
{
}
}
简单来说,在 DMA UART 中断处理程序内部,我正在启动计时器,而在计时器中断中,我 将再次启用 DMA 传输,因为超时后 DMA 应再次发送数据。
但是数据只发送一次,而计时器中断根本不会触发。 超时后无法连续发送数据。
请帮我解决这个问题。请提前感谢
您好、Akash、
我将硬件计时器集成到 UART_DMA 示例中、这与您上面的示例代码非常相似、并且它们都按预期工作。 请参阅随附的代码。
/cfs-file/__key/communityserver-discussions-components-files/968/08641.main.c
我在代码和代码之间唯一的主要区别 是我使用 MAP_UARTDMAEnable()来重新启动 DMA 通道,而不是使用 MAP_uDMAChannelEnable()。 尝试使用它、看看它是否修复了问题。 否则、您应该仔细查看我的代码、看看是否有任何其他可能导致您问题的变化。
此致、
Michael