diff options
| author | Junjie Wang <[email protected]> | 2024-05-03 06:57:18 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-05-02 18:57:18 -0400 |
| commit | b632dc1aaf2efa4156b87b2d534cf6732010eaee (patch) | |
| tree | 77489f0e7588a237e301ae3154747f14f910058b | |
| parent | 2c9b7c10b9ff6b4509945376bb4e25dd18c1ce25 (diff) | |
[bsp][gd32] 修复串口驱动中由于可能的中断嵌套而导致RB索引异常的问题
| -rw-r--r-- | bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c | 6 |
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)); } } |
