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:
@@ -219,7 +219,7 @@ Magic | Header | Data | CheckByte
|
|||||||
|
|
||||||
| type | 事件 | payload | 说明 |
|
| 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 连接成功 |
|
| `0x10` | iot_connect | — | MQTT TCP 连接成功 |
|
||||||
| `0x11` | iot_ready | — | MQTT 订阅完成 → 发 initialize(重复上线直接证据) |
|
| `0x11` | iot_ready | — | MQTT 订阅完成 → 发 initialize(重复上线直接证据) |
|
||||||
| `0x12` | iot_disconnect | `[1]` reason:1=断开 2=超时 3=CONNACK拒绝 4=连接超时 | MQTT 断连 |
|
| `0x12` | iot_disconnect | `[1]` reason:1=断开 2=超时 3=CONNACK拒绝 4=连接超时 | MQTT 断连 |
|
||||||
|
|||||||
@@ -124,13 +124,15 @@ enum {
|
|||||||
#define OFFLOG_RCC_BASE 0x40021000UL
|
#define OFFLOG_RCC_BASE 0x40021000UL
|
||||||
#define OFFLOG_RCC_RSTSCKR (*(volatile uint32_t *)(OFFLOG_RCC_BASE + 0x24UL))
|
#define OFFLOG_RCC_RSTSCKR (*(volatile uint32_t *)(OFFLOG_RCC_BASE + 0x24UL))
|
||||||
|
|
||||||
/* 复位原因位 (RCC_RSTSCKR, STM32F1/CH32V20x 兼容布局, 待板上验证) */
|
/* 复位原因位 (RCC_RSTSCKR, CH32V20x 布局 — 2026-08-12 对照 WCH ch32v20x.h 修正,
|
||||||
#define OFFLOG_RST_IWDG (1UL << 31) /* 独立看门狗复位 (IWDG 超时 → 主循环卡死!) */
|
原定义错位: IWDG/SFT/POR 位置全错, 且 RMVF 清标志写错位导致标志从未清除) */
|
||||||
|
#define OFFLOG_RST_LPWR (1UL << 31) /* 低功耗复位 */
|
||||||
#define OFFLOG_RST_WWDG (1UL << 30) /* 窗口看门狗复位 */
|
#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_PIN (1UL << 26) /* NRST 引脚复位 */
|
||||||
#define OFFLOG_RST_POR (1UL << 25) /* 上电/掉电复位 (真断电!) */
|
#define OFFLOG_RST_RMVF (1UL << 24) /* 清除复位标志 (写 1 清全部, WCH: RCC_RMVF) */
|
||||||
#define OFFLOG_RST_SFT (1UL << 24) /* 软件复位 NVIC_SystemReset */
|
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* API
|
* API
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ int main(void)
|
|||||||
{
|
{
|
||||||
uint32_t rcc_rst = OFFLOG_RCC_RSTSCKR;
|
uint32_t rcc_rst = OFFLOG_RCC_RSTSCKR;
|
||||||
offlog_boot(rcc_rst);
|
offlog_boot(rcc_rst);
|
||||||
OFFLOG_RCC_RSTSCKR |= (1UL << 27); /* RMVF: 清复位标志 */
|
OFFLOG_RCC_RSTSCKR |= OFFLOG_RST_RMVF; /* RMVF (bit24): 清复位标志 (原写 bit27=PORRSTF 无效) */
|
||||||
}
|
}
|
||||||
|
|
||||||
load_cfg_from_flash();
|
load_cfg_from_flash();
|
||||||
|
|||||||
@@ -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.c:RMVF 清除 `|= OFFLOG_RST_RMVF`
|
||||||
|
- 协议文档 boot 事件位解析同步更新
|
||||||
|
|
||||||
|
### 下一步(板上)
|
||||||
|
|
||||||
|
修正后重新上电,`RST_REASON` 将只显示**最近一次**复位原因:
|
||||||
|
- 若仍显示 PORRSTF(bit27)→ **电源问题实锤**:查 3.3V 供电余量、W25Q32 VCC 电容、SPI 擦除瞬间跌落
|
||||||
|
- 若显示 IWDGRSTF(bit29)→ 主循环死锁,继续查软件
|
||||||
|
- 若显示 PINRSTF(bit26)→ NRST 干扰/复位电路
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 2026-08-12 — 设备不断重启修复:init/clear 同步全量擦除阻塞超 IWDG
|
## 2026-08-12 — 设备不断重启修复:init/clear 同步全量擦除阻塞超 IWDG
|
||||||
|
|
||||||
### 现场症状
|
### 现场症状
|
||||||
|
|||||||
Reference in New Issue
Block a user