feat(vd960DBN): 恢复快照区功能, 移除 sim_snap_spi 实验桩, UART2 波特率注释修正
- 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 方案列入待办
This commit is contained in:
@@ -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下发命令并获取数据。
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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): 清复位标志 */
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user