From 8873b334d2e9e9ea86cccc0c044382a28ddc1191 Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 14 Aug 2026 09:46:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(vd960DBN):=20=E6=81=A2=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E5=8C=BA=E5=8A=9F=E8=83=BD,=20=E7=A7=BB=E9=99=A4=20si?= =?UTF-8?q?m=5Fsnap=5Fspi=20=E5=AE=9E=E9=AA=8C=E6=A1=A9,=20UART2=20?= =?UTF-8?q?=E6=B3=A2=E7=89=B9=E7=8E=87=E6=B3=A8=E9=87=8A=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - peripheral_main.c: snap_init() 恢复 (去 #if 0), offlog_boot() 恢复 (上电复位原因记入事件日志); 删除 sim_snap_spi 模拟写密度实验函数 及主循环调用 (printf 重入修复后 SPI 写无罪已确诊, 实验收尾) - loop_uart_proto.h/c: UART2 波特率注释 115200/19200 -> 192000 (usart_biz.c 硬编码 192000 为实际值; g_storage_uart_baud=19200 为独立配置项不驱动 UART2, BLE 显示 19200 不代表实际速率) - devlog: 新增 2026-08-14 条目, UART2 RX DMA 方案列入待办 --- .../APP/include/loop_uart_proto.h | 2 +- .../APP/loop_uart_proto.c | 2 +- .../APP/peripheral_main.c | 87 +------------------ vd960DBN/docs/devlog.md | 35 +++++++- 4 files changed, 36 insertions(+), 90 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/include/loop_uart_proto.h b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/include/loop_uart_proto.h index cf473ce..07be97d 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/include/loop_uart_proto.h +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/include/loop_uart_proto.h @@ -7,7 +7,7 @@ * @brief DLD960Loop 串口通信协议 (7F) — CH32V208 ↔ DLD960Loop MCU * * 帧格式: 7F | Addr | LEN | CMD | Data... | XOR | SUM - * UART: USART2, 115200bps, PA2(Tx)/PA3(Rx) + * UART: USART2, 192000bps, PA2(Tx)/PA3(Rx) * * 该协议是通信MCU(CH32V208)与地感MCU(DLD960Loop/AT32F421)之间的接口。 * 网络接口(TCP JSON/5960)通过本模块向地感MCU下发命令并获取数据。 diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/loop_uart_proto.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/loop_uart_proto.c index 599c04d..321a88a 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/loop_uart_proto.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/loop_uart_proto.c @@ -688,7 +688,7 @@ void lup_process_frame(const uint8_t *pkg, uint16_t len) // Debug: print raw (2026-08-13: 缓冲一次性输出 — 逐字节 PRINT 关中断 ~350us/字节 // 会屏蔽 UART2 ISR 丢帧, 且高频打印放大 printf 重入窗口。 - // 再关闭: 190B 打印 @256000 = 7.4ms 关中断 → UART2(19200) 溢出丢字节 → 粘帧! + // 再关闭: 190B 打印 @256000 = 7.4ms 关中断 → UART2(192000) 溢出丢字节 → 粘帧! // 需要调试时打开 #if 1) #if 0 { diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c index 25bcd2a..da9883f 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c @@ -218,75 +218,6 @@ void key_event_srv(void){ } -/********************************************************************* - * @fn sim_snap_spi - * - * @brief 实验(2026-08-13 第一步): 模拟快照区 SPI 写密度 - * - * 当前固件: snap_init 已 #if 0 跳过 (纯读基座, 日志读写正常)。 - * 本函数恢复快照落盘的写节奏, 隔离"SPI 写频率" vs "快照逻辑 bug": - * - 每 20ms: 64B 页写 (SPI_Flash_Write_NoCheck, 模拟 snap_write_raw) - * - 每 64 条: 切扇区序列 (读首条 magic + 擦除 45ms + - * 头区 SPI_Flash_Write 读-改-写整扇区, 模拟 snap_flush_head) - * 复现复位 → SPI 高频写触发硬件问题 (PA7/NRST 共线怀疑坐实); - * 不复现 → 快照区有具体逻辑 bug, 转向代码审查。 - * 注意: 会覆盖快照区旧数据, 恢复快照功能前需 snap_clear。 - * - * @return none - */ -#define SIM_SNAP_HEAD_BASE 0x110000UL -#define SIM_SNAP_DATA_BASE 0x111000UL -#define SIM_SNAP_DATA_SIZE (4096UL * 751UL) /* 与 snapshot.c 数据扇区数一致 */ -static uint32_t _sim_snap_wr = SIM_SNAP_DATA_BASE; -static uint32_t _sim_snap_cnt = 0; -static uint32_t _sim_snap_last = 0; -void sim_snap_spi(void) -{ - uint32_t _now = mstick(); - - if ((uint32_t)(_now - _sim_snap_last) < 20) return; /* 20ms 节拍 = 50Hz 帧率 */ - _sim_snap_last = _now; - - /* 切扇区: 每 64 条 (4096/64) 一次, 与 snap_write_raw 同节奏 */ - if (_sim_snap_cnt > 0 && (_sim_snap_cnt & 63) == 0) - { - uint8_t _r[64]; - uint8_t _h[32]; - - /* 1) snap_sector_has_data: 读目标扇区首条 magic */ - SPI_Flash_Read(_r, _sim_snap_wr, 64); - - /* 2) SPI_Flash_Erase_Sector (~45ms) */ - SPI_Flash_Erase_Sector(_sim_snap_wr / 4096); - - /* 3) snap_flush_head: 头区读-改-写 (SPI_Flash_Write 内部 - 读4096 + 擦 + 写回4096, ~100ms) */ - memset(_h, 0xFF, sizeof(_h)); - _h[0] = 'S'; _h[1] = 'N'; _h[2] = 'P'; _h[3] = 'M'; - _h[8] = (uint8_t)(_sim_snap_cnt & 0xFF); - _h[9] = (uint8_t)((_sim_snap_cnt >> 8) & 0xFF); - _h[10] = (uint8_t)((_sim_snap_cnt >> 16) & 0xFF); - _h[11] = (uint8_t)((_sim_snap_cnt >> 24) & 0xFF); - SPI_Flash_Write(_h, SIM_SNAP_HEAD_BASE, 32); - } - - /* 模拟 snap_write_raw: 64B 页写 */ - { - static uint8_t _b[64]; - uint8_t _i; - for (_i = 0; _i < 64; _i++) _b[_i] = (uint8_t)(_sim_snap_cnt + _i); - _b[0] = 'S'; _b[1] = 'N'; _b[2] = 'P'; _b[3] = 'M'; - SPI_Flash_Write_NoCheck(_b, _sim_snap_wr, 64); - _sim_snap_wr += 64; - if (_sim_snap_wr >= SIM_SNAP_DATA_BASE + SIM_SNAP_DATA_SIZE) - _sim_snap_wr = SIM_SNAP_DATA_BASE; - _sim_snap_cnt++; - if ((_sim_snap_cnt & 0x3F) == 0) - PRINT("SIM: cnt=%lu wr=0x%08lx\n", - (unsigned long)_sim_snap_cnt, (unsigned long)_sim_snap_wr); - } -} - /********************************************************************* * @fn Main_Circulation * @@ -343,8 +274,6 @@ void Main_Circulation(void) uart_srv(); FAULT_MARKER(MK_UART_SRV_OUT); snap_flush(); /* 快照落盘: 无条件挂主循环 (原在 iot_enable 分支, TCP 模式不落盘) */ - FAULT_MARKER(MK_SIM_SPI_IN); - sim_snap_spi(); /* 实验第一步(2026-08-13): 模拟快照区 SPI 写密度, 定位复位触发源 */ FAULT_MARKER(MK_POLL_BLE_IN); poll_dbn_ble(); @@ -398,26 +327,14 @@ int main(void) PRINT("INIT: storage ok\n"); offlog_init(); PRINT("INIT: offlog ok\n"); - /* ===== 实验: 跳过 snap_init (2026-08-12) ===== - 目的: SPI 序列还原为旧固件(无快照SPI), 区分触发源 - 稳定 → 快照SPI(读/擦/写头)触发; 崩 → offlog_boot本身(旧固件也该崩) */ -#if 0 + /* 快照区: 上电扫描恢复 (2026-08-14, printf 重入修复后恢复启用) */ snap_init(); PRINT("INIT: snap ok\n"); -#else - PRINT("INIT: snap skipped (offlog-only SPI seq)\n"); -#endif - /* ===== 实验: 跳过 offlog_boot SPI 写 (2026-08-12) ===== - 目的: 二分定位 — 跳过 snap 仍崩 → 是否是 offlog_boot 32B 写触发 - 不崩 → offlog_boot 写(含切扇区擦除)触发; 崩 → 更早 SPI 读操作或非SPI */ + /* offlog_boot: 记录本次复位原因到事件日志 (2026-08-14 恢复) */ { uint32_t rcc_rst = OFFLOG_RCC_RSTSCKR; -#if 0 offlog_boot(rcc_rst); -#else - PRINT("SKIP: offlog_boot write skipped\n"); -#endif OFFLOG_RCC_RSTSCKR |= OFFLOG_RST_RMVF; /* RMVF (bit24): 清复位标志 */ } diff --git a/vd960DBN/docs/devlog.md b/vd960DBN/docs/devlog.md index ba8b71d..f26ab09 100644 --- a/vd960DBN/docs/devlog.md +++ b/vd960DBN/docs/devlog.md @@ -6,6 +6,35 @@ --- +## 2026-08-14 — 快照区功能恢复启用 + UART2 波特率澄清 + +### 背景 +printf 重入复位问题已确诊修复(2026-08-13,SPI 写无罪)。实验遗留的隔离代码收尾:快照区恢复启用、模拟写密度的 `sim_snap_spi` 实验桩移除。 + +### 变更 +| 文件 | 变更 | +|------|------| +| `peripheral_main.c` | `snap_init()` 恢复(去 #if 0);`offlog_boot()` 恢复(上电复位原因记入事件日志);删除 `sim_snap_spi` 实验函数 + 主循环调用 | +| `loop_uart_proto.h` | 注释 UART2 波特率 115200 → 192000 | +| `loop_uart_proto.c` | 注释 UART2(19200) → UART2(192000) | +| `snapshot.c/h` | 无需改动(2026-08-12 已实现:环形 64B SnapRec、懒擦、掉电恢复、BLE 0x28/0x29/0x2A) | + +### UART2 波特率澄清 +- **UART2(Loop MCU 口)实际波特率 = 192000**,`usart_biz.c` 硬编码;协议文档写 115200 已过时,以代码为准 +- `g_storage_uart_baud = 19200`(peripheral_main.c)是**独立配置项**(BLE 可读可改 + flash 存储),不驱动 UART2 波特率——BLE 小程序看到 19200 不代表 UART2 实际速率 +- **后续规划:UART2 RX 改 DMA/双缓冲**,解决偶发丢帧(1-3 分钟一次 checksum fail) + +### 验证 +- `tests/test_snapshot.c` 9 用例 ALL PASS(gcc 隔离单测) +- `check_c_balance.py` 3 文件 OK +- 板级待办:上电 `INIT: snap ok`、BLE 0x28/0x29/0x2A 查询、断网期间快照落盘 + +### 遗留 +- [ ] UART2 RX DMA 方案落地(防丢帧) +- [ ] 板级验证快照 BLE 查询命令 + +--- + ## 2026-08-13 — 复位/卡死全链路诊断闭环:printf 重入 + 回调卡死 + UART2 丢字节 ### 现场症状(多轮) @@ -27,7 +56,7 @@ 2. json_sensor_callback enter PRINT: printf 处理 %d %d %d 死循环 (LUP Rx %s 打印成功, enter %d 打印卡死) → 主循环永久卡死 3. UART2 丢字节: LUP Rx 打印 190B @256000 = 7.4ms 关中断 (PRINT 临界区) - → UART2(19200) RX 溢出丢字节 → 帧解析错位 → 粘帧 → checksum fail + → UART2(192000) RX 溢出丢字节 → 帧解析错位 → 粘帧 → checksum fail + g_pkg_uart_2.flag 清理缺失 → 坏帧反复处理 → fail 刷屏 ``` @@ -53,11 +82,11 @@ ### 遗留待办 -- [ ] UART2 偶发丢帧(1-3 分钟一次 checksum fail):波特率 19200→115200(需 Loop MCU 配合)或 RX 改 DMA/双缓冲 +- [ ] UART2 偶发丢帧(1-3 分钟一次 checksum fail):RX 改 DMA/双缓冲(波特率已确认 192000,非 19200) - [ ] json_sensor_callback enter PRINT 的 printf %d 卡死根因(newlib lock / UART1 TC 轮询)——已注释规避,恢复前需查明 - [ ] IWDG 卡死时未在 4s 复位:LSI 频率偏差 or 配置问题 - [ ] `g_lup_sensor_cb` 单回调竞争:iot_evt_sensor_cb 与 json_sensor_callback 后注册覆盖先注册,事件沿检测可能被跳过(需多回调或合并) -- [ ] 恢复快照区功能:`snap_init` 取消 `#if 0`、移除 `sim_snap_spi` 模拟实验,验证 BLE 0x28/0x29/0x2A 查询 +- [x] 恢复快照区功能(2026-08-14):`snap_init` 已恢复、`sim_snap_spi` 已移除,待板级验证 BLE 0x28/0x29/0x2A 查询 ---