如何在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
相关产品推荐
相关产品推荐

