你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
STM32 启动方式 or PC指针问题
[复制链接]
ikxlf
提问时间:2019-7-25 11:40 /
各位走过路过的进来瞧一瞧,我想通过软件来知道当前程序是从什么模式(RAM/Flash/ISP)启动的,貌似没有对应的寄存器来读取,不知道我说的对不对,请各位纠正一下,谢谢,
我目前想到的办法是通过读取PC指针来判断程序是从哪种模式启动的,但是呢我又不知道PC指针(即R15)是怎么样在C程序中获取它的值的? 当然如果有更好的办法最好了,谢谢
赞
0
收藏
0
评论
4
分享
发布时间:2019-7-25 11:40
举报
请先
登录
后回复
4个回答
byronsong
回答时间:2019-7-25 11:50:54
a0a.1 32b0c
读 SCB->VTOR 寄存器 看是在 0x2000xxxx 还是在 0x8000xxxx 得知中断向量表位置 基本就等同知道程序位置了吧?
赞
0
评论
回复
支持
反对
byronsong
回答时间:2019-7-25 13:21:11
a0a.1 32b0c
或者修改启动代码
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[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]);
DEBUG_PRINTF ("\n\n[Hard fault handler - all numbers in hex]\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 [R14] = 0x%08x subroutine call return address\n", stacked_lr);
DEBUG_PRINTF ("PC [R15] = 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值了。
赞
0
评论
回复
支持
反对
byronsong
回答时间:2019-7-25 13:22:18
a0a.1 32b0c
评分
参与人数
1
蝴蝶豆
+3
收起
理由
STMCU
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
ikxlf
回答时间:2019-7-25 19:28:22
a0a.1 32b0c
songshiqun2010 发表于 2019-7-25 13:22
多谢大师
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
就可以看PC值了。
评分
查看全部评分
多谢大师