贴了两块样板,烧写相同的固件。其间一块作业正常,可是别的一块呈现了很古怪的现象:在线调试正常;每次烧写完后作业正常;从头上电有时候作业正常,有时候作业不正常;作业不正常时,按下复位按键,康复正常。
作业反常现象:main函数中的体系运转指示灯不闪耀,可是初始化进程中点的一个灯是亮的!阐明程序运转一段时间后,不作业了。
因为在线调试形式,板子作业正常,无法经过在线调试的方法判别程序运转的反常状况。
剖析或许的原因:
1、初始化进程中,程序堕入死循环。但程序初始化进程中,没有while(1)死循环的代码。
2、板子上电后不断复位,导致无法进入main函数中的while(1)循环。
问题查找:
硬件:
1、承认BOOT0管脚接10kΩ欧电阻下拉到地;
2、RC上电延时复位电路中,R为10kΩ,C由0.1uF改为10uF,现象仍旧;
3、MCU 3.3V电源纹波很小,扫除电源问题。
如同从硬件上查不出什么问题。只能从板子上仅有点亮的灯下手了。
软件:
1、如同跟硬件复位没什么联系,为了承认板子是不是在不断复位,在点亮的那个灯前加了100ms延时,如果是在复位,那灯就应该不断闪耀。但那个灯还一向是亮的,阐明是程序运转犯错,不运转了。
2.不断修正led灯在初始化代码中的方位,终究定位到导致运转犯错的代码:装备一个GPIO为外部中止,跳变沿触发,上拉。把上拉改为NOPULL,作业一切正常。
问题定位:装备为外部中止的GPIO悬空导致。之前作业正常的样板是一向有连接到那个IO脚的外接模块,这个作业不正常的没有接,导致IO管脚电平不确定。因为电平的不确定,在初始化的瞬间有一个跳变沿,导致程序进入外部中止服务函数。在中止服务函数中,要读取一个定时器的寄存器的值,可是要读取的定时器或许还没有完结初始化,导致读取失利,程序运转反常。
解决办法:1、PULL形式有PULLRISING改为NOPULL;
2、TImer在这个外部中止之前进行初始化。