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

对于STM32F7 Cortex M7的芯片硬件错误查找方法

[复制链接]
xiang90721 提问时间:2017-9-14 08:49 /
对于M3系列的芯片,查找硬件错误中断的方法:

出现问题时排查的方法:

发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、LR、PC、XPRS寄存器依次入栈,其中LR即为发生异常前PC将要执行的下一条指令地址。

注意:寄存器均是32位,且STM32是小端模式。(参考Cortex-M3权威)

DEBUG如下图

SP值为0x20008560,查看堆栈里面的值依次为R0~R3、R12、LR、PC、XPRS, 例如R0(10 27 00 00),  显然堆栈后第21个字节到24字节即为LR,该地址0x08001FFD即为异常前PC将要执行的下一条指令地址(即StackFlow()后面的语句处 RCC->CR &= (uint32_t)0xFFFBFFFF)

通过查看硬件错误中断时寄存器的值来判定错误出现的位置。


上面这是M3的方式,但是这样的方式在M4或M7同样适用么?我没找到相关的权威指南来支持此种方式。

对于M4,M7各位你们是怎么查找硬件错误中断的呢?


收藏 评论4 发布时间:2017-9-14 08:49

举报

4个回答
MrJiu 回答时间:2017-9-14 10:44:48
可以看一下M7内核得书籍,不过都属于ARM内核,应该指令都差不多。。。不过你这个都涉及到汇编了,有这个耐心得人估计很少了。。。
xiang90721 回答时间:2017-9-14 11:44:01
MrJiu 发表于 2017-9-14 10:44
可以看一下M7内核得书籍,不过都属于ARM内核,应该指令都差不多。。。不过你这个都涉及到汇编了,有这个耐 ...

理论上只要知道LR的值就可以大概定位出错位置了吧
但是我通过这样的方式也是没法
__asm void wait()
{
      BX lr
}

void HardFault_Handler(void)
{
    /* Go to infinite loop when Hard Fault exception occurs */
       wait();
}
在线调试时在wait函数打断点,运行到这时单步进入,可是一直提示内存访问不到cannot access memory
andey 回答时间:2017-9-14 13:34:12
提示: 作者被禁止或删除 内容自动屏蔽
MrJiu 回答时间:2017-9-14 13:52:18
xiang90721 发表于 2017-9-14 11:44
理论上只要知道LR的值就可以大概定位出错位置了吧
但是我通过这样的方式也是没法
__asm void wait()

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