AMR HALTFAULT应用

对于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)

Hard Fault 异常调试方法 (dgrt.cn)

使用Keil来定位ARM中Hard Fault错误的方法-elecinfo电子信息网

(242条消息) Cortex-M3/4的Hard Fault调试方法_weixin_39103885的博客-CSDN博客

Cortex-M3和Cortex-M4 Fault异常应用之二 ----- Fault处理函数的实现 | fault (lmlphp.com)

Cortex-M3/4的Hard Fault調試方法 - JavaShuocortex-M除0异常中断 - 摩羯兔有点冷 - 博客园 (cnblogs.com)

猜你喜欢

转载自blog.csdn.net/loveboon1/article/details/131706040