@@ -60,11 +60,41 @@ void HardFault_Handler(void)
6060
6161 // Flags about hardfault / busfault
6262 // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Cihdjcfc.html for reference
63- volatile bool isFaultPrecise = ((SCB -> CFSR >> SCB_CFSR_BUSFAULTSR_Pos ) & (1 << 1 ) ? true : false);
64- volatile bool isFaultImprecise = ((SCB -> CFSR >> SCB_CFSR_BUSFAULTSR_Pos ) & (1 << 2 ) ? true : false);
65- volatile bool isFaultOnUnstacking = ((SCB -> CFSR >> SCB_CFSR_BUSFAULTSR_Pos ) & (1 << 3 ) ? true : false);
66- volatile bool isFaultOnStacking = ((SCB -> CFSR >> SCB_CFSR_BUSFAULTSR_Pos ) & (1 << 4 ) ? true : false);
67- volatile bool isFaultAddressValid = ((SCB -> CFSR >> SCB_CFSR_BUSFAULTSR_Pos ) & (1 << 7 ) ? true : false);
63+ // Configurable Fault Status Register
64+ volatile uint32_t _CFSR = SCB -> CFSR ;
65+
66+ // IACCVIOL: Instruction access violation
67+ volatile bool isFaultInstructionAccessViolation = ((_CFSR & (1 << 0 )) ? true : false);
68+ // DACCVIOL: Data access violation
69+ volatile bool isFaultDataAccessViolation = ((_CFSR & (1 << 1 )) ? true : false);
70+ // MUNSTKERR: Unstacking error
71+ volatile bool isFaultUnstackingError = ((_CFSR & (1 << 3 )) ? true : false);
72+ // MSTKERR: Stacking error
73+ volatile bool isFaultStackingError = ((_CFSR & (1 << 4 )) ? true : false);
74+ // MMARVALID: MMAR is valid
75+ volatile bool isMarkedMemoryAddressValid = ((_CFSR & (1 << 7 )) ? true : false);
76+ // IBUSERR: Instruction bus error
77+ volatile bool isFaultInstructionBusError = ((_CFSR & (1 << 8 )) ? true : false);
78+ // PRECISERR: Precise data bus error
79+ volatile bool isFaultPreciseDataBusError = ((_CFSR & (1 << 9 )) ? true : false);
80+ // IMPRECISERR: Imprecise data bus error
81+ volatile bool isFaultImpreciseDataBusError = ((_CFSR & (1 << 10 )) ? true : false);
82+ // LSPERR: Lazy state preservation error
83+ volatile bool isFaultLazyStatePreservationError = ((_CFSR & (1 << 13 )) ? true : false);
84+ // BFARVALID: BFAR is valid
85+ volatile bool isFaultBusFaultAddressValid = ((_CFSR & (1 << 15 )) ? true : false);
86+ // UNDEFINSTR: Undefined instruction usage fault
87+ volatile bool isUndefinedInstructionUsageFault = ((_CFSR & (1 << 16 )) ? true : false);
88+ // INVSTATE: Invalid state usage fault
89+ volatile bool isInvalidStateUsageFault = ((_CFSR & (1 << 17 )) ? true : false);
90+ // INVPC: Invalid PC load usage fault
91+ volatile bool isInvalidPcLoadUsageFault = ((_CFSR & (1 << 18 )) ? true : false);
92+ // NOCP: No coprocessor usage fault
93+ volatile bool isNoCoprocessorUsageFault = ((_CFSR & (1 << 19 )) ? true : false);
94+ // UNALIGNED: Unaligned access usage fault
95+ volatile bool isUnalignedAccessUsageFault = ((_CFSR & (1 << 24 )) ? true : false);
96+ // DIVBYZERO: Divide by zero usage fault
97+ volatile bool isDivideByZeroUsageFault = ((_CFSR & (1 << 25 )) ? true : false);
6898
6999 // Hard Fault Status Register
70100 volatile unsigned long _HFSR = (* ((volatile unsigned long * )(0xE000ED2C )));
0 commit comments