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