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

对于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
andeyqi 回答时间:2017-9-14 13:34:12
M3和M4是一样的,M7没用过不是很清楚。
MrJiu 回答时间:2017-9-14 13:52:18
xiang90721 发表于 2017-9-14 11:44
理论上只要知道LR的值就可以大概定位出错位置了吧
但是我通过这样的方式也是没法
__asm void wait()

这个就无从帮忙了!!!

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版