STM32 启动方式 or PC指针问题
各位走过路过的进来瞧一瞧,我想通过软件来知道当前程序是从什么模式(RAM/Flash/ISP)启动的,貌似没有对应的寄存器来读取,不知道我说的对不对,请各位纠正一下,谢谢,我目前想到的办法是通过读取PC指针来判断程序是从哪种模式启动的,但是呢我又不知道PC指针(即R15)是怎么样在C程序中获取它的值的?当然如果有更好的办法最好了,谢谢
0
读 SCB->VTOR 寄存器看是在 0x2000xxxx 还是在 0x8000xxxx得知中断向量表位置基本就等同知道程序位置了吧? 或者修改启动代码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
多谢大师
页:
[1]