|
先介绍一下这个问题出现的背景:
有一个项目需要外接一个I2C驱动的温湿度传感器,使用了STM32的I2C1_SCL和I2C1_DAT以及电源。使用外部的GND。

进行的测试是一个较为暴力的测试,内含看门狗复位。为了测试在极端环境下是否会跑飞回不来。
确实出现了跑飞回不来的情况了。而且按了reset按键也不起作用,只有重上电才能恢复。
使用keil debug能发现跑飞之后程序是在0x1fffxxxx内循环,根本不是我程序存储的0x08000000位置。所以就觉得可能是复位了,但是复位的起始位置指错了。根据BOOT的配置可以看出来BOOT1为0,BOOT0为1的时候会从系统存储器启动,即为0x1ffffxxxx所在空间。

所以查看原理图可以看出BOOT0和温湿度传感器挨着,所以破案了,一定是焊接原因。

至于为什么刚上电的时候是正常从flash启动的,我个人分析是由于上电的时候温湿度传感器还没驱动起来,依旧是低电平。而在程序开始执行之后,I2C空闲状态就变成高点平了,这个时候复位就BOOT0就会是1。
焊接问题是个不容易注意的小问题,但是现象确实很诡异
20191031更新:
和公司同事讨论了一下,发现关于刚上电的时候能正常执行程序我的想法是错误的。


因为I2C上电的时候会自动上拉,而且温湿度模块的电源和地也都是接在MCU上,相当于MCU和温湿度模块是同时上电。
而查阅芯片手册可以得知,BOOT会在reset后的第四个上升沿去采值

所以之前认为的不合逻辑,但是这又解释不通为什么刚上电的时候好用,但是执行过程中复位才不正常的现象。
只能姑且认为是测试样本不够多,接触不良偶然事件了。
|