利用STM32的LR寄存器调试HardFault错误

6 篇文章 0 订阅
1 篇文章 0 订阅

R14 or LR(Link Register)

R14
在这里插入图片描述

HardFault调试的思路

  1. 先在出错误的地方打断点,让程序的状态固定下来;
  2. 由于HardFault属于异常,所以出现HardFault后,LR的值一定是0xFFFFFFFx,这样就可以根据其值,判断程序进入这个异常之前的状态了;
  3. 根据LRReturnStack值,可以知道在进入异常前,程序使用的是PSP还是MSP
  4. 在确定了进入异常之前使用的SP后,就可以根据这个SP的值找到现在的栈顶;
  5. 为什么要找到栈顶呢?因为在进入异常或中断前,MCU会将LR中的返回地址入栈,所以找到栈顶,就能找到这个返回地址了;
  6. MDK中,通过在View -> Memory Windows -> Memory 1中搜索相应SP的值就可以查看栈顶的数据了;
  7. 然后再栈顶地址附近找到一个0x08xxxxxx的值,这个值就是进入异常前代码的地址;
  8. MDK中,可以通过View -> Disassembly Window,然后右击,选择Show Disassembly at address...,然后输入上面找到的地址回车就可以跳转到相应的代码处了。

注意

  1. 只有在程序进入中断或者异常后,LR的值才会变成0xFFFFFFFx,否则保存的还是返回地址;
  2. 如果没有进入中断或者异常,可以直接根据LR的值在Show Disassembly at address...窗口搜索,定位到调用这个函数的代码;

参考

STM32硬件错误调试
How to read the link register (LR) for an ARM Cortex M series device
Cortex-M3 & M4 权威指南

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值