Browse Source

1. uart 驱动使用uart接收,dma有问题
2. uart收到一个完整的数据帧后,退出while循环,防止数据过多,看门狗复位

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui 3 years ago
parent
commit
7506156905
1 changed files with 9 additions and 5 deletions
  1. 9 5
      Application/bsp/uart.c

+ 9 - 5
Application/bsp/uart.c

@@ -41,7 +41,7 @@
 #define SHARK_UART1_rx_dma_clk			RCU_DMA
 
 // ================================================================================
-#define ENABLE_RX_DMA 1
+#define ENABLE_RX_DMA 0
 
 static u8 shark_uart0_tx_cache[SHARK_UART_TX_MEM_SIZE];
 #if UART_NUM==2
@@ -135,7 +135,7 @@ static void shark_uart_rx(shark_uart_t *uart){
 				}
 				uart->rx_length = 0xFFFF;
 				uart->start = false;
-				break;
+				return;
 			case CH_ESC:
 				uart->escape = true;
 				break;
@@ -184,6 +184,7 @@ static void shark_uart_dma_tx(shark_uart_t *uart)
 		}
 
 		byte_queue_skip(&uart->tx_queue, uart->tx_length);
+		dma_flag_clear(uart->tx_dma_ch, DMA_FLAG_FTF);
 		DMA_CHCTL(uart->tx_dma_ch) = value & (~DMA_CHXCTL_CHEN);
 	}
 
@@ -191,8 +192,6 @@ static void shark_uart_dma_tx(shark_uart_t *uart)
 	if (uart->tx_length > 0) {
 		DMA_CHCNT(uart->tx_dma_ch) = uart->tx_length;
 		DMA_CHMADDR(uart->tx_dma_ch) = (u32) byte_queue_head(&uart->tx_queue);
-
-		dma_flag_clear(uart->tx_dma_ch, DMA_FLAG_FTF);
 		DMA_CHCTL(uart->tx_dma_ch) = value | DMA_CHXCTL_CHEN;
 	}
 }
@@ -218,7 +217,11 @@ static void shark_uart_write(shark_uart_t *uart, const u8 *buff, u16 size)
 
 static void shark_uart_write_byte(shark_uart_t *uart, u8 value)
 {
-	shark_uart_write(uart, &value, 1);
+	//shark_uart_write(uart, &value, 1);
+	byte_queue_write(&uart->tx_queue, &value, 1);
+	if (byte_queue_get_used(&uart->tx_queue) > 64) {
+		shark_uart_dma_tx(uart);
+	}
 }
 
 
@@ -552,6 +555,7 @@ static void shark_uart_tx_end(shark_uart_t *uart)
 {
 	shark_uart_write_esc(uart, (u8 *)&uart->tx_crc16, sizeof(uart->tx_crc16));
 	shark_uart_write_byte(uart, CH_END);
+	shark_uart_dma_tx(uart);
 }
 
 void shark_uart_write_frame(uart_enum_t uart_no, uint8_t *bytes, int len){