Everyone debugs hard faults wrong.
They stare at the stack trace and guess.
The right move: read the SCB->CFSR register before you do anything else.
On any Cortex-M3/M4/M7, that single 32-bit register tells you exactly what went wrong:
— IBUSERR: instruction fetch failed
— PRECISERR: data bus fault, address in BFAR
— UNSTKERR: fault happened during exception return
— INVSTATE: you jumped to an address with bit 0 clear (not Thumb)
Most hard faults are INVSTATE or PRECISERR.
Both have exact addresses.
Neither requires guessing.
The CPU already did your debugging.
You just have to read its confession.