孫曉曄1,2,王程2,3,成彬2,3
?。ǎ保仪f開發(fā)區(qū)冀科雙實(shí)科技有限公司,河北 石家莊 050081,;2. 河北省科學(xué)院應(yīng)用數(shù)學(xué)研究所,,河北 石家莊 050081; 3.河北省信息安全認(rèn)證工程技術(shù)研究中心,河北 石家莊 050081)
摘要:針對(duì)嵌入式產(chǎn)品分布廣,、位置分散,、維護(hù)升級(jí)困難的問題,提出了一種基于TFTP協(xié)議的STM32軟件升級(jí)系統(tǒng)的設(shè)計(jì)方案,。該系統(tǒng)主要由STM32F407微控制器,、LAN8720A網(wǎng)卡芯片和外擴(kuò)存儲(chǔ)器W25Q128、IS62WV51216組成,,采用IAP技術(shù)和以太網(wǎng)TFTP協(xié)議來更新無操作系統(tǒng)環(huán)境下STM32微控制器的軟件,。經(jīng)測(cè)試,該系統(tǒng)能夠保證升級(jí)文件數(shù)據(jù)的正確傳輸和可靠存儲(chǔ),,大大降低了嵌入式系統(tǒng)軟件升級(jí)的難度,,減少了人工維護(hù)的成本。
關(guān)鍵詞:嵌入式微控制器,;在應(yīng)用編程,;以太網(wǎng);簡(jiǎn)單文件傳輸協(xié)議
0引言
隨著嵌入式技術(shù)以及32位嵌入式微處理器的發(fā)展,,嵌入式系統(tǒng)的應(yīng)用日益廣泛,,嵌入式產(chǎn)品與人們的生產(chǎn),、生活結(jié)合得越來越緊密。然而,,嵌入式系統(tǒng)的設(shè)計(jì)不可能一步到位,,尤其是嵌入式軟件,需要不斷修改和完善,。當(dāng)程序出錯(cuò)或用戶需求變更時(shí),,傳統(tǒng)的方法是安排技術(shù)人員到現(xiàn)場(chǎng)或?qū)⒃O(shè)備回收對(duì)控制器芯片重新編程。這種方式費(fèi)時(shí)費(fèi)力,,效率低下[1],。采用IAP(In-Application Programming)技術(shù)則可以免除拆卸設(shè)備、燒錄MCU(Microcontroller Unit)等繁瑣的過程,。IAP即“在應(yīng)用中編程”,,是指產(chǎn)品發(fā)布后在運(yùn)行過程中通過預(yù)留的通信接口(如USART、I2C,、CAN,、USB、以太網(wǎng)接口等)對(duì)微控制器MCU中的軟件進(jìn)行更新升級(jí),。
支持IAP技術(shù)的首要前提是微控制器必須基于可重復(fù)編程的閃存,。STM32微控制器帶有可編程的內(nèi)置閃存,擁有在數(shù)量上和種類上都非常豐富的外設(shè)通信接口,,因此在STM32上實(shí)現(xiàn)IAP技術(shù)是完全可行的[2],。本文針對(duì)STM32F407型號(hào)的微控制器,基于TFTP(Trivial File Transfer Protocol)協(xié)議通過網(wǎng)口實(shí)現(xiàn)IAP,可以大大節(jié)省維護(hù)升級(jí)成本, 更方便快捷[3],。
1IAP工作原理
在實(shí)現(xiàn)IAP功能時(shí),,MCU內(nèi)部需要有兩塊存儲(chǔ)區(qū),BOOT區(qū)和常態(tài)存儲(chǔ)區(qū),。MCU上電先運(yùn)行BOOT區(qū)代碼,,檢測(cè)是否需要更新軟件,如果不需要更新,,程序指針跳到常態(tài)存儲(chǔ)區(qū),,開始執(zhí)行放在常態(tài)存儲(chǔ)區(qū)的內(nèi)容;如果需要更新,,則先通過外設(shè)通信接口接收新的程序代碼,,對(duì)常態(tài)存儲(chǔ)區(qū)的內(nèi)容進(jìn)行改寫,然后再跳轉(zhuǎn)執(zhí)行新寫入的程序[4],。
相應(yīng)的,,軟件程序代碼也分為兩部分:存放在BOOT區(qū)的BootLoader程序和存放在常態(tài)存儲(chǔ)區(qū)的APP程序。BootLoader程序負(fù)責(zé)通過某種通信方式(如USB,、USART等)接收程序或數(shù)據(jù),,執(zhí)行對(duì)APP程序的更新,。 APP程序才是真正的功能代碼,完成嵌入式系統(tǒng)需要的各種業(yè)務(wù)功能,。 BootLoader程序必須通過JTAG(Joint Test Action Group)編程方式或ISP(InSystem Programming)方式燒入,,APP程序可以和BootLoader程序一起燒入,,也可以通過BootLoader程序的IAP功能燒入,。
2系統(tǒng)硬件設(shè)計(jì)
系統(tǒng)硬件電路主要介紹以太網(wǎng)接口電路的設(shè)計(jì)。 STM32F407自帶MAC控制器,,只需外接PHY芯片就可以完成以太網(wǎng)通信,。PHY芯片選用LAN8720A,內(nèi)置10BASET/100BASETX全雙工傳輸模塊,,支持10 Mb/s和100 Mb/s數(shù)據(jù)傳輸,。STM32F407采用RMII接口與LAN8720A連接, RMII減少了10/100 Mb/s下微控制器以太網(wǎng)外設(shè)與外部PHY間的引腳數(shù),,僅需10根線連接即可[4],。RMII和PHY共用的參考時(shí)鐘必須是50 MHz,且必須由外部提供,,如有源晶振或STM32F4的MCO輸出,。這里,LAN8720A外接25 MHz石英晶振,,通過內(nèi)部倍頻到50 MHz,,給STM32F407的RMII提供50 MHz參考時(shí)鐘,輸出參考時(shí)鐘給MAC控制器,,這樣可以降低BOM(Bill of Material)成本[5],。
3系統(tǒng)軟件設(shè)計(jì)
本系統(tǒng)中PHY層芯片LAN8720A相當(dāng)于物理層,STM32F407自帶的MAC層相當(dāng)于數(shù)據(jù)鏈路層,,而移植的LWIP提供的就是網(wǎng)絡(luò)層,、傳輸層的功能,應(yīng)用層需要用戶根據(jù)具體功能去實(shí)現(xiàn),,即BootLoader和APP程序,。
STM32F407的內(nèi)部閃存地址起始于0x8000000,一般情況下,, BootLoader代碼就從該地址開始存放,,APP程序存放在Flash中剩余的空間,并且偏移量為0x200的倍數(shù),。
3.1BootLoader程序
BootLoader程序主要完成系統(tǒng)初始化,、TFTP數(shù)據(jù)通信、更新Flash存儲(chǔ)區(qū)內(nèi)容和執(zhí)行程序的跳轉(zhuǎn)等功能[6],。其工作流程如圖1所示,。
系統(tǒng)初始化主要完成外部總線控制器的初始化,、堆棧的初始化、定時(shí)器配置和LAN8720A網(wǎng)卡芯片的初始化,、LWIP內(nèi)核初始化等操作,。之后,通過監(jiān)測(cè)外部按鍵,,判斷是否進(jìn)入IAP模式進(jìn)行升級(jí),,若超時(shí),則跳轉(zhuǎn)到常態(tài)存儲(chǔ)區(qū),,執(zhí)行原來的APP程序[78],。
升級(jí)過程中文件的傳送采用TFTP協(xié)議。TFTP是一個(gè)工作在UDP頂層的簡(jiǎn)單文件傳輸協(xié)議,,基于C/S結(jié)構(gòu),。一個(gè)TFTP客戶端向TFTP服務(wù)器發(fā)起一個(gè)文件傳輸請(qǐng)求,服務(wù)器響應(yīng)請(qǐng)求,,文件傳輸開始,。數(shù)據(jù)以固定尺寸(本系統(tǒng)采用512 B)的幀進(jìn)行傳輸。在下一個(gè)數(shù)據(jù)幀傳輸前,,接收方必須對(duì)剛剛收到的數(shù)據(jù)幀進(jìn)行回應(yīng),。如果接收到的數(shù)據(jù)幀大小小于指定的數(shù)據(jù)幀大小,說明當(dāng)前傳輸?shù)臄?shù)據(jù)幀是最后一個(gè)數(shù)據(jù)幀,,傳輸結(jié)束,。這里PC機(jī)作為客戶端,嵌入式平臺(tái)實(shí)現(xiàn)TFTP服務(wù)器,,TFTP服務(wù)器響應(yīng)PC TFTP客戶端發(fā)送的寫文件請(qǐng)求,。由于TFTP基于不可靠的UDP協(xié)議, 因此,在程序中添加能夠保證數(shù)據(jù)有效傳輸?shù)臋C(jī)制來及時(shí)處理數(shù)據(jù)丟失的情況。在接收到每個(gè)以太網(wǎng)數(shù)據(jù)幀后進(jìn)行CRC校驗(yàn),,如果有錯(cuò)誤則通知客戶端重新發(fā)送該數(shù)據(jù)幀, 這樣能有效提高程序更新的可靠性,。
3.2APP程序
APP程序的生成需注意以下幾點(diǎn):
(1)起始地址和存儲(chǔ)空間大小設(shè)置;
(2)中斷向量表偏移量設(shè)置,;
(3)生成.bin文件,,用于IAP更新。MDK開發(fā)工具默認(rèn)生成的文件是.hex,,但利用IAP寫入的程序文件不能是.hex格式,,可利用MDK自帶的格式轉(zhuǎn)換工具fromelf.exe轉(zhuǎn)換成.bin文件。
3.3系統(tǒng)軟件設(shè)計(jì)需注意的問題
系統(tǒng)在軟件設(shè)計(jì)中需注意以下幾點(diǎn):
(1)存儲(chǔ)空間的分配,。Boot區(qū)和常態(tài)存儲(chǔ)區(qū)的大小可以根據(jù)應(yīng)用的具體情況人為分配,,但分配時(shí)盡可能使常態(tài)存儲(chǔ)區(qū)最大化,為以后程序的升級(jí)留出余量。
(2)BootLoader代碼設(shè)計(jì)時(shí)應(yīng)盡量簡(jiǎn)潔,,避免使用中斷,、復(fù)雜的底層驅(qū)動(dòng)及算法。
(3)BootLoader代碼在使用外設(shè)后,,啟動(dòng)APP代碼之前一定要先初始化該外設(shè),,即要讓APP代碼認(rèn)為MCU只是剛上電運(yùn)行,而不是跑完一個(gè)系統(tǒng)再調(diào)用自己,。如果BootLoader代碼沒有執(zhí)行該動(dòng)作,,當(dāng)APP代碼運(yùn)行時(shí),MCU的外設(shè)處于不確定狀態(tài)(尤其是中斷未關(guān)閉),,可能會(huì)帶來一些預(yù)料不到的錯(cuò)誤,。
(4)數(shù)據(jù)通信過程中, 向STM32發(fā)送程序文件時(shí)需考慮STM32對(duì)Flash的寫入速度,,保證每次傳送的數(shù)據(jù)包都能正確寫入,。
(5)傳輸過程中,,升級(jí)文件分段傳送,,可能存在數(shù)據(jù)丟失,、網(wǎng)絡(luò)不穩(wěn)定等現(xiàn)象,。對(duì)每段數(shù)據(jù)編號(hào),,根據(jù)編號(hào)判斷是否有數(shù)據(jù)包丟失,,并增加CRC校驗(yàn),,保證每段數(shù)據(jù)傳輸?shù)恼_性。對(duì)于錯(cuò)誤或丟失的數(shù)據(jù)包,采取重傳機(jī)制,,提高IAP的成功率[9],。
4結(jié)論
本文對(duì)基于TFTP協(xié)議的STM32軟件更新進(jìn)行了研究,充分利用以太網(wǎng)的傳輸能力和便捷性,,設(shè)計(jì)并實(shí)現(xiàn)了IAP升級(jí)系統(tǒng),。通過實(shí)驗(yàn)測(cè)試,基于TFTP 協(xié)議的STM32軟件遠(yuǎn)程升級(jí)系統(tǒng)能夠保證數(shù)據(jù)的正確傳輸和存儲(chǔ),,大大降低了對(duì)嵌入式系統(tǒng)軟件的升級(jí)維護(hù)難度,,應(yīng)用廣泛。
參考文獻(xiàn)
?。?] 溫世堅(jiān),張偉波.基于STM32的遠(yuǎn)程升級(jí)系統(tǒng)的設(shè)計(jì)[J].科技廣場(chǎng),2013,26(5):97100.
?。?] 李興鶴,蔡亮,,宋吉波,,等.STM32用戶基于IAP的程序更新技術(shù)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2012,12(1):7475.
[3] 王程,周安琳.基于Autofac對(duì)乳制品安全風(fēng)險(xiǎn)預(yù)警系統(tǒng)的擴(kuò)展設(shè)計(jì)[J]. 河北省科學(xué)院學(xué)報(bào),2013,30(1):14,,14.
?。?] 李婉婉,李宏.單片機(jī)IAP升級(jí)方法在血液分析儀中的應(yīng)用[J]. 微型機(jī)與應(yīng)用,2014,33(21):1618.
?。?] 王娜,成彬,郝友帥.水流量遠(yuǎn)程智能監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 河北省科學(xué)院學(xué)報(bào),2011,28(2):3439.
?。?] 武輝林.模數(shù)轉(zhuǎn)換器AD7791及其應(yīng)用格式[J].河北省科學(xué)院學(xué)報(bào), 2011,28(2):2629.
?。?] 李俊,王金海.基于TFTP協(xié)議的ARM軟件遠(yuǎn)程更新系統(tǒng)[J].工礦自動(dòng)化,,2010,,37(7):2225.
[8] 游侃民.嵌入式系統(tǒng)網(wǎng)絡(luò)化BOOTLOADER的設(shè)計(jì)與實(shí)現(xiàn)[D].廣州:華南理工大學(xué),2010.
?。?] 許青青.一種輕量級(jí)Bootloader(LWBL)的設(shè)計(jì)與實(shí)現(xiàn)[D].上海:華東師范大學(xué),2012.