// hard fault handler in C, // with stack frame location as input parameter void hard_fault_handler_c (unsigned int * hardfault_args) { unsigned int stacked_r0; unsigned int stacked_r1; unsigned int stacked_r2; unsigned int stacked_r3; unsigned int stacked_r12; unsigned int stacked_lr; unsigned int stacked_pc; unsigned int stacked_psr; 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]); printf ("\n\n[Hard faulthandler - all numbers in hex]\n"); printf ("R0 = %x\n",stacked_r0); printf ("R1 = %x\n",stacked_r1); printf ("R2 = %x\n",stacked_r2); printf ("R3 = %x\n",stacked_r3); printf ("R12 = %x\n",stacked_r12); printf ("LR [R14] = %x subroutine call return address\n",stacked_lr); printf ("PC [R15] = %x program counter\n", stacked_pc); printf ("PSR = %x\n",stacked_psr); /******************* Add yourdebug trace here ***********************/ _int_kernel_isr(); } /* hard fault interrupt handler */ void _int_hardfault_isr( ) { __asm("TST LR, #4"); __asm("ITE EQ"); __asm("MRSEQ R0,MSP"); __asm("MRSNE R0,PSP"); __asm("Bhard_fault_handler_c"); }