#include "ch.h" #include #include "hal.h" #define bkpt() __asm volatile("BKPT #0\n") OSAL_IRQ_HANDLER(HardFault_Handler) { // Copy to local variables (not pointers) to allow GDB "i loc" to directly show the info struct port_extctx ctx; volatile unsigned long _CFSR; volatile unsigned long _HFSR; volatile unsigned long _DFSR; volatile unsigned long _AFSR; volatile unsigned long _BFAR; volatile unsigned long _MMAR; // Get thread context. Contains main registers including PC and LR memcpy(&ctx, (void *)__get_PSP(), sizeof(struct port_extctx)); (void)ctx; // Configurable Fault Status Register // Consists of MMSR, BFSR and UFSR _CFSR = (*((volatile unsigned long *)(0xE000ED28))); (void)(_CFSR); // Hard Fault Status Register _HFSR = (*((volatile unsigned long *)(0xE000ED2C))); (void)(_HFSR); // Debug Fault Status Register _DFSR = (*((volatile unsigned long *)(0xE000ED30))); (void)(_DFSR); // Auxiliary Fault Status Register _AFSR = (*((volatile unsigned long *)(0xE000ED3C))); (void)(_AFSR); // Read the Fault Address Registers. These may not contain valid values. // Check BFARVALID/MMARVALID to see if they are valid values // MemManage Fault Address Register _MMAR = (*((volatile unsigned long *)(0xE000ED34))); (void)(_MMAR); // Bus Fault Address Register _BFAR = (*((volatile unsigned long *)(0xE000ED38))); (void)(_BFAR); // Cause debugger to stop. Ignored if no debugger is attached bkpt(); NVIC_SystemReset(); // If no debugger connected, just reset the board }