现在想使用串口2的DMA发送数据,但是串口2要使用DMA通道的第二功能,不会配置,各种试,总是出错,不知道哪位大神有用过DMA第二功能的,给个代码例字。
现在想使用串口2的DMA发送数据,但是串口2要使用DMA通道的第二功能,不会配置,各种试,总是出错,不知道哪位大神有用过DMA第二功能的,给个代码例字。
LM3SXX系列的MCU 带uDMA的功能模块,uDMA模块的控制结构体分为两部分,一部分成为主结构体(也可以叫做主功能)另一部分为副结构体(也叫副功能); 主功能的控制结构体地址从0x00,开始,副功能的控制结构体从0x200开始;
如果uDMA只是用于简单的数据传输,用主功能即可,副结构体可以不配置。如果要实现复杂、连续的DMA控制(例如乒乓控制,或聚散控制)则需要用到DMA的副功能。这个时候就需要根据应用配置DMA的副功能结构体。
楼主所说的第二功能应该就是指DMA的副功能。不过你需要想确认你想让DMA工作在什么模式,是乒乓模式还是聚散模式,不同模式的结构体配置也是不一样的。
不知道为啥底下的回复点不了 ,只能在这里回复。
收数不正确的情况已经解决了,原来是U转串死掉了,换个别的就好了。现在的问题是,在ucos下 DMA副功能中断不是每次都进,有时候可以连续发几十秒,有时候1条就死,我在想难道是系统调度时候把全局中断关了,就影响到DMA进中断了?但是UART0 和UART1 没有出现过不进中断的情况。
UART2只有副功能才有通道,担配置时候我用的是主功能结构体,用uDMAChannelSelectSecondary()函数,开启了通道的副功能。其他的配置是一样的。配置函数
void Uart2_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2); // 使能UART模块
SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART2);
GPIOPinTypeUART(GPIO_PORTD_BASE, // 配置RX/TX所在管脚为
GPIO_PIN_5 | GPIO_PIN_6); // UART收发功能
GPIOPinConfigure(GPIO_PD5_U2RX);
GPIOPinConfigure(GPIO_PD6_U2TX);
UARTConfigSet(UART2_BASE, // 配置UART端口
9600, // 波特率:9600
UART_CONFIG_WLEN_8 | // 数据位:8
UART_CONFIG_STOP_ONE | // 停止位:1
UART_CONFIG_PAR_NONE); // 校验位:无
UARTFIFOLevelSet(UART2_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8);
IntEnable(INT_UART2);
UARTEnable(UART2_BASE);
UARTDMAEnable(UART2_BASE, UART_DMA_TX);
UARTIntEnable(UART2_BASE, UART_INT_RX|UART_INT_RT);
uDMAChannelSelectSecondary(UDMA_DEF_RESERVED_SEC_UART2TX );
uDMAChannelAttributeDisable(UDMA_SEC_CHANNEL_UART2TX_13,
UDMA_ATTR_ALTSELECT |
UDMA_ATTR_HIGH_PRIORITY |UDMA_ATTR_REQMASK);
uDMAChannelAttributeEnable(UDMA_SEC_CHANNEL_UART2TX_13, UDMA_ATTR_USEBURST);
uDMAChannelControlSet(UDMA_SEC_CHANNEL_UART2TX_13| UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
UDMA_ARB_4);
}
启动发送函数
int Uart2DMASendStr(char *pBuf,unsigned int nNum)
{
if (!uDMAChannelIsEnabled(UDMA_SEC_CHANNEL_UART2TX_1))
{
RS485SendEnable();
SysCtlDelay(500);
uDMAChannelTransferSet(UDMA_SEC_CHANNEL_UART2TX_13 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC, pBuf,
(void *)(UART2_BASE + UART_O_DR),
nNum);
uDMAChannelEnable(UDMA_SEC_CHANNEL_UART2TX_13);
return 1;
}
else
return 0;
}