测试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连续的数据接收。 5-附件有完整的范例工程。可以直接下载运行测试。 |