基于CAN總線連接的MEGA8遠(yuǎn)距離在線升級(jí)方案
……
ld temp,y+
mov zl,temp ; Z指針地址賦值
ld temp,y+
mov zh,temp
ldi temp,(1
rcall Do_SPM ; 執(zhí)行頁(yè)寫(xiě)入
……
3、BOOT程序介紹及流程圖
Mega8單片機(jī)上電后設(shè)置冷啟動(dòng)標(biāo)志,而熱啟動(dòng)入口則設(shè)置熱啟動(dòng)標(biāo)志。然后初始化堆棧、串口以及必要的I/O狀態(tài)等。初始化完成后,如果BOOT程序檢測(cè)到熱啟動(dòng)標(biāo)志則直接進(jìn)入燒錄狀態(tài);如果為冷啟動(dòng)標(biāo)志則繼續(xù)檢測(cè)下載位是否允許(本設(shè)計(jì)通過(guò)PB0開(kāi)關(guān)選擇),如為高電平則進(jìn)入燒錄狀態(tài),如為低電平則進(jìn)入用戶程序。
BOOT引導(dǎo)程序在設(shè)計(jì)時(shí)提供了兩個(gè)入口,一個(gè)是系統(tǒng)復(fù)位時(shí)的冷啟動(dòng)入口,另一個(gè)是用戶程序在運(yùn)行時(shí)進(jìn)入升級(jí)程序的熱啟動(dòng)入口。BOOT程序主要包括燒錄子程序、串口發(fā)送、串口接收、引導(dǎo)主程序等。
串口發(fā)送采用了查詢發(fā)送完成標(biāo)志。這樣當(dāng)該標(biāo)志被設(shè)置時(shí),證明串口的停止位已經(jīng)發(fā)送完成,這對(duì)于CAN總線通訊非常有用。燒錄程序主要使用“SPM” 指令,該指令完成對(duì)MEGA8的燒錄等功能。而讀取MEGA8的指令則使用“LPM”。由于擦除,頁(yè)填充,寫(xiě)入,讀出等基本命令單片機(jī)都已解釋完成,因此所有過(guò)程都可以由計(jì)算機(jī)端程序進(jìn)行控制。
程序開(kāi)始時(shí),計(jì)算機(jī)端發(fā)送命令,先對(duì)單片機(jī)的頁(yè)進(jìn)行擦除,然后接收一幀數(shù)據(jù),接收完畢后執(zhí)行頁(yè)寫(xiě)入命令,寫(xiě)入完成再進(jìn)行讀出進(jìn)行校驗(yàn),如果校驗(yàn)無(wú)誤再繼續(xù)寫(xiě)入下一頁(yè),直到所有頁(yè)都寫(xiě)入完畢,即完成一次下載過(guò)程。如果傳輸或頁(yè)校驗(yàn)出現(xiàn)錯(cuò)誤,程序會(huì)連續(xù)進(jìn)行5次測(cè)試,如再仍不成功,則認(rèn)為本次下載失敗。主程序流程圖如圖3。
MEGA8單片機(jī)的主程序通過(guò)CAN接口執(zhí)行計(jì)算機(jī)發(fā)送的命令,并且定義了一個(gè)更新代碼的特殊命令,當(dāng)接收到該命令時(shí),主程序首先關(guān)閉中斷,關(guān)閉看門(mén)狗,然后跳轉(zhuǎn)到BOOT的熱啟動(dòng)入口,再執(zhí)行BOOT下載燒錄程序。下載完成后再直接跳轉(zhuǎn)到$0000地址進(jìn)入用戶程序區(qū),這樣就完成了代碼的在線升級(jí)。為了保證該命令的可靠性,本程序設(shè)計(jì)時(shí)規(guī)定單片機(jī)必須在100ms內(nèi)同時(shí)接收到兩次該命令才認(rèn)為正確,超過(guò)100ms則不予認(rèn)可。
4、結(jié)束語(yǔ)
由于采用了MEGA8單片機(jī)的BOOT功能,以及CAN總線高速遠(yuǎn)距離通信,同時(shí)抗干擾性強(qiáng),使得遠(yuǎn)距離在線升級(jí),譬如通過(guò)以太網(wǎng)、無(wú)線等方式,成為了可能。這對(duì)于系統(tǒng)調(diào)試及以后的升級(jí)維護(hù)都提供了極大的便利,這也是今后單片機(jī)和CAN總線發(fā)展的一個(gè)方向。由于該部分具有通用性,所以可很容易地移植到 AVR其它MEGA系列的設(shè)計(jì)方案中。
評(píng)論