Skip to content

Commit b632dc1

Browse files
authored
[bsp][gd32] 修复串口驱动中由于可能的中断嵌套而导致RB索引异常的问题
1 parent 2c9b7c1 commit b632dc1

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,13 +233,14 @@ static void dma_recv_isr (struct rt_serial_device *serial)
233233
{
234234
struct gd32_uart *uart;
235235
rt_size_t recv_len, counter;
236+
rt_base_t level;
236237

237238
RT_ASSERT(serial != RT_NULL);
238239
uart = rt_container_of(serial, struct gd32_uart, serial);
239240

240241
recv_len = 0;
242+
level = rt_hw_interrupt_disable();
241243
counter = dma_transfer_number_get(uart->dma.rx.periph, uart->dma.rx.channel);
242-
243244
if (counter <= uart->dma.last_index)
244245
{
245246
recv_len = uart->dma.last_index - counter;
@@ -248,10 +249,11 @@ static void dma_recv_isr (struct rt_serial_device *serial)
248249
{
249250
recv_len = serial->config.rx_bufsz + uart->dma.last_index - counter;
250251
}
252+
uart->dma.last_index = counter;
253+
rt_hw_interrupt_enable(level);
251254

252255
if (recv_len)
253256
{
254-
uart->dma.last_index = counter;
255257
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
256258
}
257259
}

0 commit comments

Comments
 (0)