|
发表于 2012-11-26 08:41:42
|
显示全部楼层
02
* HardFaultHandler_C:
03
* This is called from the HardFault_HandlerAsm with a pointer the Fault stack
04
* as the parameter. We can then read the values from the stack and place them
05
* into local variables for ease of reading.
06
* We then read the various Fault Status and Address Registers to help decode
07
* cause of the fault.
08
* The function ends with a BKPT instruction to force control back into the debugger
09
*/
10
void HardFault_HandlerC(unsigned long *hardfault_args){
11
volatile unsigned long stacked_r0 ;
12
volatile unsigned long stacked_r1 ;
13
volatile unsigned long stacked_r2 ;
14
volatile unsigned long stacked_r3 ;
15
volatile unsigned long stacked_r12 ;
16
volatile unsigned long stacked_lr ;
17
volatile unsigned long stacked_pc ;
18
volatile unsigned long stacked_psr ;
19
volatile unsigned long _CFSR ;
20
volatile unsigned long _HFSR ;
21
volatile unsigned long _DFSR ;
22
volatile unsigned long _AFSR ;
23
volatile unsigned long _BFAR ;
24
volatile unsigned long _MMAR ;
25
26
stacked_r0 = ((unsigned long)hardfault_args[0]) ;
27
stacked_r1 = ((unsigned long)hardfault_args[1]) ;
28
stacked_r2 = ((unsigned long)hardfault_args[2]) ;
29
stacked_r3 = ((unsigned long)hardfault_args[3]) ;
30
stacked_r12 = ((unsigned long)hardfault_args[4]) ;
31
stacked_lr = ((unsigned long)hardfault_args[5]) ;
32
stacked_pc = ((unsigned long)hardfault_args[6]) ;
33
stacked_psr = ((unsigned long)hardfault_args[7]) ;
34
35
// Configurable Fault Status Register
36
// Consists of MMSR, BFSR and UFSR
37
_CFSR = (*((volatile unsigned long *)(0xE000ED28))) ;
38
39
// Hard Fault Status Register
40
_HFSR = (*((volatile unsigned long *)(0xE000ED2C))) ;
41
42
// Debug Fault Status Register
43
_DFSR = (*((volatile unsigned long *)(0xE000ED30))) ;
44
45
// Auxiliary Fault Status Register
46
_AFSR = (*((volatile unsigned long *)(0xE000ED3C))) ;
47
48
// Read the Fault Address Registers. These may not contain valid values.
49
// Check BFARVALID/MMARVALID to see if they are valid values
50
// MemManage Fault Address Register
51
_MMAR = (*((volatile unsigned long *)(0xE000ED34))) ;
52
// Bus Fault Address Register
53
_BFAR = (*((volatile unsigned long *)(0xE000ED38))) ;
54
55
__asm("BKPT #0\n") ; // Break into the debugger
56
}
57
58
__attribute__((naked))
59
PE_ISR(Cpu_ivINT_Hard_Fault)
60
{
61
__asm volatile (
62
" movs r0,#4 \n"
63
" movs r1, lr \n"
64
" tst r0, r1 \n"
65
" beq _MSP \n"
66
" mrs r0, psp \n"
67
" b _HALT \n"
68
"_MSP: \n"
69
" mrs r0, msp \n"
70
"_HALT: \n"
71
" ldr r1,[r0,#20] \n"
72
" b HardFault_HandlerC \n"
73
" bkpt #0 \n"
74
);
75
}
|
|