//我用的是Cortex-M4 的Tiva.c launchpad 开发板,我想做的是,用UART0 DMA方式发送字符串,但是接收不用DMA方式,直接用UART0的RX。现在遇到的异常情况是,我在调用DMA的发送函数的时候,有部分字符串会出现乱码,而且同一个字符串,在不同的地方调用DMA发送函数,出现的结果也不相同。
//这是UAR0初始化函数
void InitUART(void)
{
//
// Enable the peripherals.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//
// Enable processor interruputs.
//
IntMasterEnable();
//
// Set GPIO A0 and A1 as UART pins.
//
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//
// Configure the UART for 9,600
//
//UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),
UARTConfigSetExpClk(UART0_BASE,16000000,
115200,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
//
// Enable the UART interrupt.
//
IntEnable(INT_UART0);
//UARTIntEnable(UART0_BASE,UART_INT_RX | UART_INT_RT);
// UARTFIFODisable(UART0_BASE);
// UARTFIFOLevelSet(UART0_BASE,UART_FIFO_TX1_8,UART_FIFO_RX7_8);
//UARTIntEnable(UART0_BASE, UART_INT_RX);
//UARTIntRegister(UART0_BASE, UART0IntHandler);
//UARTDMAEnable(UART0_BASE,UART_DMA_RX );
GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_0|GPIO_PIN_1, GPIO_DIR_MODE_HW);
//UARTIntRegister(UART0_BASE, UARTRXIntHandler);
//UARTIntRegister(UART0_BASE, uDMAUART0IntHandler);
UARTDMAEnable(UART0_BASE,UART_DMA_TX );
}
//这是DMA初始化函数
void InitDMAUART0(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
uDMAEnable();
uDMAControlBaseSet(ucDMAControlTable);
uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0TX,UDMA_ATTR_ALL);//DMA UART TX
uDMAChannelControlSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_8 |UDMA_DST_INC_NONE | UDMA_ARB_8);
/*
uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0RX,UDMA_ATTR_ALL);//DMA UART Rx
uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_NONE |UDMA_DST_INC_8 | UDMA_ARB_8);
*/
uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT,
UDMA_MODE_BASIC, (void*)DMATxBuff,
(void*)DMARxBuff,
DMAUARTRevCn);
uDMAChannelEnable(UDMA_CHANNEL_UART0TX);
/*
uDMAChannelAttributeDisable(UDMA_CHANNEL_SW,UDMA_ATTR_ALL);//DMA UART SW
uDMAChannelControlSet(UDMA_CHANNEL_SW | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_8 |UDMA_DST_INC_8 | UDMA_ARB_8);
*/
}
//这是DMA的发送函数
void DMAUART0SendDat(void *dat,uint32_t Lenth)
{
uDMAChannelDisable(UDMA_CHANNEL_UART0TX);
uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT,
UDMA_MODE_BASIC,(void *)dat ,
(void *)(UART0_BASE + UART_O_DR),
Lenth);
uDMAChannelEnable(UDMA_CHANNEL_UART0TX);
}