通过keil5调试,查看堆栈内存,从而确定错误代码。
先进入KEIL5调试,点击这个书,全力运行.
然后点击红色的按钮,停止运行。
然后会进入到错误中断函数中,我这个地方进入的是硬件错误中断函数
然后打开左边寄存器和堆栈内存的窗口
可以看到R14(LR)寄存器的值为0xFFFFFFF1
LR正常的值:
0xFFFFFFF1 表示中断返回时从MSP堆栈恢复寄存器值,中断返回后进入Handler模式,使用MSP堆栈,(相当于从中断返回到另一个中断)。
0xFFFFFFF9 表示中断返回时从MSP堆栈恢复寄存器值,中断返回后进入线程模式,使用MSP堆栈(这种用于不使用PSP只使用MSP堆栈的情况)。
0xFFFFFFFD 表示中断返回时从PSP堆栈恢复寄存器值,中断返回后进入线程模式,使用PSP堆栈(这是常见的,OS处理完中断后返回用户程序)
所以我们要去看MSP堆栈的值
MSP的值为0x20014A88。我们复制这个值。打开view->memory->memory windows
输入MSP的堆栈地址:0x20014A88A,回车。
因为STM32是小端模式,所以地址要转变一下。
第一个地址为R0:0xFB1DF60D
第二个地址为R1:0x20000190
第三个地址为R2:0x0000000
第四个地址为R3:0x000000C
第五个地址为R12:0xA5A5A5A5
第六个地址为LR:0x08001B11
在此之前先了解一些知识
MSP的含义是Main_Stack_Pointer,即主栈
PSP的含义是 Process_Stack_Pointer,即任务栈
1、中断到来
会依次保存寄存器中的值,由硬件自动完成。中断到来,由MSP自动保存地址
依次顺序执行R0,R1,R2,R3,R12,LR。所以可以通过MSP地址找到R0,R1,R2,R3,R12,LR的值
取出LR的值,即为代码错误的地方
输入地址,然后GO TO
会自动跳转到代码出错的地方,具体错误根据情况自行分析