诊断修正(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 文件反查函数
98 lines
3.1 KiB
C
98 lines
3.1 KiB
C
/********************************** (C) COPYRIGHT *******************************
|
|
* File Name : ch32v20x_it.c
|
|
* Author : WCH
|
|
* Version : V1.0.0
|
|
* Date : 2022/06/16
|
|
* Description : Main Interrupt Service Routines.
|
|
*********************************************************************************
|
|
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
|
|
* Attention: This software (modified or not) and binary are used for
|
|
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
|
|
*******************************************************************************/
|
|
|
|
/*********************************************************************
|
|
* INCLUDES
|
|
*/
|
|
#include "ch32v20x_it.h"
|
|
#include "eth_driver.h"
|
|
#include "CONFIG.h"
|
|
#include "debug.h"
|
|
|
|
/*********************************************************************
|
|
* LOCAL FUNCTIONS
|
|
*/
|
|
void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
|
void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
|
void BB_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
|
void ETH_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
|
void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
|
|
|
|
|
/*********************************************************************
|
|
* @fn NMI_Handler
|
|
*
|
|
* @brief This function handles NMI exception.
|
|
*
|
|
* @return None
|
|
*/
|
|
void NMI_Handler(void)
|
|
{
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn HardFault_Handler
|
|
*
|
|
* @brief This function handles Hard Fault exception.
|
|
*
|
|
* @return None
|
|
*/
|
|
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)
|
|
{
|
|
}
|
|
}
|
|
|
|
/*********************************************************************
|
|
* @fn BB_IRQHandler
|
|
*
|
|
* @brief BB Interrupt for BLE.
|
|
*
|
|
* @return None
|
|
*/
|
|
void BB_IRQHandler(void)
|
|
{
|
|
BB_IRQLibHandler();
|
|
}
|
|
|
|
|
|
/*********************************************************************
|
|
* @fn ETH_IRQHandler
|
|
*
|
|
* @brief This function handles ETH exception.
|
|
*
|
|
* @return none
|
|
*/
|
|
void ETH_IRQHandler(void)
|
|
{
|
|
WCHNET_ETHIsr();
|
|
}
|
|
|
|
void TIM2_IRQHandler( void )
|
|
{
|
|
WCHNET_TimeIsr(WCHNETTIMERPERIOD);
|
|
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
|
|
}
|
|
|