你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 启动方式 or PC指针问题

[复制链接]
ikxlf 提问时间:2019-7-25 11:40 /
各位走过路过的进来瞧一瞧,我想通过软件来知道当前程序是从什么模式(RAM/Flash/ISP)启动的,貌似没有对应的寄存器来读取,不知道我说的对不对,请各位纠正一下,谢谢,  

我目前想到的办法是通过读取PC指针来判断程序是从哪种模式启动的,但是呢我又不知道PC指针(即R15)是怎么样在C程序中获取它的值的?  当然如果有更好的办法最好了,谢谢
收藏 评论4 发布时间:2019-7-25 11:40

举报

4个回答
byronsong 回答时间:2019-7-25 11:50:54
读 SCB->VTOR 寄存器  看是在 0x2000xxxx 还是在 0x8000xxxx  得知中断向量表位置  基本就等同知道程序位置了吧?
byronsong 回答时间:2019-7-25 13:21:11
或者修改启动代码

  1. HardFault_Handler\
  2.                 PROC
  3.                                 EXPORT HardFault_Handler
  4.                 IMPORT hard_fault_handler_c
  5.                 TST LR, #4
  6.                 ITE EQ
  7.                 MRSEQ R0, MSP
  8.                 MRSNE R0, PSP
  9.                 B hard_fault_handler_c
  10.                 ENDP
复制代码


  1. 添加一个打印信息函数
  2. void hard_fault_handler_c (unsigned int * hardfault_args)
  3. {
  4.   
  5.         #define DEBUG_PRINTF printf
  6.     unsigned int stacked_r0;
  7.     unsigned int stacked_r1;
  8.     unsigned int stacked_r2;
  9.     unsigned int stacked_r3;
  10.     unsigned int stacked_r12;
  11.     unsigned int stacked_lr;
  12.     unsigned int stacked_pc;
  13.     unsigned int stacked_psr;
  14.     stacked_r0 = ((unsigned long) hardfault_args[0]);
  15.     stacked_r1 = ((unsigned long) hardfault_args[1]);
  16.     stacked_r2 = ((unsigned long) hardfault_args[2]);
  17.     stacked_r3 = ((unsigned long) hardfault_args[3]);
  18.     stacked_r12 = ((unsigned long) hardfault_args[4]);
  19.     stacked_lr = ((unsigned long) hardfault_args[5]);
  20.     stacked_pc = ((unsigned long) hardfault_args[6]);
  21.     stacked_psr = ((unsigned long) hardfault_args[7]);
  22.     DEBUG_PRINTF ("\n\n[Hard fault handler - all numbers in hex]\n");
  23.     DEBUG_PRINTF ("R0 = 0x%08x\n", stacked_r0);
  24.     DEBUG_PRINTF ("R1 = 0x%08x\n", stacked_r1);
  25.     DEBUG_PRINTF ("R2 = 0x%08x\n", stacked_r2);
  26.     DEBUG_PRINTF ("R3 = 0x%08x\n", stacked_r3);
  27.     DEBUG_PRINTF ("R12 = 0x%08x\n", stacked_r12);
  28.     DEBUG_PRINTF ("LR [R14] = 0x%08x subroutine call return address\n", stacked_lr);
  29.     DEBUG_PRINTF ("PC [R15] = 0x%08x program counter\n", stacked_pc);
  30.     DEBUG_PRINTF ("PSR = 0x%08x\n", stacked_psr);
  31.     DEBUG_PRINTF ("SHCSR  = 0x%08x\n", SCB->SHCSR);//24
  32.     DEBUG_PRINTF ("CFSR   = 0x%08x\n", SCB->CFSR);//28
  33.     DEBUG_PRINTF ("HFSR   = 0x%08x\n", SCB->HFSR);//2c
  34.     DEBUG_PRINTF ("DFSR   = 0x%08x\n", SCB->DFSR);//30
  35.     DEBUG_PRINTF ("MMFAR  = 0x%08x\n", SCB->MMFAR);//34
  36.     DEBUG_PRINTF ("BFAR   = 0x%08x\n", SCB->BFAR);//38
  37.     DEBUG_PRINTF ("AFSR   = 0x%08x\n", SCB->AFSR);//3c
  38. //    while (1);
  39. }
复制代码
再找个位置调用HardFault_Handler();
就可以看PC值了。


byronsong 回答时间:2019-7-25 13:22:18
微信截图_20190725132146.png

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

ikxlf 回答时间:2019-7-25 19:28:22

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版