STM32在線調(diào)試正常,上電運(yùn)行不正常
貼了兩塊樣板,燒寫同樣的固件。其中一塊工作正常,但是另外一塊出現(xiàn)了很奇怪的現(xiàn)象:在線調(diào)試正常;每次燒寫完后工作正常;重新上電有時(shí)候工作正常,有時(shí)候工作不正常;工作不正常時(shí),按下復(fù)位按鍵,恢復(fù)正常。
工作異常現(xiàn)象:main函數(shù)中的系統(tǒng)運(yùn)行指示燈不閃爍,但是初始化過程中點(diǎn)的一個(gè)燈是亮的!說明程序運(yùn)行一段時(shí)間后,不工作了。
由于在線調(diào)試模式,板子工作正常,無法通過在線調(diào)試的方式判斷程序運(yùn)行的異常狀態(tài)。
分析可能的原因:
1、初始化過程中,程序陷入死循環(huán)。但程序初始化過程中,沒有while(1)死循環(huán)的代碼。
2、板子上電后不斷復(fù)位,導(dǎo)致無法進(jìn)入main函數(shù)中的while(1)循環(huán)。
問題查找:
硬件:
1、確認(rèn)BOOT0管腳接10kΩ歐電阻下拉到地;
2、RC上電延時(shí)復(fù)位電路中,R為10kΩ,C由0.1uF改為10uF,現(xiàn)象依舊;
3、MCU 3.3V電源紋波很小,排除電源問題。
好像從硬件上查不出什么問題。只能從板子上唯一點(diǎn)亮的燈下手了。
軟件:
1、好像跟硬件復(fù)位沒什么關(guān)系,為了確認(rèn)板子是不是在不停復(fù)位,在點(diǎn)亮的那個(gè)燈前加了100ms延時(shí),如果是在復(fù)位,那燈就應(yīng)該不停閃爍。但那個(gè)燈還一直是亮的,說明是程序運(yùn)行出錯(cuò),不運(yùn)行了。
2.不斷修改led燈在初始化代碼中的位置,最終定位到導(dǎo)致運(yùn)行出錯(cuò)的代碼:配置一個(gè)GPIO為外部中斷,跳變沿觸發(fā),上拉。把上拉改為NOPULL,工作一切正常。
問題定位:配置為外部中斷的GPIO懸空導(dǎo)致。之前工作正常的樣板是一直有連接到那個(gè)IO腳的外接模塊,這個(gè)工作不正常的沒有接,導(dǎo)致IO管腳電平不確定。由于電平的不確定,在初始化的瞬間有一個(gè)跳變沿,導(dǎo)致程序進(jìn)入外部中斷服務(wù)函數(shù)。在中斷服務(wù)函數(shù)中,要讀取一個(gè)定時(shí)器的寄存器的值,但是要讀取的定時(shí)器可能還沒有完成初始化,導(dǎo)致讀取失敗,程序運(yùn)行異常。
解決辦法:1、PULL模式有PULLRISING改為NOPULL;
2、timer在這個(gè)外部中斷之前進(jìn)行初始化。