个人技术分享

接口:PA13,PA14,请勿连接复位引脚。

输入usb命令

在这里插入图片描述
这里我已经连接过了STM32F407VET6了。

再输入connect命令

在这里插入图片描述
这里我已经默认选择了SWD接口,4000K速率。

可以输入speed 4000命令选择4000K速率:
在这里插入图片描述
写一段崩溃代码进行测试:

void CashCode(void){
    *((volatile  uint32_t*) 0x080FFFFF) = 0x123;//这是在Flash中最后一个扇区的尾地址进行写入
    *((volatile  uint32_t*) 0x080FFFFF) = 0x111;
    *((volatile  uint32_t*) 0x080FFFFF) = 0x122;
    *((volatile  uint32_t*) 0x080FFFFF) = 0x133;
}

在这里插入图片描述
运行后卡死,输入h停止查看一下寄存器数据:
在这里插入图片描述
可以看到已经发生了HardFault中断。
将PC指针复制一下,对应到ASM文件里去看看地址。
在这里插入图片描述
的确来到了HardFault中断函数了。

思路: 此时要定位到发生hardfault之前单片机的PC指向哪里才能确定是什么原因导致的hardfault错误。那么则要从SP指针入手。
压栈顺序: R0、R1、R2、R3、R12、LR、PC、xPSR(这里存疑,如果被调用的函数有参数或者临时变量的传递可能就不止这几个寄存器被压入栈了)
在这里插入图片描述
在这里插入图片描述
可以看到的确在CashCode函数中发生的hardfault。
在这里插入图片描述
从仿真上寻找也是这个原因。


keil生成ASM文件:

fromelf --text -c -o "$L@L.asm" "#L"