历史上的今天
今天是:2025年03月24日(星期一)
2019年03月24日 | STM32意外复位问题调试
2019-03-24 来源:eefocus
最近在使用STM32座项目时遇到一个奇怪的问题。系统一开始运行很正常但是在长时间运行之后会随机的出现STM2单片机无故产生复位的问题。因为在调试的过程中收获颇多,所以打算记录一下这一次的调试过程。
首先做问题分析,既然单片机在运行一段时间之后会产生复位。那具体是什么原因引起的单片机复位呢?拍脑子一想会不会是没有及时喂狗导致看门狗溢出引起的复位。为了证明这一点我们查询了stm32的数据手册有关于复位源的介绍

由上面的描述我们可以知道在RCC_CSR中记录了单片机复位的类型。因此我们只要在单片机启动时去读取该寄存器中的对应状态位即可判断出单片机上一次是因为何种原因产生复位的。注意:RCC_CSR寄存器是需要软件清除的。如果已经产生的复位标志没有被清除他会一直被存储,即使不在有对应的复位产生该复位标志还是一直存在。所以我们在使用其判断上一次复位类型时需要先软件清除方可使用。
通过上面的方法果然确定了复位的原因是由看门狗溢出引起的复位。那到底是什么原因引起的看门狗溢出?在线调试发现是因为产生了hardfault错误系统进入了hardfault的while循环所以没有喂狗而导致看门狗溢出引起系统复位。
为什么会引起hardfault错误呢?这个真的很奇怪哎。不过不怕只要我们能定位到单片机在引起hardfault错误前执行了什么程序应该就能进一步去判断问题引起的原因。这里介绍一下在keil中定位的方法。当进入Hard Fault断点后,菜单栏Peripherals >Core Peripherals >Fault Reports打开异常发生的报告,查看发生异常的原因。


由上面的的报告可知发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。接下来我们点击View选择Call Stack窗口。然后在Call Stack的HardFault_Handler上右键Show Caller Code,这时候我们就能定位到是因为那条语句引起的HardFault错误了。
主要原因是自己在定义数组长度时使用了变量。导致的HardFault错误。修改对数组的定义。取消使用变量来初始化数组长度后。问题得到解决。
史海拾趣
|
我用的是ARM 的板子,cpu是pxa270的,自己做的内核,烧写完内核后,在CRT上只是显示白光,不能进入CE系统。通过串口可以看出系统可以启动,不知道为什么不能进入系统?麻烦大家帮忙分析下原因!… 查看全部问答> |
|
不知道什么原因,nboot的用C语言写的代码一直不能运行完整。汇编全部执行完毕了,但是一跳到C函数main,问题就来了,不能运行函数,根据我点的灯的情况来看,似乎是卡在函数里面了,就是说跳到函数里面就出不来了,如果将那些初始化代 ...… 查看全部问答> |
|
我们外出拍照的时候是不是经常遇到相机没电的时候呢?有了这款太阳能充电挂带就方便多了,只要有亮光,我们就可以随时随地给相机充电,当然在太阳下面效果更好。它的原理就是在相机挂带上面装上太阳能电池薄膜,采用涓流式充电给相机电池充电。… 查看全部问答> |
|
摘要: 对目前国内流行的嵌入式系统定义提出质疑,认为嵌入式系统不是“专用计算机系统”,嵌入式系统不只“以计算机技术为基础”。从嵌入式系统的发展起源、体系结构、功能特点、知识技术体系等方面进行了分析论证,从而进一步完善了嵌入式系统的定 ...… 查看全部问答> |
|
我的目的是想练习使用一下flash的掉电不丢失功能,通过八位led灯指示数据t,按下按键s1时t的值会变化,然后将变化后的值存入flash中,下次上电后通过按下按键s2时读出上次存的值让led灯显示出来,程序如下有些问题,可能是我c语言指针部分学的不太 ...… 查看全部问答> |
|
raw-os如何配合linux用来打造实时linux的方案已经考虑过2年,考虑过几种方案,但是都不通用。这段时间考虑了一种可行的方案如下: raw-os既然能在vc上模拟,为什么不能在 linux内核级别也去模拟呢?如果采用linux内核级别的api模拟只采用到一个核心 ...… 查看全部问答> |




