摘 要: 介紹了基于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)過實(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á)到提升儀器整體性能的目的。但是目前沒有專門應(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的讀/寫操作,,可以控制對(duì)某段、某頁,,甚至某個(gè)字節(jié)的讀寫操作[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ī))部分:首先編寫能對(duì)單片機(jī)中用戶原始程序更新替換的bootloader[4]程序并通過JTAG端口燒寫在單片機(jī)Flash中的bootloader存儲(chǔ)區(qū),,然后當(dāng)單片機(jī)復(fù)位時(shí)便進(jìn)入bootloader程序中并進(jìn)行升級(jí)判斷,如果接收到PC發(fā)來的升級(jí)指令,,則對(duì)Flash中用戶程序區(qū)進(jìn)行擦除,、讀寫操作,完成后運(yùn)行新的用戶程序,;如果在等待一段時(shí)間后仍無升級(jí)指令,,則直接跳轉(zhuǎn)到用戶原有程序運(yùn)行。
PC(上位機(jī))部分:?jiǎn)纹瑱C(jī)串行口連接到PC的RS232口進(jìn)行通信[5],。PC首先通過網(wǎng)絡(luò)或者其他途徑從血液分析儀生產(chǎn)商處獲取升級(jí)程序(二進(jìn)制文件形式)并保存在硬盤中,,本文采用網(wǎng)絡(luò)方式從儀器生產(chǎn)商網(wǎng)站上下載升級(jí)程序,然后運(yùn)行編寫好的基于微軟基礎(chǔ)類庫(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地址開始執(zhí)行跳轉(zhuǎn)語句,,所以設(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程序燒寫在0xF202~0xFDFF區(qū)域,。
另外,出于安全性考慮[2],,在分區(qū)時(shí)設(shè)計(jì)了用戶程序備份區(qū)[6],,在擦除用戶程序之前先將程序?qū)懭朐搮^(qū)域即完成備份工作。新的用戶程序在寫入的過程中可能會(huì)發(fā)生錯(cuò)誤,,此時(shí)系統(tǒng)會(huì)進(jìn)入死機(jī)或死循環(huán)狀態(tài),,bootloader程序中有開啟看門狗的語句,在看門狗中設(shè)置計(jì)數(shù)變量,,初值為零,,每次系統(tǒng)死機(jī)后再次復(fù)位便進(jì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)指令組成,,來實(shí)現(xiàn)bootloader程序正常的引導(dǎo)加載功能[4],。
初始化程序包括時(shí)鐘和通信接口(串口)的初始化和開啟看門狗等部分。監(jiān)測(cè)程序主要是檢測(cè)上位機(jī)發(fā)送的升級(jí)指令,,在和上位機(jī)建立通信之后等待一段時(shí)間,,若收到升級(jí)指令,則進(jìn)入升級(jí)服務(wù)程序部分;若沒有,,則跳轉(zhuǎn)至用戶程序,。升級(jí)服務(wù)程序由數(shù)據(jù)接收、Flash擦除,、讀寫和頻繁復(fù)位檢測(cè)等部分組成,。當(dāng)收到上位機(jī)發(fā)送的升級(jí)指令后,先備份bootloader入口地址,,再備份用戶程序,,然后擦除用戶程序區(qū)。擦除過程中要注意由于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ū)隔離開以防將備份區(qū)程序擦除。同理,,用戶程序區(qū)首地址0x0003所在扇區(qū)包含0x0000~0x0002,,即bootloader入口地址也會(huì)被擦除,故擦除用戶程序完成后要將入口地址回寫,。用戶程序擦除完成后先保存升級(jí)程序大小記為L(zhǎng),,然后從0x0003開始寫入從串口接收到的L個(gè)字節(jié)的二進(jìn)制程序數(shù)據(jù)。在寫入的同時(shí)進(jìn)行頻繁復(fù)位檢測(cè),,如果復(fù)位次數(shù)超過設(shè)定值,,則說明接收到的數(shù)據(jù)出錯(cuò),向上位機(jī)發(fā)送代表升級(jí)失敗的字符‘F’,,并跳轉(zhuǎn)到備份區(qū)執(zhí)行,;如果升級(jí)程序?qū)懭胪瓿蓻]有發(fā)生頻繁復(fù)位現(xiàn)象,則說明升級(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通過拖取相應(yīng)控件并編程來完成,調(diào)用了串口控件來實(shí)現(xiàn)串口通信,。
具體工作過程為:在運(yùn)行軟件之前首先將升級(jí)文件保存在MFC工程所在文件夾中,。然后開啟軟件界面,點(diǎn)擊“發(fā)送升級(jí)指令”按鈕,,發(fā)送一個(gè)升級(jí)指令字符,。若成功打開串口且單片機(jī)接收到該升級(jí)指令,,則上位機(jī)會(huì)接收到單片機(jī)發(fā)送的表示擦除完成的字符,并顯示于接收狀態(tài)框,;若等待較長(zhǎng)時(shí)間仍沒有收到升級(jí)指令,,則再次點(diǎn)擊發(fā)送按鈕,直到通信成功,。之后點(diǎn)擊按鈕“獲取文件大小并發(fā)送”,,程序?qū)⒄{(diào)用getlength( )函數(shù)獲取到工程文件夾中二進(jìn)制文件的大小(字節(jié)數(shù)),,并發(fā)送給單片機(jī),。單片機(jī)接收到之后返回一個(gè)確認(rèn)字符,上位機(jī)通過串口接收到后顯示在接收狀態(tài)框,。若較長(zhǎng)時(shí)間未收到確認(rèn)字符,,則再次發(fā)送文件大小直到接收到確認(rèn)為止。成功接收到后,,點(diǎn)擊“發(fā)送升級(jí)文件”按鈕發(fā)送二進(jìn)制升級(jí)文件,。如果收到單片機(jī)回復(fù)的字符‘S’,則說明寫入成功,,并在升級(jí)結(jié)果狀態(tài)框顯示“升級(jí)成功”字樣,;如果收到字符‘F’,則說明發(fā)生頻繁復(fù)位現(xiàn)象,,在狀態(tài)框顯示“升級(jí)失敗”字樣,。具體流程圖如圖5所示,單片機(jī)和PC之間的通信過程如圖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ī)的無線升級(jí)方法研究[J]. 電子技術(shù)應(yīng)用, 2012,38(11):139-142.