Skip to content

Commit 1c9faa3

Browse files
authored
Improve hard fault handler for STM32F4XX and STM32F7XX (#3045)
***NO_CI***
1 parent 9498e56 commit 1c9faa3

File tree

1 file changed

+35
-5
lines changed

1 file changed

+35
-5
lines changed

targets/ChibiOS/_common/hard_fault_handler.c

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)