Ну вот как-то так. Оно под иар, но интринсики в CMSIS одинаковые. // кадр стека, создаваемый исключением
typedef struct fault_frame_s
{
uint32_t stacked_R0; // 00
uint32_t stacked_R1; // 04
uint32_t stacked_R2; // 08
uint32_t stacked_R3; // 0C
uint32_t stacked_R12; // 10
uint32_t stacked_LR; // 14
uint32_t stacked_PC; // 18
uint32_t stacked_xPSR; // 1C
} fault_frame_t;
// кадр исключения (для отладки)
__no_init __root fault_frame_t fault_frame;
// обработчик исключения
__stackless void hard_fault_isr(void)
{
if (__get_CONTROL() & 2)
{
(void)memcpy(&fault_frame, (void*)__get_PSP(), sizeof(fault_frame_t));
}
else
{
(void)memcpy(&fault_frame, (void*)__get_MSP(), sizeof(fault_frame_t));
}
while(1)
{
}
}