你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
就可以看PC值了。
评分
查看全部评分
多谢大师