stm32 在線升級(jí)的慘痛經(jīng)歷
一、問題
在成功實(shí)現(xiàn)了程序定時(shí)在APP和IAP之間來(lái)回切換后,以為已經(jīng)掌握了stm在線升級(jí)的秘訣,于是興沖沖的開始改公司的升級(jí)程序。結(jié)果,發(fā)現(xiàn)程序可以從IAP跳轉(zhuǎn)到APP,但是程序會(huì)跑飛。在進(jìn)入APP模式后,結(jié)束調(diào)試時(shí),會(huì)自動(dòng)跳轉(zhuǎn)到一下界面。
嘗試調(diào)試無(wú)數(shù)次,依然沒有進(jìn)展,而且毫無(wú)辦法,不知道哪里出了問題。
二、嘗試解決與交叉驗(yàn)證
1、將APP程序替換成之前的亮燈程序,然后進(jìn)行更新,更新完畢后,APP程序正常運(yùn)行。此步驟驗(yàn)證了IAP程序是可以正常跳轉(zhuǎn)的。
2、先進(jìn)行IAP在線升級(jí),將APP程序通過升級(jí)的方式燒錄到FLASH,然后寫入之前可以正常工作的已有的IAP程序。發(fā)現(xiàn)APP正常工作,此方法可以驗(yàn)證通過升級(jí)的方式寫入的APP程序是正確和完整的。
3、通過以上步驟的交叉驗(yàn)證,可以證明IAP和APP程序都是正確的。那么問題出在哪里呢??
4、嘗試在現(xiàn)有的APP程序里,添加入之前可以正常工作的led亮燈的APP程序,屏蔽掉與亮燈程序無(wú)關(guān)的代碼。然后通過在線升級(jí)的方法寫入修改過的APP程序,結(jié)果發(fā)現(xiàn)IAP可以成功跳轉(zhuǎn)到APP部分,且APP工作正常;
5、逐步添加APP里被屏蔽掉的代碼,并逐步刪除新加入的LED亮燈有關(guān)的代碼,看是從哪一步驟開始,APP代碼不能正常工作;
6、為了快速驗(yàn)證,先后寫入IAP和APP程序。在IAP程序里 只通過定時(shí)的方式,定時(shí)切換到APP程序。觀察IAP是否可以跳轉(zhuǎn),APP程序是否可以工作。
三、問題點(diǎn)
經(jīng)過以上步驟,發(fā)現(xiàn)在刪除定時(shí)器2的中斷處理函數(shù)后,IAP可以跳轉(zhuǎn),但APP會(huì)跑飛。
原因:
1、在IAP程序里,我開了定時(shí)器2,在跳轉(zhuǎn)前關(guān)閉了總中斷;這個(gè)是與之前已有的IAP程序不一樣的地方,之前代碼是用了定時(shí)器3;
2、在IAP跳轉(zhuǎn)到APP后,重新打開了總中斷。這個(gè)時(shí)候,定時(shí)器2又重新開始工作,但是在我的APP程序里,因?yàn)闆]有用定時(shí)器2,所以沒有寫定時(shí)器2的中斷處理函數(shù),所以程序會(huì)跑飛。
四、 總結(jié)
1、在跳轉(zhuǎn)前,一定要把已經(jīng)使用到的外設(shè)全部關(guān)閉。比如
__disable_irq();
TIM_Cmd(TIM2,DISABLE );
GotoAPPMain();
2、在所有的外設(shè)聲明前,一定要先復(fù)位,比如
TIM_DeInit (TIM3 );
3、最好定時(shí)器的功能都用的一致,比如IAP和APP都用定時(shí)器2 或者定時(shí)器3,不要一個(gè)用定時(shí)器2 ,另一個(gè)用定時(shí)器3。