使用printf循环打印字符串时,进HardFault_Handler。被困好几天,希望有大神解决。

2019-08-18 20:25发布

本人使用的是STM32F103C8T6芯片。我把代码贴出来放在图片附件,具体情况是这样的:我需要循环不断向上位机打印字符串,然而使用printf函数打印字符时只有循环开始时可用,然后循环第二次或者第三次时就会进HardFault_Handler。(也就是说它可以打印字符,只是只能打印出两组到三组就因为进硬错误而不再打印了)也曾看过相似问题的帖子,对于他们给出的解决方案也尝试过。
首先是对printf函数本身进硬错误的解决方案有:通过对字符的定义添加__align(4)进行修饰,主要解决字符对齐造成的问题,同样的解决方案还有在程序初始时添加SCB->CCR |= 0x200;也是为了实现字节对齐。
其次对进HardFault_Handler本身的调试方法,通常不外乎需要对进错误语句进行定位。例如http://blog.csdn.net/xiahouzuoxin/article/details/10068455这篇文档所提供的方法,但是对于这种方法再进行hardfault右键show caller code 这一步时,软件提示cannot access memory,具体如附件图5。file:///D:QQ1398030584ImageC2CBK5FMC0N_MP@OH@ZY~RXDBG.png
对了,还有一个问题,我调试时发现它是因为bus fault进入hardfault的,但是我不懂怎么解决,网上也没找到相关的问题的解决方案。
总而言之,上述解决方案我都没成功。这个问题已经折腾了我近乎一星期了,希望能有大神能随手就帮我解决了,万分感激先行谢过!!~~
file:///D:QQ1398030584ImageC2CBK5FMC0N_MP@OH@ZY~RXDBG.png


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
JUSTNIUB
2019-08-19 13:50
以前忘记在哪里看过查找hardfault,在网上有很多教程。

过程如下:
1.进入hardfault后,在左侧project那一栏下方的项目中有 register一项,点进去,找到R13,复制内容,这是一个地址。
2.打开memory 窗口,该窗口的左上方有Address一栏,将刚刚复制的内容粘贴进去,回车。搜索到内容之后,右键在memory窗口内随便点一下,在unsigned选项的后面一栏中切换成int。再找到刚刚复制的地址对应的32位数据,往后数6个(也有可能是7个),再复制该内容、
3.在Disassembly窗口中右键一下,有个Show Disassembly in address选项,点进去,再粘贴,这里要在数据前面加上0x,然后就能定位到一个位置,再双击这个位置,就是出错的代码。

一周热门 更多>