void HardFault_C_Handler(ExceptionRegisters_t *regs, uint32_t *pXtraRegs) { if (!pyb_hard_fault_debug) { NVIC_SystemReset(); } /* rocky ignore // We need to disable the USB so it doesn't try to write data out on // the VCP and then block indefinitely waiting for the buffer to drain. pyb_usb_flags = 0; */ mp_hal_stdout_tx_str("HardFault\r\n"); print_reg("R0 ", regs->r0); print_reg("R1 ", regs->r1); print_reg("R2 ", regs->r2); print_reg("R3 ", regs->r3); print_reg("R12 ", regs->r12); print_reg("SP ", (uint32_t)regs); print_reg("LR ", regs->lr); print_reg("PC ", regs->pc); print_reg("XPSR ", regs->xpsr); print_reg("R4 ", pXtraRegs[7]); print_reg("R5 ", pXtraRegs[6]); print_reg("R6 ", pXtraRegs[5]); print_reg("R7 ", pXtraRegs[4]); print_reg("R8 ", pXtraRegs[3]); print_reg("R9 ", pXtraRegs[2]); print_reg("R10 ", pXtraRegs[1]); print_reg("R11 ", pXtraRegs[0]); uint32_t cfsr = SCB->CFSR; print_reg("HFSR ", SCB->HFSR); print_reg("CFSR ", cfsr); if (cfsr & 0x80) { print_reg("MMFAR ", SCB->MMFAR); } if (cfsr & 0x8000) { print_reg("BFAR ", SCB->BFAR); } if ((void*)_RAM_START <= (void*)regs && (void*)regs < (void*)_RAM_END) { mp_hal_stdout_tx_str("Stack:\r\n"); uint32_t *stack_top = (uint32_t*) _ESTACK; if ((void*)regs < (void*)_HEAP_END) { // stack not in static stack area so limit the amount we print stack_top = (uint32_t*)regs + 32; } for (uint32_t *sp = (uint32_t*)regs; sp < stack_top; ++sp) { print_hex_hex(" ", (uint32_t)sp, *sp); } } /* Go to infinite loop when Hard Fault exception occurs */ __fatal_error("HardFault"); }
void HardFault_C_Handler(ExceptionRegisters_t *regs) { if (!pyb_hard_fault_debug) { NVIC_SystemReset(); } #if MICROPY_HW_ENABLE_USB // We need to disable the USB so it doesn't try to write data out on // the VCP and then block indefinitely waiting for the buffer to drain. pyb_usb_flags = 0; #endif mp_hal_stdout_tx_str("HardFault\r\n"); print_reg("R0 ", regs->r0); print_reg("R1 ", regs->r1); print_reg("R2 ", regs->r2); print_reg("R3 ", regs->r3); print_reg("R12 ", regs->r12); print_reg("SP ", (uint32_t)regs); print_reg("LR ", regs->lr); print_reg("PC ", regs->pc); print_reg("XPSR ", regs->xpsr); uint32_t cfsr = SCB->CFSR; print_reg("HFSR ", SCB->HFSR); print_reg("CFSR ", cfsr); if (cfsr & 0x80) { print_reg("MMFAR ", SCB->MMFAR); } if (cfsr & 0x8000) { print_reg("BFAR ", SCB->BFAR); } if ((void*)&_ram_start <= (void*)regs && (void*)regs < (void*)&_ram_end) { mp_hal_stdout_tx_str("Stack:\r\n"); uint32_t *stack_top = &_estack; if ((void*)regs < (void*)&_heap_end) { // stack not in static stack area so limit the amount we print stack_top = (uint32_t*)regs + 32; } for (uint32_t *sp = (uint32_t*)regs; sp < stack_top; ++sp) { print_hex_hex(" ", (uint32_t)sp, *sp); } } /* Go to infinite loop when Hard Fault exception occurs */ while (1) { __fatal_error("HardFault"); } }