summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunjie Wang <[email protected]>2024-05-03 06:57:18 +0800
committerGitHub <[email protected]>2024-05-02 18:57:18 -0400
commitb632dc1aaf2efa4156b87b2d534cf6732010eaee (patch)
tree77489f0e7588a237e301ae3154747f14f910058b
parent2c9b7c10b9ff6b4509945376bb4e25dd18c1ce25 (diff)
[bsp][gd32] 修复串口驱动中由于可能的中断嵌套而导致RB索引异常的问题
-rw-r--r--bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c6
1 files changed, 4 insertions, 2 deletions
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 4802a7bb3e..f1edc7c462 100644
--- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c
+++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c
@@ -233,13 +233,14 @@ static void dma_recv_isr (struct rt_serial_device *serial)
{
struct gd32_uart *uart;
rt_size_t recv_len, counter;
+ rt_base_t level;
RT_ASSERT(serial != RT_NULL);
uart = rt_container_of(serial, struct gd32_uart, serial);
recv_len = 0;
+ level = rt_hw_interrupt_disable();
counter = dma_transfer_number_get(uart->dma.rx.periph, uart->dma.rx.channel);
-
if (counter <= uart->dma.last_index)
{
recv_len = uart->dma.last_index - counter;
@@ -248,10 +249,11 @@ static void dma_recv_isr (struct rt_serial_device *serial)
{
recv_len = serial->config.rx_bufsz + uart->dma.last_index - counter;
}
+ uart->dma.last_index = counter;
+ rt_hw_interrupt_enable(level);
if (recv_len)
{
- uart->dma.last_index = counter;
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
}
}