本帖最后由 tzlll111 于 2025-3-27 16:05 编辑
gd32f303 DMA+uart遇到问题,就是当数据长度超过DMA长度(g_egdp_cpu_uart_dma【uart_index】.dma_rx_buf_size),下一次再收到数据,会在buffer开头多得到一个0x00,当然得到的uart_rx_len也比发的数据多1,为什么?下面是串口IRQ代码
static void Usart_Irq_Handler(u8 uart_index)
{
u32 uart_reg_addr = g_egdp_cpu_uart_interface[uart_index];
u16 uart_rx_len = 0;
if(SET == usart_interrupt_flag_get(uart_reg_addr, USART_INT_FLAG_IDLE))
{
if(NULL != g_egdp_cpu_uart_dma[uart_index].isr_rx_func)
{
usart_data_receive(g_egdp_cpu_uart_interface[uart_index]); //clear idle flag
dma_channel_disable(g_egdp_cpu_uart_dma[uart_index].dma_base,
g_egdp_cpu_uart_dma[uart_index].dma_rx_chl); /* 关闭DMA传输 */
uart_rx_len = g_egdp_cpu_uart_dma[uart_index].dma_rx_buf_size -
dma_transfer_number_get(g_egdp_cpu_uart_dma[uart_index].dma_base,g_egdp_cpu_uart_dma[uart_index].dma_rx_chl);
/* the number will strangely increase by one in the next turn when uart_rx_len==dma_rx_buf_size.*/
dma_transfer_number_config(g_egdp_cpu_uart_dma[uart_index].dma_base,
g_egdp_cpu_uart_dma[uart_index].dma_rx_chl,g_egdp_cpu_uart_dma[uart_index].dma_rx_buf_size);//refill number
dma_interrupt_flag_clear(g_egdp_cpu_uart_dma[uart_index].dma_base,g_egdp_cpu_uart_dma[uart_index].dma_rx_chl,DMA_INTF_FTFIF); /*必须要清除标志,否则只进来一次*/
dma_channel_enable(g_egdp_cpu_uart_dma[uart_index].dma_base, g_egdp_cpu_uart_dma[uart_index].dma_rx_chl); /* 开启DMA传输 */
g_egdp_cpu_uart_dma[uart_index].isr_rx_func(g_egdp_cpu_uart_dma[uart_index].dma_rx_buf,uart_rx_len);
}
usart_flag_clear(uart_reg_addr,USART_FLAG_IDLE); /* 清除空闲中断标志位 */
}
}
|
static void Usart_Irq_Handler(u8 uart_index) { u32 uart_reg_addr = g_egdp_cpu_uart_interface[uart_index]; u16 uart_rx_len = 0; if(SET == usart_interrupt_flag_get(uart_reg_addr, USART_INT_FLAG_IDLE)) { if(NULL != g_egdp_cpu_uart_dma[uart_index].isr_rx_func) { usart_data_receive(g_egdp_cpu_uart_interface[uart_index]); //clear idle flag dma_channel_disable(g_egdp_cpu_uart_dma[uart_index].dma_base, g_egdp_cpu_uart...