学习官方uart dma例程的一点疑问
在学习uart dma的时候,想让它一直收发,可是如果不把UDMASetupTransfer放在while(1)里面,就会一直回显停不下来,为什么每次运行都要UDMASetupTransfer才能正常呢? 可以只配置一次,来实现一直收发么?
主函数
while(1){
bRxDone = false;
//
// Setup DMA transfer for UART A0
//
UDMASetupTransfer(UDMA_CH8_UARTA0_RX,
UDMA_MODE_BASIC,
8,
UDMA_SIZE_8,
UDMA_ARB_2,
(void *)(UARTA0_BASE+UART_O_DR),
UDMA_SRC_INC_NONE,
(void *)ucTextBuff,
UDMA_DST_INC_8);
//
// Enable Rx DMA request from UART
//
MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_RX);
//
// Wait for RX to complete
//
while(!bRxDone)
{
}
//
// Setup DMA transfer for UART A0
//
UDMASetupTransfer(UDMA_CH9_UARTA0_TX,
UDMA_MODE_BASIC,
8,
UDMA_SIZE_8,
UDMA_ARB_2,
(void *)ucTextBuff,
UDMA_SRC_INC_8,
(void *)(UARTA0_BASE+UART_O_DR),
UDMA_DST_INC_NONE);
//
// Enable TX DMA request
//
MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_TX);
}
中断函数:
static void UARTIntHandler()
{
//
// Check if RX
//
if(!bRxDone)
{
//
// Disable UART RX DMA
//
MAP_UARTDMADisable(UARTA0_BASE,UART_DMA_RX);
//
// Siganl RX done
//
bRxDone = true;
}
else
{
//
// Disable UART TX DMA
//
MAP_UARTDMADisable(UARTA0_BASE,UART_DMA_TX);
}
//
// Clear the UART Interrupt
//
MAP_UARTIntClear(UARTA0_BASE,UART_INT_DMATX|UART_INT_DMARX);
}
还有一个问题就是中断函数里面的else为什么没有触发过? 不是在数据传输完毕之后触发么?
感谢解答!
建议参考uart_dma的例程测试,同时关于uDMA的一些简单解释
DMA传输模式
基本模式用于外设和存储器之间DMA传输;自动模式用于存储器和存储器之间软件DMA传输;
乒乓模式用于外设和存储器之间的连续DMA传输,乒乓模式需要主和备用两个通道控制,
系统使用主和备用两个通道控制交替进行DMA传输;
分集模式包括存储和外设分集模式,分集模式将两个及两个以上数据块利用DMA传输到一个数据块或外设
//*****************************************************************************
#define UDMA_MODE_STOP 0x00000000
#define UDMA_MODE_BASIC 0x00000001
#define UDMA_MODE_AUTO 0x00000002
#define UDMA_MODE_PINGPONG 0x00000003
#define UDMA_MODE_MEM_SCATTER_GATHER \
0x00000004
#define UDMA_MODE_PER_SCATTER_GATHER \
0x00000006
#define UDMA_MODE_ALT_SELECT 0x00000001
这个就是基于uart dma的例程 几乎没有变动,只是加了一个while(1)
