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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include <osdebug.h>
#include "LPC17xx.h"
enum FaultType {
NMI, HardFault, MemManage, BusFault, UsageFault,
};
static inline void traceme() {
unsigned int i;
void * frame, * pc;
i = 0;
frame = __builtin_frame_address(i);
pc = frame ? __builtin_return_address(i) : 0;
DBGOUT("lv%u; PC = %p, frame = %p\r\n", i, pc, frame);
}
static int general_Handler(enum FaultType fault) {
DBGOUT("***FAULT***\r\n");
traceme();
switch (fault) {
case NMI:
DBGOUT("NMI\r\n");
break;
case HardFault:
DBGOUT("HardFault\r\nHFSR: %p\r\n", SCB->HFSR);
break;
case MemManage:
DBGOUT("MemManage\r\nCSFR: %p\r\nMMFAR: %p\r\n", SCB->CFSR, SCB->MMFAR);
break;
case BusFault:
DBGOUT("BusFault\r\nCFSR: %p\r\nBFAR: %p\r\n", SCB->CFSR, SCB->BFAR);
break;
case UsageFault:
DBGOUT("UsageFault\r\nCFSR: %p\r\nBFAR: %p\r\n", SCB->CFSR, SCB->BFAR);
break;
}
while(1);
return 0;
}
int NMI_Handler() { return general_Handler(NMI); }
int HardFault_Handler() { return general_Handler(HardFault); }
int MemManage_Handler() { return general_Handler(MemManage); }
int BusFault_Handler() { return general_Handler(BusFault); }
int UsageFault_Handler() { return general_Handler(UsageFault); }
|