斯文人 发表于 2019-7-25 11:40:47

STM32 启动方式 or PC指针问题

各位走过路过的进来瞧一瞧,我想通过软件来知道当前程序是从什么模式(RAM/Flash/ISP)启动的,貌似没有对应的寄存器来读取,不知道我说的对不对,请各位纠正一下,谢谢,

我目前想到的办法是通过读取PC指针来判断程序是从哪种模式启动的,但是呢我又不知道PC指针(即R15)是怎么样在C程序中获取它的值的?当然如果有更好的办法最好了,谢谢

songshiqun2010 发表于 2019-7-25 11:50:54

0

读 SCB->VTOR 寄存器看是在 0x2000xxxx 还是在 0x8000xxxx得知中断向量表位置基本就等同知道程序位置了吧?

songshiqun2010 发表于 2019-7-25 13:21:11

或者修改启动代码

HardFault_Handler\
                PROC
                              EXPORT HardFault_Handler
                IMPORT hard_fault_handler_c
                TST LR, #4
                ITE EQ
                MRSEQ R0, MSP
                MRSNE R0, PSP
                B hard_fault_handler_c
                ENDP


添加一个打印信息函数
void hard_fault_handler_c (unsigned int * hardfault_args)
{

      #define DEBUG_PRINTF printf
    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);
    stacked_r1 = ((unsigned long) hardfault_args);
    stacked_r2 = ((unsigned long) hardfault_args);
    stacked_r3 = ((unsigned long) hardfault_args);
    stacked_r12 = ((unsigned long) hardfault_args);
    stacked_lr = ((unsigned long) hardfault_args);
    stacked_pc = ((unsigned long) hardfault_args);
    stacked_psr = ((unsigned long) hardfault_args);
    DEBUG_PRINTF ("\n\n\n");
    DEBUG_PRINTF ("R0 = 0x%08x\n", stacked_r0);
    DEBUG_PRINTF ("R1 = 0x%08x\n", stacked_r1);
    DEBUG_PRINTF ("R2 = 0x%08x\n", stacked_r2);
    DEBUG_PRINTF ("R3 = 0x%08x\n", stacked_r3);
    DEBUG_PRINTF ("R12 = 0x%08x\n", stacked_r12);
    DEBUG_PRINTF ("LR = 0x%08x subroutine call return address\n", stacked_lr);
    DEBUG_PRINTF ("PC = 0x%08x program counter\n", stacked_pc);
    DEBUG_PRINTF ("PSR = 0x%08x\n", stacked_psr);
    DEBUG_PRINTF ("SHCSR= 0x%08x\n", SCB->SHCSR);//24
    DEBUG_PRINTF ("CFSR   = 0x%08x\n", SCB->CFSR);//28
    DEBUG_PRINTF ("HFSR   = 0x%08x\n", SCB->HFSR);//2c
    DEBUG_PRINTF ("DFSR   = 0x%08x\n", SCB->DFSR);//30
    DEBUG_PRINTF ("MMFAR= 0x%08x\n", SCB->MMFAR);//34
    DEBUG_PRINTF ("BFAR   = 0x%08x\n", SCB->BFAR);//38
    DEBUG_PRINTF ("AFSR   = 0x%08x\n", SCB->AFSR);//3c
//    while (1);
}再找个位置调用HardFault_Handler();
就可以看PC值了。


songshiqun2010 发表于 2019-7-25 13:22:18


斯文人 发表于 2019-7-25 19:28:22

songshiqun2010 发表于 2019-7-25 13:22


多谢大师
页: [1]
查看完整版本: STM32 启动方式 or PC指针问题