李 永,李芙玲
(1.華北科技學(xué)院 機(jī)電工程學(xué)院,北京 東燕郊 101601;2.華北科技學(xué)院 計(jì)算機(jī)工程學(xué)院,北京 東燕郊 101601)
基于STM32單片機(jī)的監(jiān)控終端程序代碼遠(yuǎn)程升級(jí)功能的實(shí)現(xiàn)
李 永,李芙玲
(1.華北科技學(xué)院 機(jī)電工程學(xué)院,北京 東燕郊 101601;2.華北科技學(xué)院 計(jì)算機(jī)工程學(xué)院,北京 東燕郊 101601)
本文介紹了監(jiān)控終端程序代碼實(shí)現(xiàn)遠(yuǎn)程升級(jí)的實(shí)現(xiàn)方法,該監(jiān)控終端以STM32F103系列單片機(jī)為核心,采用現(xiàn)場(chǎng)總線CAN總線作為通信網(wǎng)絡(luò);整個(gè)系統(tǒng)八包括監(jiān)控終端和服務(wù)器;在監(jiān)控終端設(shè)計(jì)中,將監(jiān)控終端程序分成了啟動(dòng)控制程序BOOT_APP和主應(yīng)用程序MAIN_APP;服務(wù)器通過網(wǎng)絡(luò)從遠(yuǎn)程向監(jiān)控終端發(fā)送更新程序,從而實(shí)現(xiàn)監(jiān)控終端程序的在線更新,這種監(jiān)控終端程序的遠(yuǎn)程升級(jí)方法的應(yīng)用,降低了監(jiān)控終端的運(yùn)行成本,提高了監(jiān)控終端的適用范圍。
STM32F103單片機(jī);遠(yuǎn)程升級(jí);HEX文件;MDK-ARM ;Visual Basic
在煤礦生產(chǎn)過程中,人們用了大量監(jiān)控設(shè)備來時(shí)時(shí)監(jiān)控煤礦生產(chǎn)過程的各項(xiàng)參數(shù)、狀態(tài)等信息,這些監(jiān)控設(shè)備的應(yīng)用提高了煤礦的安全生產(chǎn)水平,他們又被稱為監(jiān)控終端。由于煤礦的生產(chǎn)環(huán)境隨著時(shí)間在不斷改變,所以,煤礦安全生產(chǎn)對(duì)監(jiān)控設(shè)備的要求也是再不斷變化的,而監(jiān)控設(shè)備的更換費(fèi)時(shí)費(fèi)力,而且會(huì)影響生產(chǎn);另一方面,從生產(chǎn)現(xiàn)場(chǎng)的需求來看,生產(chǎn)環(huán)境的變化對(duì)監(jiān)控設(shè)備需求的改變主要是要求其軟件功能進(jìn)行相應(yīng)升級(jí)就夠了,所以,監(jiān)控設(shè)備軟件系統(tǒng)如果具有遠(yuǎn)程升級(jí)的功能,則對(duì)煤礦生產(chǎn)來說,將能節(jié)約大量的財(cái)力物力,且能夠減少煤礦停工檢修時(shí)間,提高煤礦生產(chǎn)效率。
目前,大多數(shù)監(jiān)控終端軟件升級(jí)基本上有兩種方法:第一種,應(yīng)用在使用8031系列單片機(jī)的監(jiān)控終端,升級(jí)方法是直接更換其程序存儲(chǔ)器(ROM);第二種,應(yīng)用在使用STC或AVR類型單片機(jī)的監(jiān)控終端,升級(jí)方法是通過ISP接口或JTAG接口重新下載程序。這兩種方法都需要將監(jiān)控終端停止工作,升級(jí)操作完成后再投入,因此對(duì)生產(chǎn)的影響較大。而本文設(shè)計(jì)的方法可以通過網(wǎng)絡(luò)在線升級(jí),能夠最大限度地減少對(duì)一線生產(chǎn)的影響。
若實(shí)現(xiàn)監(jiān)控系統(tǒng)軟件升級(jí)的功能,必須設(shè)計(jì)服務(wù)器,用戶通過服務(wù)器對(duì)監(jiān)控終端發(fā)出控制命令、接收監(jiān)控終端發(fā)來數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行處理、顯示、打印、存儲(chǔ)等功能,同時(shí),用戶還可以通過服務(wù)器對(duì)監(jiān)控終端軟件系統(tǒng)實(shí)現(xiàn)升級(jí)維護(hù)。監(jiān)控系統(tǒng)整體設(shè)計(jì)框圖如下:
圖1 具有升級(jí)軟件在線升級(jí)功能的監(jiān)控系統(tǒng)整體設(shè)計(jì)框圖
上圖中,左邊部分時(shí)監(jiān)控終端的框圖,該監(jiān)控中斷以STM23F103系列單片機(jī)為核心。外圍電路主要包括模擬量輸入模塊、開關(guān)量輸入輸出模塊、CAN接口通信模塊和Flash存儲(chǔ)器模塊等。模擬量輸入模塊主要完成現(xiàn)場(chǎng)模擬量參數(shù)輸入功能,STM32F103系列單片機(jī)內(nèi)部有12位A/D轉(zhuǎn)換器,因此不用外接模數(shù)轉(zhuǎn)換芯片,模擬量輸入模塊僅需要完成信號(hào)的變換和接口的保護(hù)等功能;開關(guān)量輸入輸出模塊用于實(shí)現(xiàn)現(xiàn)場(chǎng)開關(guān)量及配置信息輸入和控制信號(hào)輸出的功能,該模塊要做好隔離及開關(guān)量輸出的安全可靠設(shè)計(jì);CAN接口通信模塊的功能主要時(shí)實(shí)現(xiàn)監(jiān)控終端與其他智能設(shè)備或服務(wù)器間的通信,因?yàn)榫孪锏廓M窄、設(shè)備密集,電磁干擾較為嚴(yán)重,因此為了保證通信質(zhì)量我們采用了CAN總線通信的形式,CAN接口處也要做好隔離措施,保證接口安全和抗干擾性能;Flash存儲(chǔ)器模塊是我們的設(shè)備為實(shí)現(xiàn)軟件系統(tǒng)遠(yuǎn)程升級(jí)專門設(shè)計(jì)的芯片,我們采用的時(shí)Winbond公司的SPI Flash芯片,容量為1M,監(jiān)控終端中選用的單片機(jī)是STM32F103RB,該單片機(jī)的程序存儲(chǔ)器容量時(shí)128k,1M字節(jié)的SPI Flash芯片存儲(chǔ)升級(jí)程序已經(jīng)夠用,同時(shí)剩余的空間可以存放配置參數(shù)或監(jiān)測(cè)數(shù)據(jù);系統(tǒng)的服務(wù)器采用一般PC機(jī)就可以,也可以采用專用的服務(wù)器主機(jī),該服務(wù)器通過外接R232接口到CAN總線接口的轉(zhuǎn)換模塊實(shí)現(xiàn)與CAN總線連接。
STM32系列單片機(jī)的程序存儲(chǔ)器內(nèi)容的修改不需要提供額外的更高電壓,在其3.3 V工作電壓就能夠很方便地擦除和改寫,而且該單片機(jī)有專用的擦除和改寫程序存儲(chǔ)器的指令,因此,該型號(hào)系列單片機(jī)能夠很方便地實(shí)現(xiàn)軟件系統(tǒng)的在線更新。
STM32系列單片機(jī)實(shí)現(xiàn)程序更新的實(shí)現(xiàn)方法是:將監(jiān)控終端的程序分解為兩部分,一部分為啟動(dòng)程序,稱為BOOT_APP;另一部分為主應(yīng)用程序,稱為MAIN_APP;啟動(dòng)程序BOOT_APP放在程序存儲(chǔ)器的前邊一段,占10k的存儲(chǔ)空間,從程序存儲(chǔ)器11k的開始位置放置主應(yīng)用程序,MAIN_APP是可以更新的,而BOOT_APP功能時(shí)檢查是否有更新程序,并實(shí)現(xiàn)將更新應(yīng)用程序安裝到主應(yīng)用程序區(qū)段,實(shí)現(xiàn)主應(yīng)用程序更新的功能,而BOOT_APP部分是不能更新的。BOOT_APP部分程序的框圖如下:
圖2 BOOT_APP程序框圖
在BOOT_APP程序的設(shè)置中,該程序在單片機(jī)中存儲(chǔ)起始位置設(shè)置為0x08000000;而主程序的起始放置地址是0x08002800。更新程序放在外部的SPI Flash中,是否進(jìn)行更新要進(jìn)行兩個(gè)判斷,一個(gè)是判斷是否有更新程序;另一個(gè)還要判斷更新程序是否完整。
單片機(jī)復(fù)位后從0x08000000開始執(zhí)行,也就是執(zhí)行BOOT_APP程序,從BOOT_APP程序跳轉(zhuǎn)到主程序的語句如下:
JumpAddress=*(__IO uint32_t*)(APP_ADD+4); //跳轉(zhuǎn)至用戶主程序
Jump_To_Application=(pFunction)JumpAddress;
__set_MSP(*(__IO uint32_t*)APP_ADD); //初始化主程序的堆棧指針
Jump_To_Application();
前面代碼中,APP_ADD是主程序起始地址0x08002800;JumpAddress是一個(gè)32位地址指針;Jump_To_Application是一個(gè)程序指針變量。
主應(yīng)用程序(MAIN_APP)在運(yùn)行過程中可以通過網(wǎng)絡(luò)接收服務(wù)器發(fā)來的更新程序,并將更新程序存儲(chǔ)到外部SPI Flash中,當(dāng)更新程序下載完成,經(jīng)過校驗(yàn)無誤后修改更新標(biāo)志,并根據(jù)服務(wù)器命令要求重新啟動(dòng)監(jiān)控終端;監(jiān)控終端重新啟動(dòng)后,BOOT_APP首先運(yùn)行,在其運(yùn)行過程中查更新標(biāo)志,發(fā)現(xiàn)有了更新標(biāo)志,則啟動(dòng)更新過程,將SPI Flash中的程序?qū)懭氲絊TM32的主應(yīng)用程序區(qū)段,實(shí)現(xiàn)更新主應(yīng)用程序的安裝,然后BOOT_APP刪除更新標(biāo)志,并引導(dǎo)單片機(jī)跳轉(zhuǎn)到主應(yīng)用程序執(zhí)行。MAIN_APP部分程序的程序根據(jù)用戶的設(shè)計(jì)完成需要的功能,每個(gè)項(xiàng)目寫的程序可能千差萬別,這里不再介紹其程序框圖;但是如果想實(shí)現(xiàn)遠(yuǎn)程代碼升級(jí),在MAIN_APP中要設(shè)計(jì)接收遠(yuǎn)程發(fā)來代碼的子程序,當(dāng)程序代碼接收完成后設(shè)置更新標(biāo)志,這里還要考慮斷電續(xù)傳等功能,限于篇幅本文中不再詳細(xì)敘述;但是在主程序的編譯中,其工程設(shè)計(jì)選項(xiàng)和下載選項(xiàng)需要設(shè)置,我們的設(shè)計(jì)中主程序從0x08002800開始執(zhí)行,所以在編譯環(huán)境(我使用的是MDK-ARM 4.7)中要設(shè)置編譯目標(biāo)文件的起始地址為0x08002800,在JLINK下載的Flash Download設(shè)置中也要設(shè)置為從該地址開始下載。同時(shí)在MAIN_APP的中斷向量設(shè)置中需要設(shè)置中斷向量從0x08002800開始,否則主程序的中斷執(zhí)行將出現(xiàn)錯(cuò)誤,中斷向量設(shè)置語句如下:
SCB→VTOR = NVIC_VectTab_FLASH|0x2800;//將中斷向量設(shè)置為從0x08002800開始
需要把上邊這條語句加到主程序的初始化程序中。
1) 服務(wù)器端升級(jí)軟件設(shè)計(jì)
服務(wù)器端程序是用Visual Basic6.0程序編寫,服務(wù)器端設(shè)計(jì)軟件的功能是打開更新程序文件,通過網(wǎng)絡(luò)將更新軟件發(fā)送給遠(yuǎn)方的監(jiān)控終端。單片機(jī)程序編譯完成后下載到單片機(jī)的是二進(jìn)制文件,可以是BIN為擴(kuò)展名的文件,也可以是HEX為擴(kuò)展名的文件,使用的是HEX為擴(kuò)展名的文件。升級(jí)的過程就是將更完善的程序編譯成HEX文件,然后通過網(wǎng)絡(luò)將HEX文件內(nèi)容發(fā)送給監(jiān)控終端,監(jiān)控終端的BOOT_APP程序根據(jù)收到的程序文件內(nèi)容更新MAIN_APP。
下面是一個(gè)用KEIL編譯的STM32單片機(jī)的程序的HEX文件。
:020000040800F2
:10280000881E00202D980008359800083798000889
:10281000399800083B9800083D9800080000000027
(中間行省略)
:10C4D0002A04681AFF010118025B022D01020304FD
:10C4E0000410090607080902040608ACA24A041C45
:04C4F0002918000007
:04000005080028EDDA
:00000001FF
該HEX文件實(shí)際時(shí)文本文件格式的,每行起始字符都是冒號(hào),在冒號(hào)后邊兩個(gè)字符代表一個(gè)16進(jìn)制的一個(gè)字節(jié),第一個(gè)字節(jié)表示該行中有效數(shù)據(jù)的長(zhǎng)度,后邊兩個(gè)字節(jié)為該行數(shù)據(jù)在單片機(jī)FLASH中存放的起始地址(如果改行是數(shù)據(jù)行的話),第4個(gè)字節(jié)表示改行數(shù)據(jù)的類型,在前面文件中第一行的04表示改行為擴(kuò)展地址,后邊的0800為擴(kuò)展地址,數(shù)據(jù)在FLASH中存儲(chǔ)地址的前4位為0800,每行最后一個(gè)字節(jié)時(shí)改行的校驗(yàn)和,該校驗(yàn)和的計(jì)算方法是改行前邊所有字節(jié)和用256減后的結(jié)果。
HEX文件中第二行開始包含了程序真正的運(yùn)行代碼,第二行的第一個(gè)字節(jié)10表示該行有16個(gè)有效數(shù)據(jù)字節(jié),地址2800表示該行代碼放在單片機(jī)FLASH中的起始地址時(shí)0x08002800,后邊的第4個(gè)字節(jié)00表示該行為數(shù)據(jù)行,在升級(jí)程序時(shí)只需要把后邊的這16個(gè)字節(jié)傳送給監(jiān)控終端,并且告訴終端該16個(gè)字節(jié)從08002800開始存放。上邊文件的倒數(shù)第3行“:04C4F0002918000007”是該HEX文件數(shù)據(jù)部分的最后一行;倒數(shù)第二行“:04000005080028EDDA”表示的含義時(shí)該HEX文件數(shù)據(jù)部分結(jié)束,主程序入口地址為0x080028ED,該地址與0x08002800之間的部分存放的是常數(shù)、子程序入口地址等內(nèi)容,該行數(shù)據(jù)不需要傳送給監(jiān)控終端;HEX文件的最后一行“:00000001FF”表示的是該HEX文件的結(jié)束,該行也不需要傳送給監(jiān)控終端。
2) 服務(wù)器傳送HEX文件給監(jiān)控終端的過程
圖3 服務(wù)器向監(jiān)控終端發(fā)送升級(jí)代碼框圖
在服務(wù)器發(fā)送升級(jí)程序時(shí),首先要查看終端的程序是否要升級(jí),查看的方法是向終端發(fā)送查看版本的命令,如果終端返回的程序版本與要升級(jí)的程序版本相同則不需要升級(jí);如果版本不同,則可以啟動(dòng)升級(jí)過程,升級(jí)中要查看升級(jí)是否完成,如果沒有完成,則按斷點(diǎn)續(xù)傳的要求繼續(xù)傳送后邊的代碼;當(dāng)所有代碼都傳送完畢后,進(jìn)行教研檢察,經(jīng)檢查發(fā)現(xiàn)傳送正確,則認(rèn)為升級(jí)完成,最后標(biāo)記更新完成標(biāo)志,結(jié)束升級(jí)過程。
參與研發(fā)的配電在線監(jiān)測(cè)系統(tǒng)是一個(gè)用在10kV架空線路上的在線監(jiān)測(cè)系統(tǒng),主要用于監(jiān)測(cè)架空線路的短路、接地故障及實(shí)時(shí)監(jiān)測(cè)線路電流變化情況。該系統(tǒng)包括:卡在線路上的帶通信功能的架空線路故障指示器、固定在線桿上的數(shù)據(jù)采集傳輸中端(DCU)和后臺(tái)監(jiān)控服務(wù)器部分。
該系統(tǒng)中DCU用的單片機(jī)型號(hào)是STM32F103R8T6,有64 k的Flash程序存儲(chǔ)器;外部擴(kuò)展的用于存儲(chǔ)臨時(shí)升級(jí)Flash的芯片是Winbond公司的W25X16,該芯片容量為1 M,除了64 k(我分配的是1 k到65 k部分)用于升級(jí)外,其余部分用來存儲(chǔ)配置信息及部分重要數(shù)據(jù)。升級(jí)過程如下:
(1) 首先要將升級(jí)程序(BOOT)寫入單片機(jī),該程序用于實(shí)現(xiàn)有無升級(jí)數(shù)據(jù)的判斷及引導(dǎo)單片機(jī)運(yùn)行主程序。
(2) 將應(yīng)用程序主應(yīng)用程序(APP)寫入單片機(jī)使系統(tǒng)能夠運(yùn)行,該主程序功能是完成系統(tǒng)主要功能及接受遠(yuǎn)程升級(jí)數(shù)據(jù),并將升級(jí)數(shù)據(jù)存儲(chǔ)到外部Flash中。
(3) 需要升級(jí)時(shí)將新編譯好的升級(jí)文件(主程序的HEX文件)拷貝到服務(wù)器上。
(4) 將升級(jí)數(shù)據(jù)文件轉(zhuǎn)換為升級(jí)主控程序能夠識(shí)別的文件格式,我設(shè)計(jì)的升級(jí)主控程序是用Visual Basic編寫的,需要將升級(jí)數(shù)據(jù)文件轉(zhuǎn)換為EXCEL95格式,轉(zhuǎn)化方法也很簡(jiǎn)單,只要用EXCEL打開該文件,并另存為EXCEL95格式就行。
(5) 在服務(wù)器上運(yùn)行升級(jí)主控程序,啟動(dòng)網(wǎng)絡(luò)監(jiān)聽功能;設(shè)置DCU連接到升級(jí)主控程序,由主控程序啟動(dòng)升級(jí)功能完成在線升級(jí)數(shù)據(jù)下載到DCU的過程。
(6) 程序下載完成后,由升級(jí)主控程序發(fā)送控制指令,使DCU重新啟動(dòng),DCU在重新啟動(dòng)時(shí)BOOT程序讀取最新的數(shù)據(jù)文件,并將其覆蓋單片機(jī)中原有主應(yīng)用程序。之后,BOOT程序控制下完成升級(jí)后再引導(dǎo)單片機(jī)運(yùn)行主程序,完成本次遠(yuǎn)程升級(jí)的過程。
升級(jí)主控程序運(yùn)行界面如下:
圖4 升級(jí)主控程序界面
本文描述了監(jiān)控終端實(shí)現(xiàn)程序代碼遠(yuǎn)程升級(jí)的設(shè)計(jì)和實(shí)現(xiàn)方法,文中監(jiān)控終端采用了高性能STM32F103系列單片機(jī),通過該方法設(shè)計(jì)的監(jiān)控終端可以實(shí)現(xiàn)軟件系統(tǒng)的在線升級(jí),使監(jiān)控終端的使用、維護(hù)和功能完善更加方便,提高了監(jiān)控終端的適應(yīng)性,也降低了現(xiàn)場(chǎng)使用監(jiān)控終端的運(yùn)行和維護(hù)成本。
該在線升級(jí)方法適用于應(yīng)用STM32系列單片機(jī)作為核心控制單片機(jī)的監(jiān)控終端,并且若想實(shí)現(xiàn)遠(yuǎn)程升級(jí)則需要該終端具有遠(yuǎn)程聯(lián)網(wǎng)功能。本方法已經(jīng)在筆者參與研發(fā)的配電在線監(jiān)測(cè)系統(tǒng)中投入使用,實(shí)踐證明該升級(jí)方法操作簡(jiǎn)、安全可靠,能夠滿足監(jiān)控系統(tǒng)終端程序在線升級(jí)的要求。在該系統(tǒng)中利用本文介紹的在線升級(jí)方法實(shí)現(xiàn)了DCU的在線遠(yuǎn)程升級(jí)。
[1] yx_l128125 STM32 IAP 在線升級(jí)詳解[EB/OL].http://blog.csdn.net/.2013.10.
[2] 張河新,王曉輝,黃曉東.基于STM32和CAN總線的智能數(shù)據(jù)采集節(jié)點(diǎn)設(shè)計(jì)[J].化工自動(dòng)化及儀表,2012(1):78-80.
[3] 高兵權(quán),孫志海,湯麗,肖學(xué)福.基于STM32控制器的地層應(yīng)力檢測(cè)裝置研究[J].華北科技學(xué)院學(xué)報(bào),2011(3):31-34.
[4] 闕凡博.基于STM32的遠(yuǎn)程升級(jí)系統(tǒng)的設(shè)計(jì)[J].科技廣場(chǎng),2013(5):97-100.
[5] 張宏濤.基于802.11b/g的井下機(jī)車無線遙控系統(tǒng)設(shè)計(jì)[J].華北科技學(xué)院學(xué)報(bào),2010(4):74-77.
[6] 丁鵬飛,法林.STM32F205 VB 在遠(yuǎn)程系統(tǒng)升級(jí)中的應(yīng)用[J].自動(dòng)化儀表,2014(5):80-83.
[7] tbdoer HEX文件編碼格式解析[EB/OL].http://wenku.baidu.com 2015.11.
[8] 孫啟富,孫運(yùn)強(qiáng),姚愛琴.基于STM32的通用智能儀表設(shè)計(jì)與應(yīng)用[J].儀表技術(shù)與傳感器,2010(10):34-36.
Realization of Remote Upgrade of Monitoring Terminal Program Code Based on STM32 MCU
LI Yong,LI Fu-ling
(1.Schoolofmechanical-electricalengineering,NorthChinaInstituteofScienceandTechnology,Yanjiao, 101601,China;2.Schoolofcomputerengineering,NorthChinaInstituteofScienceandTechnology,Yanjiao, 101601,China)
This paper presents the monitoring terminal program code realization method of remote upgrade, the terminal to STM32F103 Series MCU as the core by CAN bus as the communication network; the whole system including monitoring terminal and server; in the monitoring terminal design, monitor the terminal program divided into the start control program BOOT_APP and main application MAIN_APP; server send the updates to the monitoring terminal by network, so as to realize the monitoring terminal program online updates, application of this monitoring terminal program to the remote upgrading method, low operation cost of the monitoring terminal, improving the scope of application of the monitoring terminal.
STM32F103 MCU; remote upgrade; HEX file; MDK-ARM; Visual Basic
2016-03-19
中央高?;究蒲袠I(yè)務(wù)費(fèi)資助(3142015095)
李永(1972-),男,河北徐水人,碩士,華北科技學(xué)院機(jī)電工程學(xué)院副教授,研究方向:電力系統(tǒng)自動(dòng)化。E_mail:liyong@ncist.edu.cn
TP277
A
1672-7169(2016)03-0072-05