You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cortex M0+中保存触发硬件故障的地址及调试信息?

STM32G0B0(Cortex-M0+)硬件故障调试及IWDG复位排查问题

我基于STM32G0B0(Cortex-M0+)做裸机C开发,仅用定义文件和ARM底层代码,未使用SDK。近期遇到独立看门狗(IWDG)相关问题:

  • 此前IWDG作为窗口看门狗始终无法正常工作,但作为普通看门狗运行稳定
  • 开发阶段将超时时间设为10ms观测异常,一直未触发,直到今天出现复位情况

我需要排查此次复位原因:是代码执行问题、触发了HardwareFault()还是未实现向量导致(除非出现BUG)。希望找到适用于Cortex-M0+的调试方法,至少保存触发硬件故障的地址,若能保存更多调试信息更佳,以便复位后打印这些信息。


尝试过的方案及问题

编辑1:参考Silabs社区方案编译报错

尝试了一个声称适用于Cortex-M0的HardFault处理代码,但编译报错:

void debugHardfault(uint32_t *sp)
{
    uint32_t r0  = sp[0];
    uint32_t r1  = sp[1];
    uint32_t r2  = sp[2];
    uint32_t r3  = sp[3];
    uint32_t r12 = sp[4];
    uint32_t lr  = sp[5];
    uint32_t pc  = sp[6];
    uint32_t psr = sp[7];
    while(1);
}

__attribute__( (naked) )
void HardFault_Handler(void)
{
    __asm volatile
    (
        "mrs r0, msp                                   \n"
        "mov r1, #4                                    \n"
        "mov r2, lr                                    \n"
        "tst r2, r1                                    \n"
        "beq jump_debugHardfault                       \n"
        "mrs r0, psp                                   \n"
        "jump_debugHardfault:                          \n"
        "ldr r1, debugHardfault_address                \n"
        "bx r1                                         \n"
        "debugHardfault_address: .word debugHardfault  \n"
    );
}

错误信息:

selected processor does not support `mrs r0,msp' in Thumb mode

编辑2:参考Segger方案无法触发收集函数

找到适用于Cortex-M0的汇编Handler并实现:

.syntax unified
    .cpu cortex-m0plus
    .fpu softvfp
    .thumb

    .global HardFault_Handler
    .global NMI_Handler
    .global PendSV_Handler
    .global SVC_Handler


 HardFault_Handler:
 BusFault_Handler:
 UsageFault_Handler:
 MemManage_Handler:
 PendSV_Handler:
 SVC_Handler:
 NMI_Handler:

         ;// This version is for Cortex M0
         movs   R0, #4
         mov    R1, LR
         tst    R0, R1            ;// Check EXC_RETURN in Link register bit 2.
         bne    Uses_PSP
         mrs    R0, MSP           ;// Stacking was using MSP.
         b      Pass_StackPtr
 Uses_PSP:
         mrs    R0, PSP           ;// Stacking was using PSP.
 Pass_StackPtr:
         ldr    R2,=HardFaultHandler
         bx     R2                ;// Stack pointer passed through R0. 

         .end

禁用IWDG后,通过以下代码手动触发硬件故障:

int _UnalignedAccess(void) {
  int r;
  volatile unsigned int* p;

  p = (unsigned int*)0x20000001; // 非对齐地址
    r = *p;
  return r;
}

调试信息收集函数:

void HardFaultHandler(unsigned int* pStack) {

    HardFaultRegs.SavedRegs.r0 = pStack[0];  // 寄存器R0
    HardFaultRegs.SavedRegs.r1 = pStack[1];  // 寄存器R1
    HardFaultRegs.SavedRegs.r2 = pStack[2];  // 寄存器R2
    HardFaultRegs.SavedRegs.r3 = pStack[3];  // 寄存器R3
    HardFaultRegs.SavedRegs.r12 = pStack[4];  // 寄存器R12
    HardFaultRegs.SavedRegs.lr = pStack[5];  // 链接寄存器LR
    HardFaultRegs.SavedRegs.pc = pStack[6];  // 程序计数器PC
    HardFaultRegs.SavedRegs.psr.byte = pStack[7];  // 程序状态字PSR
}

问题:硬件故障被触发,但收集函数未被调用,直接导致崩溃复位(无看门狗参与),求解决思路。


内容的提问来源于stack exchange,提问作者yo3hcv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:27:05