fix(vd960DBN): HardFault_Handler 抓 RISC-V 异常现场 — 定位崩溃源头

诊断修正(2026-08-13): RST=0x10000000(bit28 SFT) = HardFault_Handler
内 NVIC_SystemReset, 不是硬件复位! 复位紧跟 LUP 传感器帧(30ms内),
0xC0 帧处理路径触发代码异常。模拟实验 SPI 写(cnt=64/128 擦除+头写)
全部成功, SPI 写本身不触发复位, 推翻 VDD 跌落/共线假设。

- HardFault_Handler 打印 mcause(0x342)/mepc(0x341)/mtval(0x343)
  mcause 5/7=野指针(mtval给地址) 2=非法指令 4/6=未对齐
  mepc 用 .map 文件反查函数
This commit is contained in:
wangfq
2026-08-13 15:31:34 +08:00
parent 87c8e01936
commit 1bbaac0046
@@ -16,6 +16,7 @@
#include "ch32v20x_it.h"
#include "eth_driver.h"
#include "CONFIG.h"
#include "debug.h"
/*********************************************************************
* LOCAL FUNCTIONS
@@ -47,6 +48,16 @@ void NMI_Handler(void)
*/
void HardFault_Handler(void)
{
/* 诊断 (2026-08-13): 抓 RISC-V 异常现场, 定位 HardFault 源头
mcause: 5=Load访问错误 7=Store访问错误 2=非法指令 4/6=未对齐
mepc : 异常指令 PC (用 .map 文件反查函数)
mtval : 错误访问地址 (Load/Store fault 时=野指针地址) */
uint32_t _mcause = 0, _mepc = 0, _mtval = 0;
__asm__ volatile("csrr %0, 0x342" : "=r"(_mcause));
__asm__ volatile("csrr %0, 0x341" : "=r"(_mepc));
__asm__ volatile("csrr %0, 0x343" : "=r"(_mtval));
PRINT("HARDFAULT: mcause=0x%08lx mepc=0x%08lx mtval=0x%08lx\n",
(unsigned long)_mcause, (unsigned long)_mepc, (unsigned long)_mtval);
NVIC_SystemReset();
while(1)
{