6621CxC UART DMA+超时范例工程

wen sir · 444次点击 · 10个月前

测试UART1 DMA+超时接收功能。

注意: 

1- 仅uart1支持dma接收。uart0不支持。

2- 需要源文件编译,需要注释掉原库中uart符号。具体参考

662x UART串口外设驱动源码编译示例-昂瑞微论坛BBS (onmicro.com.cn)

#define DEBUG_PIN_UART0_TX 5
#define DEBUG_PIN_UART0_RX 6
#define DATA_PIN_UART1_TX 25
#define DATA_PIN_UART1_RX 24

3- 本例在6621CM-C EVB上实测如下。PC上位机发送115字节,UART1接收115字节。并在uart_dma_rx_timeout_handler   处理中中接收所有,并且UART0  Log打印结果。 

static void uart_dma_rx_timeout_handler(uint8_t data)
{
    static int recv_error_cnt = 0;
    (void) data;
    // log_debug("\n ==  uart_dma_rx_timeout_handler == ");
    uint8_t Fifo_remain_cnt = HS_UART1->RFL;
    uint32_t dma_recv_cnt = 0;
    if (uart_rx_dma)
    {
        dma_recv_cnt = UART_RX_DMA_TRANS_CNT - uart_rx_dma->TranSize;//TranSize is Decreasing
    }
    uart_rx_index += dma_recv_cnt;
    for (uint8_t i = 0; i < Fifo_remain_cnt; i++)
    {
        uart1_dma_rx_buf[uart_rx_index++] = HS_UART1->RBR;
    }
    uart_rx_len = uart_rx_index;
    log_debug_array_ex("recv", uart1_dma_rx_buf, uart_rx_index);

    ke_event_set(evt_uart_recv_frame);
    if (uart_rx_dma)
    {
        dma_stop(uart_rx_dma);
        dma_rx_restart();
    }
}

 4-每次处理完后,需要Restart准备下一次DMA接收。 通常情况下,数据处理和打印,不要在uart_dma_rx_timeout_handler   中进行。先把数据Copy到其它Buffer中,后续处理, 以免阻塞后续的UART1连续的数据接收。

image.png

5-附件有完整的范例工程。可以直接下载运行测试。


6621CxC_UART1_DMA+超时接收例程-202401065610.rar
被收藏 0  ∙  0 赞  
加入收藏
点赞
3 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站