From b021f00129f92411907d29d2f8ee19232f7c89a9 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Thu, 23 Oct 2025 21:11:03 +0800 Subject: [PATCH] =?UTF-8?q?[bsp][gd32][serial=5Fv2]=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=20GD32F5=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/gd32/arm/gd32527I-eval/board/Kconfig | 150 +++++++++++------- .../arm/libraries/gd32_drivers/drv_usart_v2.c | 37 ++--- .../arm/libraries/gd32_drivers/drv_usart_v2.h | 4 +- 3 files changed, 112 insertions(+), 79 deletions(-) diff --git a/bsp/gd32/arm/gd32527I-eval/board/Kconfig b/bsp/gd32/arm/gd32527I-eval/board/Kconfig index 03f3feeb122..0f69ddf391f 100644 --- a/bsp/gd32/arm/gd32527I-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32527I-eval/board/Kconfig @@ -34,55 +34,63 @@ menu "On-chip Peripheral Drivers" config BSP_UART0_RX_USING_DMA bool "Enable UART0 RX DMA" - depends on BSP_USING_UART0 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n config BSP_UART0_TX_USING_DMA bool "Enable UART0 TX DMA" - depends on BSP_USING_UART0 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n + config BSP_UART0_DMA_PING_BUFSIZE + int "Set UART0 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA + default 64 + config BSP_UART0_RX_BUFSIZE int "Set UART0 RX buffer size" range 64 65535 depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 - default 64 + default 128 config BSP_UART0_TX_BUFSIZE int "Set UART0 TX buffer size" - range 0 65535 + range 64 65535 depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 - default 0 + default 128 config BSP_USING_UART1 bool "Enable UART1" - default n + default y config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" - depends on BSP_USING_UART1 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n config BSP_UART1_TX_USING_DMA bool "Enable UART1 TX DMA" - depends on BSP_USING_UART1 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n + config BSP_UART1_DMA_PING_BUFSIZE + int "Set UART1 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA + default 64 + config BSP_UART1_RX_BUFSIZE int "Set UART1 RX buffer size" range 64 65535 depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 - default 64 + default 128 config BSP_UART1_TX_BUFSIZE int "Set UART1 TX buffer size" - range 0 65535 + range 64 65535 depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 - default 0 + default 128 config BSP_USING_UART2 bool "Enable UART2" @@ -90,27 +98,31 @@ menu "On-chip Peripheral Drivers" config BSP_UART2_RX_USING_DMA bool "Enable UART2 RX DMA" - depends on BSP_USING_UART2 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n config BSP_UART2_TX_USING_DMA bool "Enable UART2 TX DMA" - depends on BSP_USING_UART2 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n - + + config BSP_UART2_DMA_PING_BUFSIZE + int "Set UART2 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA + default 64 + config BSP_UART2_RX_BUFSIZE int "Set UART2 RX buffer size" range 64 65535 depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 - default 64 + default 128 config BSP_UART2_TX_BUFSIZE int "Set UART2 TX buffer size" - range 0 65535 + range 64 65535 depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 - default 0 + default 128 config BSP_USING_UART3 bool "Enable UART3" @@ -118,27 +130,31 @@ menu "On-chip Peripheral Drivers" config BSP_UART3_RX_USING_DMA bool "Enable UART3 RX DMA" - depends on BSP_USING_UART3 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n config BSP_UART3_TX_USING_DMA bool "Enable UART3 TX DMA" - depends on BSP_USING_UART3 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n + config BSP_UART3_DMA_PING_BUFSIZE + int "Set UART3 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA + default 64 + config BSP_UART3_RX_BUFSIZE int "Set UART3 RX buffer size" range 64 65535 depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 - default 64 + default 128 config BSP_UART3_TX_BUFSIZE int "Set UART3 TX buffer size" - range 0 65535 + range 64 65535 depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 - default 0 + default 128 config BSP_USING_UART4 bool "Enable UART4" @@ -146,27 +162,31 @@ menu "On-chip Peripheral Drivers" config BSP_UART4_RX_USING_DMA bool "Enable UART4 RX DMA" - depends on BSP_USING_UART4 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n config BSP_UART4_TX_USING_DMA bool "Enable UART4 TX DMA" - depends on BSP_USING_UART4 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n + config BSP_UART4_DMA_PING_BUFSIZE + int "Set UART4 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA + default 64 + config BSP_UART4_RX_BUFSIZE int "Set UART4 RX buffer size" range 64 65535 depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 - default 64 + default 128 config BSP_UART4_TX_BUFSIZE int "Set UART4 TX buffer size" - range 0 65535 + range 64 65535 depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 - default 0 + default 128 config BSP_USING_UART5 bool "Enable UART5" @@ -174,27 +194,31 @@ menu "On-chip Peripheral Drivers" config BSP_UART5_RX_USING_DMA bool "Enable UART5 RX DMA" - depends on BSP_USING_UART5 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n config BSP_UART5_TX_USING_DMA bool "Enable UART5 TX DMA" - depends on BSP_USING_UART5 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n + config BSP_UART5_DMA_PING_BUFSIZE + int "Set UART5 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA + default 64 + config BSP_UART5_RX_BUFSIZE int "Set UART5 RX buffer size" range 64 65535 depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 - default 64 + default 128 config BSP_UART5_TX_BUFSIZE int "Set UART5 TX buffer size" - range 0 65535 + range 64 65535 depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 - default 0 + default 128 config BSP_USING_UART6 bool "Enable UART6" @@ -202,55 +226,63 @@ menu "On-chip Peripheral Drivers" config BSP_UART6_RX_USING_DMA bool "Enable UART6 RX DMA" - depends on BSP_USING_UART6 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n config BSP_UART6_TX_USING_DMA bool "Enable UART6 TX DMA" - depends on BSP_USING_UART6 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n + config BSP_UART6_DMA_PING_BUFSIZE + int "Set UART6 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA + default 64 + config BSP_UART6_RX_BUFSIZE int "Set UART6 RX buffer size" range 64 65535 depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 - default 64 + default 128 config BSP_UART6_TX_BUFSIZE int "Set UART6 TX buffer size" - range 0 65535 + range 64 65535 depends on BSP_USING_UART6 && RT_USING_SERIAL_V2 - default 0 + default 128 - config BSP_USING_UART7 + config BSP_USING_UART7 bool "Enable UART7" default n config BSP_UART7_RX_USING_DMA bool "Enable UART7 RX DMA" - depends on BSP_USING_UART7 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART7 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n config BSP_UART7_TX_USING_DMA bool "Enable UART7 TX DMA" - depends on BSP_USING_UART7 - select RT_SERIAL_USING_DMA + depends on BSP_USING_UART7 && RT_USING_SERIAL_V2 && RT_SERIAL_USING_DMA default n + config BSP_UART7_DMA_PING_BUFSIZE + int "Set UART7 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_USING_UART7 && RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA + default 64 + config BSP_UART7_RX_BUFSIZE int "Set UART7 RX buffer size" range 64 65535 depends on BSP_USING_UART7 && RT_USING_SERIAL_V2 - default 64 + default 128 config BSP_UART7_TX_BUFSIZE int "Set UART7 TX buffer size" - range 0 65535 + range 64 65535 depends on BSP_USING_UART7 && RT_USING_SERIAL_V2 - default 0 + default 128 endif menuconfig BSP_USING_SPI diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c index 20853da1c11..db55d83ea44 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c @@ -263,7 +263,6 @@ static void dma_recv_isr (struct rt_serial_device *serial) RT_ASSERT(serial != RT_NULL); uart = rt_container_of(serial, struct gd32_uart, serial); - recv_len = 0; level = rt_hw_interrupt_disable(); #if defined SOC_SERIES_GD32E23x counter = dma_transfer_number_get(uart->dma.rx.channel); @@ -297,21 +296,14 @@ static void usart_isr (struct rt_serial_device *serial) if (usart_interrupt_flag_get(uart->periph, USART_INT_FLAG_RBNE) != RESET) { - struct rt_serial_rx_fifo *rx_fifo; - rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; - RT_ASSERT(rx_fifo != RT_NULL); - - char chr = usart_data_receive(uart->periph); - rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, &chr); + rt_uint8_t chr = usart_data_receive(uart->periph); + rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_PUTC, (void *)&chr); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); - - /* Clear RXNE interrupt flag */ - usart_interrupt_flag_clear(uart->periph, USART_INT_FLAG_RBNE); } else if (usart_interrupt_flag_get(uart->periph, USART_INT_FLAG_TBE) != RESET) { rt_uint8_t put_char = 0; - if (rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GETC, &put_char) == RT_EOK) + if (rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GETC, (void *)&put_char) == RT_EOK) { usart_data_transmit(uart->periph, put_char); } @@ -320,7 +312,6 @@ static void usart_isr (struct rt_serial_device *serial) usart_interrupt_disable(uart->periph, USART_INT_TBE); usart_interrupt_enable(uart->periph, USART_INT_TC); } - usart_interrupt_flag_clear(uart->periph, USART_INT_FLAG_TBE); } else if (usart_interrupt_flag_get(uart->periph, USART_INT_FLAG_TC) != RESET) { @@ -334,10 +325,9 @@ static void usart_isr (struct rt_serial_device *serial) #ifdef RT_SERIAL_USING_DMA else if (usart_interrupt_flag_get(uart->periph, USART_INT_FLAG_IDLE) != RESET) { - volatile uint8_t data = (uint8_t)usart_data_receive(uart->periph); - + volatile uint8_t idle_clear_dummy = (uint8_t)usart_data_receive(uart->periph); + RT_UNUSED(idle_clear_dummy); dma_recv_isr(serial); - usart_interrupt_flag_clear(uart->periph, USART_INT_FLAG_IDLE); } #endif @@ -595,8 +585,8 @@ void UART7_IRQHandler (void) } #endif /* BSP_USING_UART7 */ -#if define SOC_SERIES_GD32E23x -#if define BSP_UART0_RX_USING_DMA || define BSP_UART0_TX_USING_DMA +#if defined SOC_SERIES_GD32E23x +#if defined BSP_UART0_RX_USING_DMA || defined BSP_UART0_TX_USING_DMA void DMA_Channel1_2_IRQHandler(void) { /* enter interrupt */ @@ -906,6 +896,9 @@ static void _uart_dma_receive (struct gd32_uart *uart, rt_uint8_t *buffer, rt_ui dma_interrupt_enable(uart->dma.rx.channel, DMA_CHXCTL_HTFIE); dma_interrupt_enable(uart->dma.rx.channel, DMA_CHXCTL_FTFIE); + /* enable circular mode */ + dma_circulation_enable(uart->dma.rx.channel); + /* enable dma channel */ dma_channel_enable(uart->dma.rx.channel); @@ -953,7 +946,11 @@ static void _uart_dma_receive (struct gd32_uart *uart, rt_uint8_t *buffer, rt_ui usart_interrupt_enable(uart->periph, USART_INT_IDLE); /* enable dma receive */ +#if defined SOC_SERIES_GD32F5xx + usart_dma_receive_config(uart->periph, USART_DENR_ENABLE); +#else usart_dma_receive_config(uart->periph, USART_RECEIVE_DMA_ENABLE); +#endif #endif } @@ -972,7 +969,11 @@ static void _uart_dma_transmit (struct gd32_uart *uart, rt_uint8_t *buffer, rt_u DMA_CHCNT(uart->dma.tx.periph, uart->dma.tx.channel) = size; /* enable dma transmit */ +#if defined SOC_SERIES_GD32F5xx + usart_dma_transmit_config(uart->periph, USART_DENT_ENABLE); +#else usart_dma_transmit_config(uart->periph, USART_TRANSMIT_DMA_ENABLE); +#endif /* enable dma channel */ dma_channel_enable(uart->dma.tx.periph, uart->dma.tx.channel); @@ -1057,7 +1058,7 @@ static void gd32_dma_config (struct rt_serial_device *serial, rt_ubase_t flag) if (flag == RT_DEVICE_FLAG_DMA_RX) { rt_uint8_t *ptr = NULL; - rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, &ptr); + rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, (void *)&ptr); /* start dma transfer */ _uart_dma_receive(uart, ptr, serial->config.dma_ping_bufsz); diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h index a1fe384b1f8..7f221a9c1f1 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.h @@ -32,12 +32,12 @@ struct gd32_uart rcu_periph_enum tx_gpio_clk; rcu_periph_enum rx_gpio_clk; uint32_t tx_port; -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32E23x +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32E23x || defined SOC_SERIES_GD32F5xx uint16_t tx_af; #endif uint16_t tx_pin; uint32_t rx_port; -#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32E23x +#if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32E23x || defined SOC_SERIES_GD32F5xx uint16_t rx_af; #endif uint16_t rx_pin;