feat(vd960DBN): UART2 RX DMA 循环接收 — 根治打印关中断丢帧 (2026-08-17)

遗留项'UART2 偶发丢帧(1-3分钟一次 checksum fail)'落地:
- 根因: PRINT 临界区(关中断~7.4ms)屏蔽 USART2 RXNE 中断 → 丢字节
- 方案: DMA1_Ch6 循环模式硬件收字节(不依赖CPU中断), 主循环轮询消费
  - uart2_dma_init(): Ch6 循环模式 + 512B 环形缓冲(aligned(4)) + 关 RXNE
  - uart2_dma_poll(): 主循环读 DMA_GetCurrDataCounter 批量喂 lup_feed_byte
    (状态机移入主循环无竞争); 溢出保护(未消费>256B重置+丢帧计数)
  - uart_init() 末尾调 uart2_dma_init(); USART2_IRQHandler 清空留 IDLE 注释
- 资源: DMA1 全空闲(WCHNET 独立 ETH DMA/BLE 不用 DMA1) → Ch6 独占
- .bss +512B(缓冲), 栈 6.3KB→5.8KB 仍充裕
This commit is contained in:
wangfq
2026-08-17 15:59:16 +08:00
parent f274d70fbd
commit fed4335947
2 changed files with 102 additions and 23 deletions
+16
View File
@@ -52,10 +52,26 @@
- [ ] 待回归:TCP JSON 命令交互(RECE_BUF_LEN 减小后接收缓冲 1024 ≥ MSS 帧 740B,理论无影响)
- [ ] 待回归:快照区 3s 后初始化(`INIT: snap ok`)、断网快照落盘、BLE 0x28/0x29/0x2A
### UART2 RX DMA 改造(2026-08-17 晚,方案A 实施)
遗留项"UART2 偶发丢帧"1-3 分钟一次 checksum fail)落地修复:
- 根因:PRINT 临界区(关中断 ~7.4ms)期间 USART2 RXNE 中断被屏蔽 → 丢字节 → 粘帧
- 方案:DMA1_Ch6 循环模式硬件收字节(不依赖 CPU 中断),主循环轮询消费
- `usart_biz.c` 改动:
- 新增 `uart2_dma_init()`:Ch6 循环模式 + 512B 环形缓冲(`aligned(4)`+ 关 RXNE 中断
- 新增 `uart2_dma_poll()`:主循环每轮读 `DMA_GetCurrDataCounter` 算新字节,
批量喂 `lup_feed_byte`(状态机移入主循环,无中断竞争);溢出保护(未消费>256B
重置+丢帧计数)
- `uart_init()` 末尾调 `uart2_dma_init()``USART2_IRQHandler` 清空(RXNE 已关,
保留 IDLE 注释备用)
- 资源:DMA1 全空闲(WCHNET 用独立 ETH DMA、BLE 栈不用 DMA1)→ Ch6 独占无冲突
- 注意:.bss +512B(缓冲),栈 6.3KB → 5.8KB 仍充裕
### 遗留
- BOOT_CNT 打印保留(区分复位 vs 跑飞重启,诊断价值)
- 快照区延后 3s 保留(非根因,但作为启动早期 SPI 减压无害)
- (可选)g_report_cfg 1400B 结构体审查、WCHNET Mem_Heap 7.2KB 库配置——收益有限暂不动
- [ ] UART2 DMA 板级验证:Loop MCU 数据正常解析(无 checksum fail)、
粘帧/半帧/长阻塞(SPI 擦除时)不丢帧
---