CPU :STM32f103rct6 编译器 :MDK5.20; 调试工具:ULINK2
主板上电后链接ULINK,SW接口可以链接、可以下载程序,偶尔出现cannot access target shutting down debug session
错误提示。 程序运行后,进入hardfault错误处理函数。
1 Cortex-M3/4的Fault简介 Cortex-M3/4的Fault异常是由于非法的存储器访问(比如访问0地址、写只读存储位置等)和非法的程序行为(比如除以0等)等造成的。常见的4种异常及产生异常的情况如下: Bus Fault:在fetch指令、数据读写、fetch中断向量或中断时存储恢复寄存器栈情况下,检测到内存访问错误则产生Bus Fault。 Memory Management Fault:访问了内存管理单元(MPU)定义的不合法的内存区域,比如向只读区域写入数据。 Usage Fault:检测到未定义指令或在存取内存时有未对齐。还可以通过软件配置是否检测到除0和其它未对齐内存访问也产生该异常,默认关闭,需要在工程初始化时配置: Hard Fault:在调试程序过程中,这种异常最常见。上面三种异常发生任何一种异常都会引起Hard Fault,在上面的三种异常未使能的情况下,默认发生异常时进入Hard Fault中断服务程序。使能前三种异常也要在初始化时配置:
cortex-m3内核出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。
1)在stm32f10x_it.c中的hardfault处理函数中设置断点,当发生hardfault时进入断点。
void HardFault_Handler(void){ /* Go to infinite loop when Hard Fault exception occurs */ while (1) { }}2)当进入Hard Fault断点后,菜单栏Peripherals >Core Peripherals >Fault Reports打开异常发生的报告,查看发生异常的原因:
3)查看发生错误代码地址: Cortex‐M3 在进入异常服务例程时,自动压栈了 R0‐R3, R12, LR, PSR 和 PC,并且在返回时自 动弹出它们,通过读取 PSP 的值, OS 就能够获取用户应用程序使用的堆栈,进一步地就知道了在发 生异常时,被压入寄存器的内容。
通过左侧寄存器的值可以查找SP值,可得SP的地址为0x2000AF0,再在memory框中输入SP的地址,查看堆栈里面的值依次为R0~R3、R12、LR、PC、XPRS,显然堆栈后第21个字节到24字节即为LR,该地址0x0800186B即为异常前PC将要执行的下一条指令地址。再通过memory查找这个地址所对应的代码即可查找到响应错误语句。新闻热点
疑难解答