fix(vd960DBN): 复位原因位定义错位修正 — RST_REASON=0x08000000=PORRSTF

现场: RST_REASON 打印 0x08000000, 对照 WCH ch32v20x.h 发现
offlog.h 位定义整体错位 (IWDG=bit31实为bit29, SFT=bit24实为bit28,
POR=bit25实为bit27, LPWR=bit29实为bit31)
结论: 0x08000000=PORRSTF=上电/掉电复位 → 电源跌落方向 (SPI擦除电流脉冲?)
修正:
- offlog.h 位定义对齐 WCH 库, 新增 OFFLOG_RST_RMVF=bit24
- peripheral_main.c RMVF 清除改 bit24 (原写 bit27=PORRSTF 只读位,
  复位标志从未清除, 历史累积污染诊断)
- 协议文档 boot 事件位解析同步
测试回归全过
This commit is contained in:
wangfq
2026-08-12 18:58:16 +08:00
parent f5b52d5bde
commit eadc67584f
4 changed files with 1131 additions and 1091 deletions
+1 -1
View File
@@ -219,7 +219,7 @@ Magic | Header | Data | CheckByte
| type | 事件 | payload | 说明 |
|------|------|---------|------|
| `0x01` | boot | `[4]` 复位原因寄存器原始值(大端),位解析:bit31=IWDG(看门狗) bit30=WWDG bit29=LPWR bit26=NRST引脚 bit25=POR(真断电) bit24=软件复位 | 上电/复位 |
| `0x01` | boot | `[4]` 复位原因寄存器原始值(大端),位解析:bit31=LPWR bit30=WWDG bit29=IWDG(看门狗) bit28=软件复位 bit27=POR(真断电) bit26=NRST引脚 | 上电/复位 |
| `0x10` | iot_connect | — | MQTT TCP 连接成功 |
| `0x11` | iot_ready | — | MQTT 订阅完成 → 发 initialize(重复上线直接证据) |
| `0x12` | iot_disconnect | `[1]` reason1=断开 2=超时 3=CONNACK拒绝 4=连接超时 | MQTT 断连 |
@@ -124,13 +124,15 @@ enum {
#define OFFLOG_RCC_BASE 0x40021000UL
#define OFFLOG_RCC_RSTSCKR (*(volatile uint32_t *)(OFFLOG_RCC_BASE + 0x24UL))
/* 复位原因位 (RCC_RSTSCKR, STM32F1/CH32V20x 兼容布局, 待板上验证) */
#define OFFLOG_RST_IWDG (1UL << 31) /* 独立看门狗复位 (IWDG 超时 → 主循环卡死!) */
/* 复位原因位 (RCC_RSTSCKR, CH32V20x 布局 — 2026-08-12 对照 WCH ch32v20x.h 修正,
原定义错位: IWDG/SFT/POR 位置全错, 且 RMVF 清标志写错位导致标志从未清除) */
#define OFFLOG_RST_LPWR (1UL << 31) /* 低功耗复位 */
#define OFFLOG_RST_WWDG (1UL << 30) /* 窗口看门狗复位 */
#define OFFLOG_RST_LPWR (1UL << 29) /* 低功耗复位 */
#define OFFLOG_RST_IWDG (1UL << 29) /* 独立看门狗复位 (IWDG 超时 → 主循环卡死!) */
#define OFFLOG_RST_SFT (1UL << 28) /* 软件复位 NVIC_SystemReset */
#define OFFLOG_RST_POR (1UL << 27) /* 上电/掉电复位 (真断电!) */
#define OFFLOG_RST_PIN (1UL << 26) /* NRST 引脚复位 */
#define OFFLOG_RST_POR (1UL << 25) /* 上电/掉电复位 (真断电!) */
#define OFFLOG_RST_SFT (1UL << 24) /* 软件复位 NVIC_SystemReset */
#define OFFLOG_RST_RMVF (1UL << 24) /* 清除复位标志 (写 1 清全部, WCH: RCC_RMVF) */
/*===========================================================================
* API
@@ -319,7 +319,7 @@ int main(void)
{
uint32_t rcc_rst = OFFLOG_RCC_RSTSCKR;
offlog_boot(rcc_rst);
OFFLOG_RCC_RSTSCKR |= (1UL << 27); /* RMVF: 清复位标志 */
OFFLOG_RCC_RSTSCKR |= OFFLOG_RST_RMVF; /* RMVF (bit24): 清复位标志 (原写 bit27=PORRSTF 无效) */
}
load_cfg_from_flash();
+38
View File
@@ -6,6 +6,44 @@
---
## 2026-08-12 — 复位原因位定义错位修正 + POR 复位定位(电源方向)
### 诊断进展(现场 RST_REASON 打印)
新固件启动首行输出 `RST_REASON: 0x08000000`
对照 WCH 官方库 `ch32v20x.h`RCC_RSTSCKR 定义)发现 **offlog.h 复位原因位定义整体错位**
| 实际位 | 含义 | offlog 原定义 | 状态 |
|--------|------|--------------|------|
| bit31 | LPWR | bit29 | ❌ |
| bit30 | WWDG | bit30 | ✓ |
| bit29 | IWDG | bit31 | ❌ |
| bit28 | SFT 软件复位 | bit24 | ❌ |
| bit27 | **POR 上电/掉电复位** | bit25 | ❌ |
| bit26 | PIN NRST | bit26 | ✓ |
| bit24 | RMVF 清标志 | main 写 bit27 | ❌ |
### 两个结论
1. **`0x08000000` = PORRSTF(上电/掉电复位)** → 设备被**电源跌落**复位,不是看门狗、不是软件死锁。方向:SPI 擦除电流脉冲(W25Q32 ~20mA 级)或供电余量不足 → 3.3V 跌落触发 PDR。**待现场量测 3.3V 在 SPI 擦除瞬间的跌落**。
2. **RMVF 清除写错位**bit27 实为 PORRSTF 只读位)→ 复位标志从未清除、历史累积 → 修正为 bit24。
### 修正
- offlog.h:复位原因位定义对齐 WCH 库(IWDG=bit29 / SFT=bit28 / POR=bit27 / LPWR=bit31),新增 OFFLOG_RST_RMVF=bit24
- peripheral_main.cRMVF 清除 `|= OFFLOG_RST_RMVF`
- 协议文档 boot 事件位解析同步更新
### 下一步(板上)
修正后重新上电,`RST_REASON` 将只显示**最近一次**复位原因:
- 若仍显示 PORRSTFbit27)→ **电源问题实锤**:查 3.3V 供电余量、W25Q32 VCC 电容、SPI 擦除瞬间跌落
- 若显示 IWDGRSTF(bit29)→ 主循环死锁,继续查软件
- 若显示 PINRSTFbit26)→ NRST 干扰/复位电路
---
## 2026-08-12 — 设备不断重启修复:init/clear 同步全量擦除阻塞超 IWDG
### 现场症状