一.sysconfig

(1)Basci Config

1.选择 BUSCLK 时钟源

2.选择8分频

3.设置为8位数据位、无校验位、一位停止位

(2)Advanced Config

1.选择Nromal UART

2.选择通信方向位TX和RX

3.Oversampling(过采样) 选择为16

4.RX FIFO contains >= 1 entry

4.TX FIFO contains 1 entry

5.其余默认

(3)Interrupt Config

使能DMA done transit 和 End of transmission

(4)DMA Config

1.选择UART TX interrupt

2.地址模式设置为 块地址(用户)到固定地址(UART->TX_)

3.设置源长度为一个字节

4.源地址方向为自加 Increment

5.目标长度为一个字节

6.转换模式Transfer Mode 设置为 Single

7.Source Address Increment Do not change address

8.Destination Address Increment Do not change address

9.选择DMA通道

(5).Pin Mux

1.选择使用哪个DMA

2.选择串口的引脚

二.代码

1.重要代码

    //设置源地址
    DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(data));

    //设置目标地址
    DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(&UART_0_INST->TXDATA));
    
    //设置要搬运的字节数
    DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, size);

    //使能DMA通道
    DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);

2.编写DMA串口发送函数

void UART0_Console_write(uint8_t *data, uint16_t size)
{
    //当串口发送完毕后,才可再次发送
    if(gConsoleTxTransmitted)
    {
        //设置源地址
        DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(data));
    
        //设置目标地址
        DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(&UART_0_INST->TXDATA));
    
        //设置要搬运的字节数
        DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, size);
    
        //使能DMA通道
        DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
    
        gConsoleTxTransmitted    = false;
        gConsoleTxDMATransmitted = false;
    }

}

3.主函数

volatile bool  gConsoleTxDMATransmitted = false;
volatile bool  gConsoleTxTransmitted = true;

int main(void)
{
    SYSCFG_DL_init();

    //开启UART中断
    NVIC_EnableIRQ(UART_0_INST_INT_IRQN);

    //使能DMA通道
    DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);


    while (1) 
    {

        //用户编写的DMA串口发送函数
        UART0_Console_write("hello\r\n",7);
        delay_cycles(3200000);

    }
}

4.编写串口中断服务函数

void UART_0_INST_IRQHandler(void)
{
    switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
        //串口发送完成
        case DL_UART_MAIN_IIDX_EOT_DONE:
            gConsoleTxTransmitted = true;
            break;
        //DMA搬运完成
        case DL_UART_MAIN_IIDX_DMA_DONE_TX:
            gConsoleTxDMATransmitted = true;
            break;
        default:
            break;
    }
}

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐