I have seen a number of questions concerning these matters and have had these issues myself, so I came up with some handy code for bare board projects.
This code replaces the Default_Handler in kinetis_sysinit.c. There is probably a slicker way to do this, but this is how I did it. All improvements welcome.
It also illustrates how to suppress a warning in GCC.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
/*
* Default_Handler_Helper
* Stack contains:
* R0, R1, R2, R3, R12, R14, the pc and xPSR
*
* vIPSR is the interrupt number.
*/
void Default_Handler_Helper(uint32_t * svc_args,uint32_t vIPSR)
{
// The pc might trace back to the instruction on a hardfault.
// If you jumped to data, it might not.
volatile uint32_t pc = ((uint32_t)svc_args[6]);
__asm("bkpt");
}
#pragma GCC diagnostic pop
/*
* Default_Handler() Replacement.
* naked means no "C" prologue or epilogue.
* Set up the SP and IPSR registers as function parameters.
*/
void __attribute__ ((naked)) Default_Handler()
{
asm volatile (
"MRS R0, MSP\n" // Pass the SP in as the first "C" argument.
"MRS R1, IPSR\n" // Pass in IPSR as the second "C" argument.
"B Default_Handler_Helper\n"
);
}
To test it:
*((char *) main) = 0; // Cause a hard fault by writing to Flash.
When you get to the break point in the Default_Handler_Helper function, take the value of the PC, go to the Debugger Shell, type "bp <the value of pc>" and then click on the break point in the break point window to see the line of code causing the hard fault. (there is probably a better way to do this, but this how I did it).
Next, to test un-handled interrupts:
SCB_ICSR |= SCB_ICSR_PENDSVSET_MASK; // Cause a PendSV interrupt.
When you get to the break point in the help function, vIPSR will be 14, the interrupt number of the PendSV interrupt.
Or cause an NMI:
SCB_ICSR |= SCB_ICSR_NMIPENDSET_MASK;
Once you get into the Default_Handler_Helper you are done. The program will not continue, but at least now you know....
Jim,
thanks for sharing!
On the same topic, and as well for Processor Expert:
Erich