void HardFault_Handler_Sub(unsigned int *hardfault_args)
{
static unsigned int stacked_r0;
static unsigned int stacked_r1;
static unsigned int stacked_r2;
static unsigned int stacked_r3;
static unsigned int stacked_r12;
static unsigned int stacked_lr;
static unsigned int stacked_pc;
static unsigned int stacked_psr;
static unsigned int SHCSR;
static unsigned char MFSR;
static unsigned char BFSR;
static unsigned short int UFSR;
static unsigned int HFSR;
static unsigned int DFSR;
static unsigned int MMAR;
static unsigned int BFAR;
static unsigned int AFSR;
#define STACK_DATA_SIZE 12
static unsigned int STACK_DATA[STACK_DATA_SIZE];
stacked_r0 = ((unsigned long)hardfault_args[0]);
stacked_r1 = ((unsigned long)hardfault_args[1]);
stacked_r2 = ((unsigned long)hardfault_args[2]);
stacked_r3 = ((unsigned long)hardfault_args[3]);
stacked_r12 = ((unsigned long)hardfault_args[4]);
stacked_lr = ((unsigned long)hardfault_args[5]);
stacked_pc = ((unsigned long)hardfault_args[6]);
stacked_psr = ((unsigned long)hardfault_args[7]);
SHCSR = (*((volatile unsigned long *)(0xE000ED24)));
MFSR = (*((volatile unsigned char *)(0xE000ED28)));
BFSR = (*((volatile unsigned char *)(0xE000ED29)));
UFSR = (*((volatile unsigned short int *)(0xE000ED2A)));
HFSR = (*((volatile unsigned long *)(0xE000ED2C)));
DFSR = (*((volatile unsigned long *)(0xE000ED30)));
MMAR = (*((volatile unsigned long *)(0xE000ED34)));
BFAR = (*((volatile unsigned long *)(0xE000ED38)));
AFSR = (*((volatile unsigned long *)(0xE000ED3C)));
unsigned int stacked_r0_base = stacked_r12;
for(unsigned int i = 0; i < STACK_DATA_SIZE; i++)
{
STACK_DATA[i] = (*((volatile unsigned long *)(stacked_r0_base)));
stacked_r0_base -= 4;
}
unsigned int len = 0;
len += sprintf(fault_buf + len, "R0 = 0x%x\r\n", stacked_r0);
len += sprintf(fault_buf + len, "R1 = 0x%x\r\n", stacked_r1);
len += sprintf(fault_buf + len, "R2 = 0x%x\r\n", stacked_r2);
len += sprintf(fault_buf + len, "R3 = 0x%x\r\n", stacked_r3);
len += sprintf(fault_buf + len, "R12 = 0x%x\r\n", stacked_r12);
len += sprintf(fault_buf + len, "LR[R14] = 0x%x\r\n", stacked_lr);
len += sprintf(fault_buf + len, "PC[R15] = 0x%x\r\n", stacked_pc);
len += sprintf(fault_buf + len, "PSR = 0x%x\r\n", stacked_psr);
len += sprintf(fault_buf + len, "SCB_SHCSR = 0x%lx\r\n", SCB->SHCSR);
len += sprintf(fault_buf + len, "SHCSR = 0x%x\r\n", SHCSR);
len += sprintf(fault_buf + len, "MFSR = 0x%x\r\n", MFSR);
len += sprintf(fault_buf + len, "BFSR = 0x%x\r\n", BFSR);
len += sprintf(fault_buf + len, "UFSR = 0x%x\r\n", UFSR);
len += sprintf(fault_buf + len, "HFSR = 0x%x\r\n", HFSR);
len += sprintf(fault_buf + len, "DFSR = 0x%x\r\n", DFSR);
len += sprintf(fault_buf + len, "MMAR = 0x%x\r\n", MMAR);
len += sprintf(fault_buf + len, "BFAR = 0x%x\r\n", BFAR);
len += sprintf(fault_buf + len, "AFSR = 0x%x\r\n", AFSR);
for(unsigned int i = 0; i < STACK_DATA_SIZE; i++)
{
len += sprintf(fault_buf + len, "DATA[%d] = 0x%x\r\n",i, STACK_DATA[i]);
}
// while (1)
{
bsp_uart_transmit(BSP_UART0, (uint8_t*)fault_buf, len, 0xFFFFFFFF);
}
while (1);
}
void HardFault_Handler(void)
{
__asm volatile(
" tst lr, #4 \n" /* The FPU enable bits are in the CPACR. */
" ite eq \n"
" \n"
" mrseq r0, msp \n" /* Enable CP10 and CP11 coprocessors, then save back. */
" mrsne r0, psp \n"
" b HardFault_Handler_Sub ");
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
M4内核HardFault打印
最新推荐文章于 2024-05-12 15:04:02 发布