对于M0 M3 M4,首先是要打开需要触发的异常事件.比如说除0异常,然后要修改haltfault 中断汇编部分代码+中断回调C代码
"core_cm4.h" :架构相关的参数源码
汇编部分:
HardFault_Handler\
PROC
IMPORT HardFault_Handler_C
TST LR, #4
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B HardFault_Handler_C
ENDP
C 部分
void HardFault_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]);
JBF_DEBUG_PRINTF_LOG("\n\n[Hard fault handler - all numbers in hex]\n");
JBF_DEBUG_PRINTF_LOG("R0 = %x\n", stacked_r0);
JBF_DEBUG_PRINTF_LOG("R1 = %x\n", stacked_r1);
JBF_DEBUG_PRINTF_LOG("R2 = %x\n", stacked_r2);
JBF_DEBUG_PRINTF_LOG("R3 = %x\n", stacked_r3);
JBF_DEBUG_PRINTF_LOG("R12 = %x\n", stacked_r12);
JBF_DEBUG_PRINTF_LOG("LR [R14] = %x subroutine call return address\n", stacked_lr);
JBF_DEBUG_PRINTF_LOG("PC [R15] = %x program counter\n", stacked_pc);
JBF_DEBUG_PRINTF_LOG("PSR = %x\n", stacked_psr);
JBF_DEBUG_PRINTF_LOG("BFAR = %x\n", (*((volatile unsigned long *)(0xE000ED38))));
JBF_DEBUG_PRINTF_LOG("CFSR = %x\n", (*((volatile unsigned long *)(0xE000ED28))));
JBF_DEBUG_PRINTF_LOG("HFSR = %x\n", (*((volatile unsigned long *)(0xE000ED2C))));
JBF_DEBUG_PRINTF_LOG("DFSR = %x\n", (*((volatile unsigned long *)(0xE000ED30))));
JBF_DEBUG_PRINTF_LOG("AFSR = %x\n", (*((volatile unsigned long *)(0xE000ED3C))));
JBF_DEBUG_PRINTF_LOG("SCB_SHCSR = %x\n", SCB->SHCSR);
while(1) ;
}
同样还要修改 SCB->上的相关寄存器。
记住两个关键寄存器
SCB->CCR 使能某些异常
SCB->SHCSR 使能某些异常中断入口
对于M4
SCB->CCR |= 0x18;
SCB->SHCSR |= 0x00007000;
参考:
cortex-M除0异常中断 - 摩羯兔有点冷 - 博客园 (cnblogs.com)
UsageFault On Cortex-M4 - 知乎 (zhihu.com)
使用Keil来定位ARM中Hard Fault错误的方法-elecinfo电子信息网
(242条消息) Cortex-M3/4的Hard Fault调试方法_weixin_39103885的博客-优快云博客
Cortex-M3和Cortex-M4 Fault异常应用之二 ----- Fault处理函数的实现 | fault (lmlphp.com)
Cortex-M3/4的Hard Fault調試方法 - JavaShuocortex-M除0异常中断 - 摩羯兔有点冷 - 博客园 (cnblogs.com)