-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathhardfault.c
37 lines (31 loc) · 962 Bytes
/
hardfault.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "cmparams.h"
#include "hardfault.h"
void hardfault_handler_c(uint32_t *pulFaultStackAddress)
{
hardfault_regs.r0 = pulFaultStackAddress[0];
hardfault_regs.r1 = pulFaultStackAddress[1];
hardfault_regs.r2 = pulFaultStackAddress[2];
hardfault_regs.r3 = pulFaultStackAddress[3];
hardfault_regs.r12 = pulFaultStackAddress[4];
hardfault_regs.lr = pulFaultStackAddress[5];
hardfault_regs.pc = pulFaultStackAddress[6] | HARDFAULT_HAPPENED_MASK;
hardfault_regs.psr = pulFaultStackAddress[7];
NVIC_SystemReset();
}
void HardFault_Handler(void) __attribute__((naked));
void HardFault_Handler(void)
{
__asm__ volatile(
"movs r0, #4;"
"mov r1, lr;"
"tst r0, r1;" /* Check EXC_RETURN[2] */
"beq 1f;"
"mrs r0, psp;"
"ldr r1,=hardfault_handler_c;"
"bx r1;"
"1:mrs r0,msp;"
"ldr r1,=hardfault_handler_c;"
"bx r1;"
: : : "r0"
);
}