摘 要: 介紹了基于IAP技術(shù)的單片機(jī)程序升級(jí)方法在血液分析儀中的應(yīng)用。首先設(shè)計(jì)了由C8051F020單片機(jī)與基于PC的上位機(jī)組成的升級(jí)系統(tǒng),并以該系統(tǒng)為例介紹了血液分析儀中單片機(jī)應(yīng)用程序升級(jí)的基本原理以及升級(jí)系統(tǒng)的設(shè)計(jì),升級(jí)系統(tǒng)設(shè)計(jì)主要包括單片機(jī)存儲(chǔ)器的分區(qū)設(shè)計(jì)、bootloader程序的設(shè)計(jì)以及基于MFC的上位機(jī)軟件的設(shè)計(jì)。經(jīng)過(guò)實(shí)驗(yàn)驗(yàn)證,該系統(tǒng)能夠?qū)崿F(xiàn)單片機(jī)的程序升級(jí)功能。
關(guān)鍵詞: 血液分析儀;單片機(jī);IAP;升級(jí)系統(tǒng)
0 引言
血液分析儀[1]又稱血細(xì)胞分析儀,是目前國(guó)內(nèi)外醫(yī)學(xué)檢驗(yàn)最常使用的儀器之一,通常由控制系統(tǒng)、血細(xì)胞識(shí)別系統(tǒng)、液路驅(qū)動(dòng)系統(tǒng)、電源系統(tǒng)以及機(jī)械系統(tǒng)等部分組成。其中以單片機(jī)為核心器件的控制系統(tǒng)是其關(guān)鍵組成部分,其性能的優(yōu)劣決定著血液分析儀內(nèi)部系統(tǒng)能否較好地協(xié)調(diào)運(yùn)行,影響著血液分析儀的整體性能。為了更好地應(yīng)對(duì)市場(chǎng)的變化以及客戶的需求,血液分析儀生產(chǎn)商需要不斷引入新的技術(shù)對(duì)產(chǎn)品進(jìn)行升級(jí),即對(duì)儀器內(nèi)部核心器件的程序進(jìn)行替換,最終達(dá)到提升儀器整體性能的目的。但是目前沒(méi)有專門(mén)應(yīng)用于血液分析儀中單片機(jī)升級(jí)的方法,大多數(shù)采用工程師現(xiàn)場(chǎng)升級(jí)的方式,然而這種方式的升級(jí)成本較高且耗時(shí)長(zhǎng),尤其是對(duì)于偏遠(yuǎn)的地區(qū),客戶的升級(jí)需求很難及時(shí)得到滿足。本文介紹一種基于在應(yīng)用編程IAP(In Application Programming)技術(shù)的程序升級(jí)方法在血液分析儀單片機(jī)中的應(yīng)用。首先介紹血液分析儀中單片機(jī)應(yīng)用程序升級(jí)原理,然后分三部分介紹升級(jí)系統(tǒng)的設(shè)計(jì),包括Flash分區(qū)的設(shè)計(jì)、bootloader設(shè)計(jì)以及上位機(jī)軟件設(shè)計(jì)。
1 血液分析儀中單片機(jī)程序升級(jí)原理
IAP編程技術(shù)是應(yīng)用在Flash程序存儲(chǔ)器的一種編程模式,即在某段程序的控制下完成對(duì)Flash的讀/寫(xiě)操作,可以控制對(duì)某段、某頁(yè),甚至某個(gè)字節(jié)的讀寫(xiě)操作[2]。因此通常需要首先將單片機(jī)Flash存儲(chǔ)器進(jìn)行分區(qū)操作,進(jìn)而實(shí)現(xiàn)利用一部分代碼對(duì)另一部分代碼進(jìn)行升級(jí)的功能[3]。本文針對(duì)血液分析儀中單片機(jī)的存儲(chǔ)器分區(qū)設(shè)計(jì)將在2.1節(jié)中介紹。
基于上述原理設(shè)計(jì)了血液分析儀中單片機(jī)的升級(jí)系統(tǒng),該系統(tǒng)主要由PC和單片機(jī)兩部分構(gòu)成,系統(tǒng)結(jié)構(gòu)圖如圖1所示。本系統(tǒng)采用的血液分析儀中的單片機(jī)為Silicon Laboratories公司的C8051F020型號(hào),具有64 KB大容量Flash存儲(chǔ)器并且支持IAP功能。
系統(tǒng)工作原理如下:
單片機(jī)(下位機(jī))部分:首先編寫(xiě)能對(duì)單片機(jī)中用戶原始程序更新替換的bootloader[4]程序并通過(guò)JTAG端口燒寫(xiě)在單片機(jī)Flash中的bootloader存儲(chǔ)區(qū),然后當(dāng)單片機(jī)復(fù)位時(shí)便進(jìn)入bootloader程序中并進(jìn)行升級(jí)判斷,如果接收到PC發(fā)來(lái)的升級(jí)指令,則對(duì)Flash中用戶程序區(qū)進(jìn)行擦除、讀寫(xiě)操作,完成后運(yùn)行新的用戶程序;如果在等待一段時(shí)間后仍無(wú)升級(jí)指令,則直接跳轉(zhuǎn)到用戶原有程序運(yùn)行。
PC(上位機(jī))部分:?jiǎn)纹瑱C(jī)串行口連接到PC的RS232口進(jìn)行通信[5]。PC首先通過(guò)網(wǎng)絡(luò)或者其他途徑從血液分析儀生產(chǎn)商處獲取升級(jí)程序(二進(jìn)制文件形式)并保存在硬盤(pán)中,本文采用網(wǎng)絡(luò)方式從儀器生產(chǎn)商網(wǎng)站上下載升級(jí)程序,然后運(yùn)行編寫(xiě)好的基于微軟基礎(chǔ)類庫(kù)(Microsoft Foundation Classes,MFC)的上位機(jī)軟件[5],將指令和升級(jí)文件發(fā)送給單片機(jī)。有關(guān)上位機(jī)軟件的設(shè)計(jì)將在2.3節(jié)中介紹。
2 系統(tǒng)設(shè)計(jì)
2.1 Flash分區(qū)設(shè)置
基于上述IAP技術(shù)的原理,首先將C8051F020單片機(jī)的Flash存儲(chǔ)器做如圖2所示的分區(qū)。其中,0x0000 ~0x0002這3 B存儲(chǔ)bootloader的入口地址;0x0003~0x7803的30 KB為用戶程序存儲(chǔ)區(qū);0x7804~0x7A01范圍為預(yù)留部分;0x7A02~0xF201的30 KB是用戶程序備份區(qū);剩余的地址空間0xF202~0xFDFF則用于bootloader程序的存儲(chǔ)。分區(qū)中0x7804~0x7A01范圍為預(yù)留部分,其設(shè)計(jì)原理將在2.2節(jié)介紹。
由于單片機(jī)在復(fù)位后總是從0x0000地址開(kāi)始執(zhí)行跳轉(zhuǎn)語(yǔ)句,所以設(shè)計(jì)將bootloader首地址存放在前3個(gè)字節(jié)中,這樣復(fù)位后可以直接進(jìn)入bootloader程序。方法為在使用Keil軟件下載程序之前進(jìn)行如圖3所示的設(shè)置,在Code欄加入“?C_C51STARTUP(F202H)”實(shí)現(xiàn)跳轉(zhuǎn),并將Code Range改為0xF202-0xFDFF,即將該bootloader程序燒寫(xiě)在0xF202~0xFDFF區(qū)域。
另外,出于安全性考慮[2],在分區(qū)時(shí)設(shè)計(jì)了用戶程序備份區(qū)[6],在擦除用戶程序之前先將程序?qū)懭朐搮^(qū)域即完成備份工作。新的用戶程序在寫(xiě)入的過(guò)程中可能會(huì)發(fā)生錯(cuò)誤,此時(shí)系統(tǒng)會(huì)進(jìn)入死機(jī)或死循環(huán)狀態(tài),bootloader程序中有開(kāi)啟看門(mén)狗的語(yǔ)句,在看門(mén)狗中設(shè)置計(jì)數(shù)變量,初值為零,每次系統(tǒng)死機(jī)后再次復(fù)位便進(jìn)入看門(mén)狗,變量值加一,重新運(yùn)行之后又由于相同的原因復(fù)位,即發(fā)生頻繁復(fù)位現(xiàn)象。若變量的值大于限定的復(fù)位次數(shù)則進(jìn)入備份區(qū),執(zhí)行備份程序,防止因頻繁復(fù)位造成系統(tǒng)崩潰。
2.2 bootloader程序設(shè)計(jì)
bootloader程序通常由初始化程序、監(jiān)測(cè)程序、升級(jí)服務(wù)程序以及跳轉(zhuǎn)指令組成,來(lái)實(shí)現(xiàn)bootloader程序正常的引導(dǎo)加載功能[4]。
初始化程序包括時(shí)鐘和通信接口(串口)的初始化和開(kāi)啟看門(mén)狗等部分。監(jiān)測(cè)程序主要是檢測(cè)上位機(jī)發(fā)送的升級(jí)指令,在和上位機(jī)建立通信之后等待一段時(shí)間,若收到升級(jí)指令,則進(jìn)入升級(jí)服務(wù)程序部分;若沒(méi)有,則跳轉(zhuǎn)至用戶程序。升級(jí)服務(wù)程序由數(shù)據(jù)接收、Flash擦除、讀寫(xiě)和頻繁復(fù)位檢測(cè)等部分組成。當(dāng)收到上位機(jī)發(fā)送的升級(jí)指令后,先備份bootloader入口地址,再備份用戶程序,然后擦除用戶程序區(qū)。擦除過(guò)程中要注意由于64 KB的Flash存儲(chǔ)器是以512 B的扇區(qū)為單位組織的,一次擦除操作將擦除整個(gè)扇區(qū),所以在2.1節(jié)中設(shè)置用戶程序區(qū)結(jié)束地址0x7803時(shí),由于其所在扇區(qū)即0x7800~0x7A00將均被擦除,故要預(yù)留出0x7804~0x7A01的空間,將用戶程序區(qū)和備份區(qū)隔離開(kāi)以防將備份區(qū)程序擦除。同理,用戶程序區(qū)首地址0x0003所在扇區(qū)包含0x0000~0x0002,即bootloader入口地址也會(huì)被擦除,故擦除用戶程序完成后要將入口地址回寫(xiě)。用戶程序擦除完成后先保存升級(jí)程序大小記為L(zhǎng),然后從0x0003開(kāi)始寫(xiě)入從串口接收到的L個(gè)字節(jié)的二進(jìn)制程序數(shù)據(jù)。在寫(xiě)入的同時(shí)進(jìn)行頻繁復(fù)位檢測(cè),如果復(fù)位次數(shù)超過(guò)設(shè)定值,則說(shuō)明接收到的數(shù)據(jù)出錯(cuò),向上位機(jī)發(fā)送代表升級(jí)失敗的字符‘F’,并跳轉(zhuǎn)到備份區(qū)執(zhí)行;如果升級(jí)程序?qū)懭胪瓿蓻](méi)有發(fā)生頻繁復(fù)位現(xiàn)象,則說(shuō)明升級(jí)成功,向上位機(jī)發(fā)送字符‘S’,并跳轉(zhuǎn)到升級(jí)后的用戶程序區(qū)執(zhí)行。具體流程圖如圖4所示。
2.3 上位機(jī)軟件設(shè)計(jì)
本系統(tǒng)所述PC上運(yùn)行的上位機(jī)軟件主要用于和單片機(jī)之間進(jìn)行通信,該軟件基于MFC通過(guò)拖取相應(yīng)控件并編程來(lái)完成,調(diào)用了串口控件來(lái)實(shí)現(xiàn)串口通信。
具體工作過(guò)程為:在運(yùn)行軟件之前首先將升級(jí)文件保存在MFC工程所在文件夾中。然后開(kāi)啟軟件界面,點(diǎn)擊“發(fā)送升級(jí)指令”按鈕,發(fā)送一個(gè)升級(jí)指令字符。若成功打開(kāi)串口且單片機(jī)接收到該升級(jí)指令,則上位機(jī)會(huì)接收到單片機(jī)發(fā)送的表示擦除完成的字符,并顯示于接收狀態(tài)框;若等待較長(zhǎng)時(shí)間仍沒(méi)有收到升級(jí)指令,則再次點(diǎn)擊發(fā)送按鈕,直到通信成功。之后點(diǎn)擊按鈕“獲取文件大小并發(fā)送”,程序?qū)⒄{(diào)用getlength( )函數(shù)獲取到工程文件夾中二進(jìn)制文件的大?。ㄗ止?jié)數(shù)),并發(fā)送給單片機(jī)。單片機(jī)接收到之后返回一個(gè)確認(rèn)字符,上位機(jī)通過(guò)串口接收到后顯示在接收狀態(tài)框。若較長(zhǎng)時(shí)間未收到確認(rèn)字符,則再次發(fā)送文件大小直到接收到確認(rèn)為止。成功接收到后,點(diǎn)擊“發(fā)送升級(jí)文件”按鈕發(fā)送二進(jìn)制升級(jí)文件。如果收到單片機(jī)回復(fù)的字符‘S’,則說(shuō)明寫(xiě)入成功,并在升級(jí)結(jié)果狀態(tài)框顯示“升級(jí)成功”字樣;如果收到字符‘F’,則說(shuō)明發(fā)生頻繁復(fù)位現(xiàn)象,在狀態(tài)框顯示“升級(jí)失敗”字樣。具體流程圖如圖5所示,單片機(jī)和PC之間的通信過(guò)程如圖6所示。
3 結(jié)論
采用基于IAP技術(shù)的單片機(jī)程序升級(jí)方法,設(shè)計(jì)了應(yīng)用于血液分析儀的C8051F020型號(hào)單片機(jī)的程序升級(jí)系統(tǒng),成功地對(duì)血液分析儀中單片機(jī)的應(yīng)用程序進(jìn)行了更新替換,并且新的應(yīng)用程序能夠正常運(yùn)行。該方法具備一定的有效性和可靠性,能夠克服血液分析儀中單片機(jī)現(xiàn)存升級(jí)方法的不足,節(jié)約了資源和成本。并且該方法不僅適用于C8051F020單片機(jī),對(duì)于不同血液分析儀中其他型號(hào)的單片機(jī)同樣適用,只需要對(duì)其Flash分區(qū)和bootloader中的地址稍作調(diào)整即可,具有應(yīng)用價(jià)值。
參考文獻(xiàn)
[1] 游世梅. 血液分析儀的現(xiàn)狀與發(fā)展趨勢(shì)分析[J]. 中國(guó)高新技術(shù)企業(yè), 2013(9):83-84.
[2] 田日才, 王國(guó)鵬, 梁學(xué)東. ATMEGA128 單片機(jī)的軟件遠(yuǎn)程升級(jí)[J]. 電子技術(shù)應(yīng)用, 2003,29(11): 23-25.
[3] 劉根賢, 龔雪容, 生擁宏, 等. 基于高頻 RFID 的微處理器 IAP 技術(shù)[J]. 電子技術(shù)應(yīng)用, 2013,39(4):29-31.
[4] 劉云龍, 張偉霞. 基于 C8051F34x 單片機(jī)的 USB Bootloader 設(shè)計(jì)[J]. 微型機(jī)與應(yīng)用, 2012,30(23):56-59.
[5] 韋曉茹, 蔡志堅(jiān), 居戩之. AVR 單片機(jī) ATmega16 與計(jì)算機(jī)串行通信的實(shí)現(xiàn)[J]. 微型機(jī)與應(yīng)用, 2012,31(14):30-33.
[6] 生鳳中, 荊雷, 李建業(yè). 基于 CC1110 單片機(jī)的無(wú)線升級(jí)方法研究[J]. 電子技術(shù)應(yīng)用, 2012,38(11):139-142.