LM3S9b96 串口2的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;

    }