Советую изучить как работает контроллер прерываний.
1. Почитайте книгу Джозеф Ю "Ядро Cortex M3 компании ARM"
2. Приведенный код позволяет понять, где "застряли".
CODE
void Hard_fault_handler_c(unsigned long* 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 ("[Hard fault handler]\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 = %x\n", stacked_lr);
printf ("PC = %x\n", stacked_pc);
printf ("PSR = %x\n", stacked_psr);
printf("BFAR: %x\n", *((volatile uint32_t*)0xE000ED38));
printf("CFSR: %x\n", *((volatile uint32_t*)0xE000ED28));
printf("HFSR: %x\n", *((volatile uint32_t*)0xE000ED2C));
printf("DFSR: %x\n", *((volatile uint32_t*)0xE000ED30));
printf("AFSR: %x\n", *((volatile uint32_t*)0xE000ED3C));
while (1)
{
}
}
/******************************************************************************/
/* Cortex-M3 Processor Exceptions Handlers */
/******************************************************************************/
/**
* @brief This function handles NMI exception.
* @param None
* @retval None
*/
void NMI_Handler(void)
{
while (1){};
}
/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
unsigned int contr_reg;
contr_reg = __get_CONTROL();
if(contr_reg&2)
{
asm("MRS R0, PSP");
}
else{
asm("MRS R0, MSP");
}
asm("B (Hard_fault_handler_c)"); //top of stack is in R0. It is passed to C-function.
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}