最近负责一个项目用到stm32f4的一款高性能芯片。研发过程中遇到一个很诡异的现象前前后后折腾了两三天,最后才搞定由于是新手,经验不足排故过程很纠结~~
1.采用JLINK下載程序后,断电让其上电重新启动发现有时可以正常运行,有时候无法正常运行大约每两、三次就有一次无法正常上电启动。
2.通过JLINK调試模式程序每次均正常运行。太诡异了!
FLash启动如果BOOT0和BOOT1配置不正确,会导致无法正常运行;而通过JLINK调试模式程序程序直接下载到SRAM中运荇,不存在此问题于是,通过万用表测BOOT0和BOOT1管脚电平都是低电平,没问题!于是基本排除此原因了。
其次考虑电源供电不稳定问题。通过万用表测量各个模块电压发现电压均正常值。那也有可能是系统上电时刻由于负载变化,导致电压跳变之后电压又稳定了,所以测量不出来通过示波器捕捉电压变化,未发现明显的异常跳变通过万用表测电流为88mA,并不大初步认为不是电源供电问题导致。
嘫后考虑是否是由于复位信号不稳定的原因。板子采用了外置复位芯片上电后会产生复位信号,此提供给处理器、蓝牙等模块由于JLINK調试模式时会自动产生一个复位信号,让系统恢复默认状态然后程序开始运行,因此调试模式下程序应该都能正常启动但是如果程序斷电后上电启动,如果复位信号过短或者不稳定有可能导致无法正常启动了。完美的解释!哈哈那一瞬间仿佛找到问题所在了。程序無法正常启动时RESET信号手动接地(给一个低电平脉冲),处理器都开始工作了!这进一步验证了我的推断于是锁定是复位信号不稳定导致的,开始折腾复位信号通过示波器观察、隔离复位信号、加滤波电容、换复位芯片等方法进行定位。最后发现复位信号感觉也没有什麼问题真是怪了!纠结~~~~
后来有人建议是不是晶振不稳定。但是晶振不稳定,调试模式程序时也应该出现同样现象啊道理上解释不通啊。无解啊~~~
后来求助同事他是电子硬件方面的专家。我们几人仔细琢磨了板子的原理图和实验现象后他突然问你的BOOT0怎么没有接电阻到公共地啊?我说接了吧之前还用万用表量过电平,是低电平他说不对啊,就是没接地啊我才猛地想起来,板子是另外一个同事焊的交到我手里时说板子已经仔细检查过了,没问题当时,由于项目紧张就没有再仔细核实。我再仔细一看确实没接地,也就是悬空狀态!而之前测电压是低电平有可能是由于下拉电阻的作用。崩溃了!这么粗心居然没有自己检查。赶紧焊电阻接地重新上电,发現正常了测试了三四十次,都是正常的看来这次真正找到原因了,就是由于BOOT0悬空而导致的BOOT0悬空时,其状态是不确定的会导致程序無法从UserFlash中正常启动,就可能出现时好时不好的现象了!哎原来是这样。终于长嘘了一口气
问题终于解决了,但是还是有一点无法理解:既然是BOOT0悬空引起的但是为什么将处理器的RESET信号手动接地(给一个低电平脉冲),处理器又正常运行了难道是因为再次复位上电重启時,恰好BOOT0又被识别为低电平RESET信号影响了BOOT0的状态?看来还需要进一步做实验才能解答此疑惑。