xiang90721 发表于 2017-9-14 08:49:27

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

对于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) http://my.csdn.net/uploads/201206/16/1339807606_7638.GIF通过查看硬件错误中断时寄存器的值来判定错误出现的位置。
上面这是M3的方式,但是这样的方式在M4或M7同样适用么?我没找到相关的权威指南来支持此种方式。对于M4,M7各位你们是怎么查找硬件错误中断的呢?

MrJiu 发表于 2017-9-14 10:44:48

可以看一下M7内核得书籍,不过都属于ARM内核,应该指令都差不多。。。不过你这个都涉及到汇编了,有这个耐心得人估计很少了。。。:lol:lol:lol

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()


这个就无从帮忙了!!!
页: [1]
查看完整版本: 对于STM32F7 Cortex M7的芯片硬件错误查找方法