stm32 进入stm32f103 硬件错误误HardFault_Handler

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
今天调试程序发现程序会进入异常中断HardFault_Handler函数,然后就无限while(1);了一般产生这种问题都是由于使用数组的时候边界越界,或者程序启动代码里面的堆栈太小,程序指针飞了。。本着简单使用的原则,我先去startup.s文件里直接将stack和heap都调大到0x2000运行后还是同样的错误,说明不是这种造成的,那么就需要了解到底哪里的代码产生了这样的错误?硬件上电进行debug调试,在HardFault_Handler函数中打上断点。注:由于手头暂时忘了截取当时的调试图,所以下面的图片来自网络打开keil中右下角观察窗里面的Call Stack + Locals此时开始dubug调试程序,全速运行,程序进入断点停止运行,这时候可以看到call stack+Locals窗口出现了很多东西,我们在上图中的红框函数上右键点击,选择Show Caller Code,就会跳转到进入循环中断之前的函数处,仔细观察这段代码,发现其中使用了uint8_t*这个指针作为数组来使用了,后面都是用data[0] / data[1] ....这种类型访问,某些函数直接调用此指针进行各种赋值操作,判断可能是由此产生了错误中断于是将其改为:uint8_t data[10];来定义,程序重新执行,错误消失。
字符串常量有两用稍有区别的用法,用作数组初始值(如char a[ ] =‘abcdef’)指明数组中字符的初始值,其他情况下(如 char* p =‘abcdef’)会转化为一个无名的静态字符数组,可能会存储在只读内存中,这就导致它不一定能被修改。数组通常被立即转化为一个指针,而第二种把p初始化成指向无名数组的第一个元素。
这个方法可以,以前进入硬件错误只能一步步的仿真找
要回复文章请先或硬件初始化错误Error_Handler - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 858|回复: 3
硬件初始化错误Error_Handler
在线时间23 小时
该用户从未签到主题帖子精华
中级会员, 积分 386, 距离下一级还需 114 积分
看门狗是打开的,为什么跑进了Error_Handler,看门狗也不运行了,一直就死在这个函数的While里面了?
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间1675 小时
ST金币13032
该用户从未签到主题帖子精华
【STM32F303开发】+如何找到导致程序出现HardFault的代码
(出处: 意法半导体STM32/STM8技术社区)
在线时间23 小时
该用户从未签到主题帖子精华
中级会员, 积分 386, 距离下一级还需 114 积分
【STM32F303开发】+如何找到导致程序出现HardFault的代码
http://www.stmcu.org/module/forum/forum.php?mo ...
这篇还不是我想要的,我的问题是Hal库,每个外设都有初始化,初始化失败后,都会进入Error_Handler(),但是所有的外设都是进入这个函数,进入到这个函数后,没法知道具体是哪个外设初始化失败,Error_Handler()函数内部该如何处理?
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间1675 小时
ST金币13032
该用户从未签到主题帖子精华
这篇还不是我想要的,我的问题是Hal库,每个外设都有初始化,初始化失败后,都会进入Error_Handler(),但 ...
这个方法可以知道是那句代码进入的fault,进而知道是什么外设出问题导致的。
STM32粉丝勋章Ⅳ
狂欢节专属(智多星)
STM32粉丝勋章Ⅲ
狂欢节专属(分享宝宝)
STM32粉丝勋章Ⅰ
狂欢节专属(微信上墙)
STM32粉丝勋章Ⅱ
狂欢节专属(研讨会问答)
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered bySTM32硬件错误HardFault_Handler的处理方法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。
STM32出现硬件错误可能有以下原因:
(1)数组越界操作;
(2)内存溢出,访问越界;
(3)堆栈溢出,程序跑飞;
(4)中断处理错误;
遇到这种情况,可以通过以下2种方式来定位到出错代码段。
1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR)
= 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值,如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。我的程序R14(LR)
= 0xFFFFFFF9,接下来以此为例。
在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”,在“Address”地址栏中输入MSP的值:0x,然后在对应的行里找到地址。地址一般以0x08开头的32位数。本例中,地址为0x08003CB9。
在Keil菜单栏点击“View”——“Disassembly Window”,在“Disassembly”窗口中右击,在下拉菜单中选择“Show
Disassemblyat Address...”。在弹出框“Show Code atAdress”的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。
2.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
在Keil菜单栏点击“View”——“Call Stack Window”弹出“Call
Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!stm32出现HardFault,应该怎么解决_百度知道
stm32出现HardFault,应该怎么解决
我有更好的答案
一般是内存读写的问题,检查以下几个方面:栈分配是否够用是否访问到了数组以外的空间是否访问了生命周期以外的变量
采纳率:86%
DeBug 一部一步的调看看哪的
可能是初始化的问题
为您推荐:
其他类似问题
stm32的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。STM32硬件错误HardFault_Handler的处理方法
https://blog.csdn.net/electrocrazy/article/details/
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。
STM32出现硬件错误可能有以下原因:
(1)数组越界操作;
(2)内存溢出,访问越界;
(3)堆栈溢出,程序跑飞;
(4)中断处理错误;
遇到这种情况,可以通过以下2种方式来定位到出错代码段。方法1:
1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
1.2 在Keil菜单栏点击“View”——“Registers Window”,在寄存器查看窗口查找R14(LR)的值。如果R14(LR) = 0xFFFFFFE9,继续查看MSP(主堆栈指针)的值,如果R14(LR) = 0xFFFFFFFD,继续查看PSP(进程栈指针)的值。我的程序R14(LR) = 0xFFFFFFF9,接下来以此为例。
1.3 在Keil菜单栏点击“View”——“Memory Windows”——“Memory1”,在“Address”地址栏中输入MSP的值:0x,然后在对应的行里找到地址。地址一般以0x08开头的32位数。本例中,地址为0x08003CB9。
1.4 在Keil菜单栏点击“View”——“Disassembly Window”,在“Disassembly”窗口中右击,在下拉菜单中选择“Show Disassemblyat Address...”。在弹出框“Show Code atAdress”的地址框中输入地址0x08003CB9进行搜索,然后就会找到相对应的代码。这里的代码就是进入循环中断之前的情况。仔细查看附近区域的相关代码来排查错误具体原因。 方法2:
2.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。
2.2 在Keil菜单栏点击“View”——“Call Stack Window”弹出“Call Stack + Locals”对话框。然后在对话框中右键选择“Show Caller Code”,就会跳转到出错之前的函数处,仔细查看这部分函数被调用或者数组内存使用情况。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 stm32硬件iic 的文章

 

随机推荐