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:
@@ -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 擦除时)不丢帧
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user