序,備用升級(jí)區(qū)用于等待存放升級(jí)新固件。當(dāng)Bootflag變量的值為0時(shí),APP1為主程序區(qū)、APP2為備用升級(jí)區(qū);Bootflag變量的值為非0時(shí),APP2為主程序區(qū)、APP1為備用升級(jí)區(qū),主程序區(qū)用于存放升級(jí)前固件即單片升級(jí)時(shí)運(yùn)行的程序。
[0030]步驟三、升級(jí)服務(wù)器通過(guò)串口向單片機(jī)發(fā)送升級(jí)指令,單片機(jī)接收到升級(jí)服務(wù)器發(fā)送的升級(jí)指令后,檢查Flag分區(qū)中breakaddr變量的值,根據(jù)breakaddr變量的值生成響應(yīng)報(bào)文中對(duì)應(yīng)字節(jié)的內(nèi)容(即生成包含breakaddr變量的值的響應(yīng)報(bào)文),響應(yīng)報(bào)文打包完畢,單片機(jī)向升級(jí)服務(wù)器發(fā)送響應(yīng)報(bào)文并等待升級(jí)服務(wù)器的應(yīng)答。
[0031]步驟四、升級(jí)服務(wù)器接收到單片機(jī)發(fā)來(lái)的響應(yīng)報(bào)文后,檢測(cè)響應(yīng)報(bào)文內(nèi)容,根據(jù)響應(yīng)報(bào)文內(nèi)容決定固件升級(jí)開(kāi)始位置,當(dāng)響應(yīng)報(bào)文內(nèi)容中對(duì)應(yīng)breakaddr變量的字節(jié)內(nèi)容為0時(shí),說(shuō)明本次升級(jí)為新的升級(jí)即上次升級(jí)成功,升級(jí)服務(wù)器從升級(jí)新固件的起始位置(0位置)開(kāi)始發(fā)送升級(jí)新固件報(bào)文給單片機(jī);當(dāng)響應(yīng)報(bào)文內(nèi)容中對(duì)應(yīng)breakaddr變量的字節(jié)內(nèi)容為非0時(shí),說(shuō)明上次升級(jí)出現(xiàn)中斷,本次升級(jí)將繼續(xù)執(zhí)行上次升級(jí)即為斷點(diǎn)續(xù)傳,升級(jí)服務(wù)器從升級(jí)新固件的上次升級(jí)中斷位置即breakaddr位置開(kāi)始發(fā)送升級(jí)新固件報(bào)文給單片機(jī)。
[0032]步驟五、單片機(jī)接收到升級(jí)服務(wù)器發(fā)送的升級(jí)新固件報(bào)文后進(jìn)行差錯(cuò)檢驗(yàn),如果檢驗(yàn)升級(jí)新固件報(bào)文正確,則將接收到的升級(jí)新固件寫(xiě)入到備用升級(jí)區(qū),同時(shí)更新breakaddr變量的值,具體為breakaddr+寫(xiě)入到備用升級(jí)區(qū)中的數(shù)據(jù)字節(jié)數(shù),然后發(fā)送檢驗(yàn)正確的響應(yīng)報(bào)文給升級(jí)服務(wù)器;如果檢驗(yàn)錯(cuò)誤則發(fā)送請(qǐng)求數(shù)據(jù)重傳響應(yīng)報(bào)文到升級(jí)服務(wù)器。
[0033]步驟六、升級(jí)服務(wù)器接收到響應(yīng)報(bào)文進(jìn)行判斷,如果接收到檢驗(yàn)正確的響應(yīng)報(bào)文則發(fā)送下一包升級(jí)新固件報(bào)文給單片機(jī);如果接收到請(qǐng)求數(shù)據(jù)重傳響應(yīng)報(bào)文則發(fā)送當(dāng)前升級(jí)新固件報(bào)文給單片機(jī);
[0034]步驟七、重復(fù)步驟五和步驟六的過(guò)程,直至單片機(jī)接收到最后一包升級(jí)新固件報(bào)文。當(dāng)單片機(jī)接收到最后一包固件升級(jí)報(bào)文并成功寫(xiě)入到備用升級(jí)區(qū)后,breakaddr變量將被置0 ;同時(shí),bootflag變量根據(jù)當(dāng)前數(shù)值設(shè)定新值,若當(dāng)前bootflag變量的值為0則將其置為非0,若當(dāng)前bootflag變量的值為非0則將其置為0,其目的是使APP1區(qū)和APP2區(qū)在單片機(jī)升級(jí)時(shí)交替存儲(chǔ)升級(jí)前固件和升級(jí)新固件,如本次升級(jí)時(shí),存儲(chǔ)升級(jí)前固件下次將作為備用升級(jí)區(qū)等待存儲(chǔ)升級(jí)新固件。最后,單片機(jī)發(fā)送升級(jí)成功響應(yīng)報(bào)文到升級(jí)服務(wù)器,升級(jí)新固件在備用升級(jí)區(qū)存儲(chǔ)完畢。
[0035]步驟八、單片機(jī)重新啟動(dòng),運(yùn)行升級(jí)新固件,升級(jí)完成。
[0036]本發(fā)明將單片機(jī)Flash劃分成區(qū),實(shí)現(xiàn)了升級(jí)前固件和升級(jí)新固件的同時(shí)存儲(chǔ),用戶可通過(guò)設(shè)置bootflag變量選用所需固件,本發(fā)明方法具有非常高的升級(jí)成功率,且操作簡(jiǎn)單易于實(shí)現(xiàn)。
【主權(quán)項(xiàng)】
1.一種單片機(jī)固件升級(jí)方法,其特征在于,步驟包括: 步驟一、將單片機(jī)的Flash分為Boot區(qū)、Flag區(qū)、APP1區(qū)、APP2區(qū),Boot區(qū)用于存儲(chǔ)單片機(jī)上電程序;Flag區(qū)用于存儲(chǔ)升級(jí)輔助變量;APP1區(qū)和APP2區(qū)用于存儲(chǔ)升級(jí)前固件或升級(jí)新固件;所述升級(jí)輔助變量包括bootflag變量和breakaddr變量,其中當(dāng)bootflag變量的值為0時(shí),APP1區(qū)為主程序區(qū)、APP2區(qū)為備用升級(jí)區(qū),當(dāng)bootflag變量的值為非0時(shí),APP2區(qū)為主程序區(qū)、APP1區(qū)為備用升級(jí)區(qū);所述breakaddr變量的值表示固件升級(jí)時(shí)Flash的位置; 步驟二、單片機(jī)上電啟動(dòng),檢查bootflag變量的值,根據(jù)bootflag變量的值判斷單片機(jī)的主程序區(qū)和備用升級(jí)區(qū),并且跳轉(zhuǎn)至主程序區(qū)執(zhí)行程序; 步驟三、單片機(jī)接收到升級(jí)指令后,檢查breakaddr變量的值,將breakaddr變量的值填寫(xiě)到響應(yīng)報(bào)文對(duì)應(yīng)字節(jié)上,響應(yīng)報(bào)文打包完畢,單片機(jī)向升級(jí)服務(wù)器發(fā)送響應(yīng)報(bào)文并等待應(yīng)答; 步驟四、升級(jí)服務(wù)器接收到單片機(jī)發(fā)來(lái)的響應(yīng)報(bào)文后,根據(jù)響應(yīng)報(bào)文對(duì)應(yīng)字節(jié)上的內(nèi)容決定固件升級(jí)開(kāi)始位置,當(dāng)響應(yīng)報(bào)文中對(duì)應(yīng)字節(jié)內(nèi)容為0時(shí),升級(jí)服務(wù)器從升級(jí)新固件的起始位置發(fā)送升級(jí)新固件報(bào)文給單片機(jī);當(dāng)響應(yīng)報(bào)文中對(duì)應(yīng)字節(jié)內(nèi)容為非0時(shí),升級(jí)服務(wù)器從升級(jí)新固件的上次升級(jí)中斷位置發(fā)送升級(jí)新固件報(bào)文給單片機(jī); 步驟五、單片機(jī)接收到升級(jí)新固件報(bào)文后進(jìn)行差錯(cuò)檢驗(yàn),若檢驗(yàn)結(jié)果為正確,則將接收到的固件升級(jí)報(bào)文寫(xiě)入到備用升級(jí)區(qū),同時(shí)更新breakaddr變量的值,然后發(fā)送檢驗(yàn)正確的響應(yīng)報(bào)文給升級(jí)服務(wù)器;若檢驗(yàn)結(jié)果為錯(cuò)誤,則發(fā)送請(qǐng)求數(shù)據(jù)重傳響應(yīng)報(bào)文到升級(jí)服務(wù)器; 步驟六、當(dāng)升級(jí)服務(wù)器收到檢驗(yàn)正確的響應(yīng)報(bào)文時(shí),則發(fā)送下一包升級(jí)新固件報(bào)文給單片機(jī);當(dāng)升級(jí)服務(wù)器收到請(qǐng)求數(shù)據(jù)重傳響應(yīng)報(bào)文時(shí),則發(fā)送當(dāng)前升級(jí)新固件報(bào)文給單片機(jī); 步驟七、重復(fù)步驟五和步驟六的過(guò)程,直至單片機(jī)接收到最后一包升級(jí)新固件報(bào)文并成功寫(xiě)入到備用升級(jí)區(qū);此時(shí)breakaddr變量將被置0,并更新bootflag變量的值; 步驟八、單片機(jī)重新啟動(dòng),運(yùn)行升級(jí)新固件,升級(jí)完成。
【專利摘要】一種單片機(jī)固件升級(jí)法,通過(guò)將單片機(jī)的Flash進(jìn)行分區(qū),對(duì)升級(jí)前固件和升級(jí)新固件分區(qū)存儲(chǔ),防止了升級(jí)過(guò)程燒寫(xiě)Flash對(duì)升級(jí)前固件造成影響,使升級(jí)前固件不受破壞;同時(shí),通過(guò)變量設(shè)置,用戶可根據(jù)實(shí)際情況選擇所需的固件,升級(jí)前固件和升級(jí)新固件切換靈活。本發(fā)明方法實(shí)現(xiàn)過(guò)程中,只要Flash本身不存在問(wèn)題,就不存在固件升級(jí)失敗,即使出現(xiàn)中斷,上電恢復(fù)后升級(jí)也將會(huì)繼續(xù)即具有斷點(diǎn)續(xù)傳功能,同時(shí),本升級(jí)程序不會(huì)造成設(shè)備崩潰。
【IPC分類】G06F9/445
【公開(kāi)號(hào)】CN105278998
【申請(qǐng)?zhí)枴緾N201510789251
【發(fā)明人】聶停順, 李天萬(wàn), 劉子健, 吳迪
【申請(qǐng)人】北京聯(lián)合眾為科技發(fā)展有限公司, 華北計(jì)算技術(shù)研究所
【公開(kāi)日】2016年1月27日
【申請(qǐng)日】2015年11月17日