《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于自編程功能的MCU Bootloader設(shè)計(jì)
基于自編程功能的MCU Bootloader設(shè)計(jì)
電子設(shè)計(jì)工程
陳 曦 鄭貴林
摘要: 基于自編程功能的MCUBootloader設(shè)計(jì),Bootloader是微處理器上電時(shí)運(yùn)行的第一段代碼,它可以通過(guò)通信接口實(shí)現(xiàn)對(duì)微處理器內(nèi)部應(yīng)用程序的更新升級(jí),為網(wǎng)絡(luò)化嵌入式產(chǎn)品的應(yīng)用程序升級(jí)帶來(lái)極大的便利。由于目前沒(méi)有統(tǒng)一嵌入式系統(tǒng)的Bootloader。基于NEC78K0系列單片機(jī)自編程原理,設(shè)計(jì)出一個(gè)適用于78K0/Fx2系列單片機(jī)的Bootloader,并能夠通過(guò)單片機(jī)串口在線升級(jí)應(yīng)用程序。
Abstract:
Key words :

     Bootloader" title="Bootloader">Bootloader是在單片機(jī)上電啟動(dòng)時(shí)執(zhí)行的一小段程序。也稱作固件,通過(guò)這段程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用應(yīng)用程序準(zhǔn)備好正確的環(huán)境。
    Boot代碼由MCU啟動(dòng)時(shí)執(zhí)行的指令組成。這里的loader指向MCU的Flash中寫入新的應(yīng)用程序。因此,Bootloader是依賴于特定的硬件而實(shí)現(xiàn)的,因此,在眾多嵌入式產(chǎn)品中目前還不可能實(shí)現(xiàn)通用Bootloader。
    Bootloader的最大優(yōu)點(diǎn)是:在不需要外部編程器的情況下,對(duì)嵌入式產(chǎn)品的應(yīng)用代碼進(jìn)行更新升級(jí)。它使得通過(guò)局域網(wǎng)或者Intemet遠(yuǎn)程更新程序成為可能。例如,如果有5 000個(gè)基于MCU的電能表應(yīng)用程序需要更新,電能表制造商的技術(shù)人員就可以避免從事對(duì)每一個(gè)電能表重新編程的巨大工作量,通過(guò)使用Bootloader的功能,由控制中心通過(guò)電能表抄表系統(tǒng)網(wǎng)絡(luò),遠(yuǎn)程對(duì)5 000個(gè)電表重新編程??梢?jiàn),Bootloader功能對(duì)于嵌入式系統(tǒng)的廣泛應(yīng)用具有十分重要的意義。

1 78K0" title="78K0">78K0/Fx2系列單片機(jī)簡(jiǎn)介
   
78K0/Fx2系列是帶CAN控制器的8位單片機(jī),該系列單片機(jī)廣泛應(yīng)用于汽車電子,智能儀表等領(lǐng)域。其內(nèi)置POC(可編程上電清零電路)/LVI(可編程低電壓指示器),單電壓自編程" title="自編程">自編程閃存,引導(dǎo)交換功能(閃存安全保護(hù)),具有低功耗、寬電壓范圍、超高抗干擾等性能。
    78K0系列單片機(jī)支持自編程(Self-programming)。所謂自編程,是指用Flash存儲(chǔ)器中的駐留的軟件或程序?qū)lash存儲(chǔ)器進(jìn)行擦除/編程的方法。通過(guò)單片機(jī)的自編程功能,可以設(shè)計(jì)Bootloader程序,通過(guò)串口等通信接口實(shí)現(xiàn)對(duì)產(chǎn)品重新編程、在線升級(jí)的功能。
    以μPD78F0881為例。μPD78F0881為78KO/Fx2系列中的一款44管腳單片機(jī),內(nèi)置32 KB Flash ROM,2 KB RAM,自帶2個(gè)串行通信接口。其內(nèi)部Flash結(jié)構(gòu)如圖1所示。為了方便實(shí)現(xiàn)擦除和編程,人為地將整個(gè)Flash分成若干個(gè)block,每個(gè)block大小為1 KB。block為自編程庫(kù)函數(shù)中空白檢測(cè)、擦除、校驗(yàn)的最小單位。blockO從地址0000H開始,程序都從0000H開始執(zhí)行。block0~block3共4 KB存儲(chǔ)空間為Bootloader程序存儲(chǔ)區(qū)域。block4~block31為應(yīng)用程序存儲(chǔ)區(qū)域。


    為了防止Bootloader自身的升級(jí)失敗,設(shè)計(jì)了引導(dǎo)交換功能。該功能定義2個(gè)簇,即Boot cluster0和Boot cluster1。Boot clustee0為block0~block3的4 KB存儲(chǔ)空間,Boot cluster1為block4~block7的4 KB存儲(chǔ)空間。因此,實(shí)際運(yùn)用過(guò)程中,一般把應(yīng)用程序的開始定義在2000H,也就是從block8開始。
    Flash地址為0000H~FFFFH。7FFFFH~FFFFH存儲(chǔ)空間為保留區(qū)域以及特殊功能寄存器區(qū)域等,用戶無(wú)法對(duì)其進(jìn)行編程。

2 自編程
2.1 自編程環(huán)境
2.1.1 硬件環(huán)境

    FLMDO引腳是78KO/Fx2系列單片機(jī)為Flash編程模式設(shè)置的,用于控制MCU進(jìn)入編程模式。在通常操作情況下,F(xiàn)LMDO引腳下拉到地。要進(jìn)入自編程模式,必須使FLMDO引腳置成高電平。因此,通過(guò)一個(gè)普通I/O接口控制FLMD0引腳的電平。如圖2所示。


2.1.2 軟件環(huán)境
   
1)使用通用寄存器bank3,自編程庫(kù)函數(shù),需要調(diào)用通用寄存器bank3。因此,在自編程時(shí),不能對(duì)通用寄存器bank3操作。
    2)使用100 B RAM(入口RAM)作為隱藏ROM中函數(shù)的工作區(qū),入口RAM,是Flash存儲(chǔ)器自編程樣例庫(kù)所使用的RAM區(qū)域。用戶程序需要保留著塊區(qū)域,當(dāng)調(diào)用庫(kù)時(shí),需要指定這片區(qū)域的起始地址。入口RAM地址可以指定在FB00h~FE20h之間。
    3)4~256 B RAM作為數(shù)據(jù)緩沖區(qū),必須是FE20H~FE83H以外的內(nèi)部高速RAM區(qū)域。
    4)最大39 B RAM作為隱藏ROM函數(shù)的堆棧。
    5)隱藏ROM中的函數(shù)被0000H~7FFFH中的應(yīng)用程序調(diào)用。
2.2 自編程流程
   
自編程功能利用自編程軟件庫(kù)完成用戶程序?qū)lash內(nèi)容的重新編程。如果在自編程的過(guò)程中有中斷發(fā)生,那么自編程將暫停來(lái)響應(yīng)中斷。中斷結(jié)束,自編程模式恢復(fù)后,自編程過(guò)程將繼續(xù)進(jìn)行。采用匯編語(yǔ)言編寫78K0/Fx2自編程軟件庫(kù),如表1所示。


    自編程操作流程如圖3所示,當(dāng)單片機(jī)收到自編程執(zhí)行信號(hào)時(shí),開始進(jìn)入自編程模式。將FLMDO引腳設(shè)置成高電平,初始化入口RAM,為自編程庫(kù)函數(shù)開辟空間。當(dāng)確認(rèn)FLMD0為自編程狀態(tài)時(shí),開始檢查需要編程區(qū)域是否為空白區(qū)域。當(dāng)被編程區(qū)域不是空白區(qū)域時(shí),先將其擦除,然后在此區(qū)域進(jìn)行編程。編程結(jié)束后進(jìn)行校驗(yàn)。若校驗(yàn)無(wú)誤,則將FLMDO引腳設(shè)置成低電平,退出自編程模式。



3 引導(dǎo)交換(boot swap)
   
產(chǎn)品程序的升級(jí)包括應(yīng)用程序的升級(jí)和引導(dǎo)程序(Bootloader自身)的升級(jí)。為了防止引導(dǎo)程序在升級(jí)的過(guò)程中發(fā)生錯(cuò)誤,從而導(dǎo)致MCU無(wú)法啟動(dòng),設(shè)計(jì)了引導(dǎo)交換功能。以圖4說(shuō)明引導(dǎo)交換的實(shí)現(xiàn)過(guò)程。


    1)舊的Boot程序首先將新的Boot程序編程到交換引導(dǎo)簇1(Boot cluster 1),然后設(shè)置啟動(dòng)交換標(biāo)志位,并強(qiáng)迫看門狗復(fù)位。
    2)復(fù)位啟動(dòng)后,MCU看到交換標(biāo)志位,便從交換引導(dǎo)簇1處開始啟動(dòng)。交換引導(dǎo)簇1處的新Boot程序?qū)z查交換標(biāo)志位。如果交換標(biāo)志位被置1,則新的Boot程序?qū)⒉脸粨Q引導(dǎo)簇0(Boot cluster 0)區(qū)域,并將自身復(fù)制到交換引導(dǎo)簇O,然后將交換標(biāo)志位清零,強(qiáng)迫看門狗復(fù)位。
    3)復(fù)位啟動(dòng)后,MCU看到交換標(biāo)志位被清零。又從交換引導(dǎo)簇0處開始執(zhí)行。這樣就完成了boot程序自身的升級(jí)。即使在升級(jí)過(guò)程中遇到斷電等異常情況,在重新上電后也能重新完成Boot程序升級(jí)。有效地防止在升級(jí)過(guò)程中出現(xiàn)斷電等等異常情況而導(dǎo)致升級(jí)失敗,MCU無(wú)法啟動(dòng)的問(wèn)題,使Boot程序的升級(jí)變得安全可靠。

4 Bootloadler設(shè)計(jì)
4.1 簡(jiǎn)單的Bootloader
   
一個(gè)簡(jiǎn)單的Bootload包括5個(gè)元素。
    1)啟動(dòng) Bootloader的信號(hào)  Bootloader程序是在執(zhí)行應(yīng)用程序之前所執(zhí)行的一小段程序,當(dāng)Bootloader程序把控制權(quán)轉(zhuǎn)交給應(yīng)用程序后,在MCU復(fù)位前,Bootloader程序?qū)⒉辉賵?zhí)行。因此,需要產(chǎn)生一個(gè)信號(hào)觸發(fā)MCU開始Bootloader程序。該信號(hào)可以是中斷,也可以通過(guò)串口傳送的一條指令,或者是別的程序觸發(fā)的信號(hào)。
    2)執(zhí)行 Bootloader的信號(hào)  單片機(jī)程序啟動(dòng)時(shí),MCU是裝載新的應(yīng)用程序還是執(zhí)行已經(jīng)存在的程序取決于外部信號(hào)。該信號(hào)可以是上電時(shí)的一個(gè)端口信號(hào),用來(lái)控制MCU裝載新程序還是執(zhí)行舊程序,也可以是從串口接收到的指令等。
    3)將新的代碼傳送給MCU  通過(guò)RS485、I2C、CAN或者USB傳送新的應(yīng)用程序數(shù)據(jù)。因?yàn)橐獋魉偷拇a一般會(huì)超過(guò)MCU的RAM容量,因此需要一些控制數(shù)據(jù)流量的措施。一般使用XON/XOFF軟件握手協(xié)議,傳送代碼的格式一般選擇Intel hex格式。
    4)Flash新代碼的自動(dòng)編程  每次MCU接收到一批新的數(shù)據(jù),就要將其編程到正確的Flash地址。如果該地址非空白,MCU在編程前必須先擦除。一般在編程中或者編程后還需要檢查存儲(chǔ)器的內(nèi)容。
    5)將控制權(quán)轉(zhuǎn)移給有效的應(yīng)用程序  在接收和編程了新的代碼后,Bootloader寫一個(gè)校驗(yàn)和或者其他唯一字節(jié)序列到一個(gè)固定的存儲(chǔ)單元。Bootloader檢測(cè)該值,如果該值存在,Bootloader就將控制權(quán)傳給應(yīng)用程序。
4.2 Intelhex格式
   
在線升級(jí)的程序代碼采用編譯器輸出的Intel hex格式文件。Intel hex文件常用來(lái)保存單片機(jī)或其他微處理器的程序代碼。它保存物理程序存儲(chǔ)區(qū)中的目標(biāo)代碼映象。一般的編程器都支持這種格式。Intel hex文件記錄中的數(shù)字都是十六進(jìn)制格式。在InteI hex文件中,每一行包含一個(gè)HEX記錄。Intel hex文件通常用于傳輸將被存于Flash或者EEPROM中的程序和數(shù)據(jù)。Intel hex由任意數(shù)量的十六進(jìn)制記錄組成。每個(gè)記錄包含5個(gè)域,它們按照?qǐng)D5所示格式排列。


    每一個(gè)部分至少由2個(gè)十六進(jìn)制編碼字符組成。它們構(gòu)成1個(gè)字節(jié)。每一個(gè)部分的意義如下所述:
    1)每個(gè)Intel hex記錄都由冒號(hào)開頭,自編程的過(guò)程中以此判斷一個(gè)Intel hex記錄的開始。
    2)數(shù)據(jù)長(zhǎng)度代表當(dāng)前記錄中數(shù)據(jù)字節(jié)的數(shù)量。
    3)地址代表當(dāng)前記錄中數(shù)據(jù)在存儲(chǔ)區(qū)域中的起始地址。
    4)HEX記錄類型有如下4種:00-數(shù)據(jù)記錄;01-文件結(jié)束記錄;02-擴(kuò)展段地址記錄;03-轉(zhuǎn)移地址記錄。NEC編譯器輸出的Intel hex文件中。只包含數(shù)據(jù)類型00和01。其中O1作為自編程過(guò)程中數(shù)據(jù)結(jié)束的判定標(biāo)志。
    5)數(shù)據(jù)域分用于存儲(chǔ)需要寫入Flash中的內(nèi)容,一個(gè)記錄可以有許多數(shù)據(jù)字節(jié)。記錄中的數(shù)據(jù)字節(jié)數(shù)量必須與數(shù)據(jù)長(zhǎng)度中的值相符。
    6)校驗(yàn)和是取記錄中從數(shù)據(jù)長(zhǎng)度到數(shù)據(jù)域最后一個(gè)字節(jié)的所有字節(jié)總和的2的補(bǔ)碼。
    根據(jù)以上說(shuō)明,必須在程序中對(duì)接收到的Inter hex文件進(jìn)行解碼,獲取數(shù)據(jù)以及數(shù)據(jù)地址,并對(duì)收到的數(shù)據(jù)進(jìn)行校驗(yàn),然后將接收正確的數(shù)據(jù)編程到Flash相應(yīng)的地址上。
4.3 Bootloader設(shè)計(jì)思路
   
單片機(jī)收到啟動(dòng)信號(hào)后,重新啟動(dòng)程序。啟動(dòng)的時(shí)候首先執(zhí)行Boot代碼,Boot代碼檢查是否收到執(zhí)行升級(jí)信號(hào)。如果需要升級(jí)程序,則通過(guò)串口或者其他通信接口接收新的應(yīng)用程序,loader程序向單片機(jī)Flash中寫入新的應(yīng)用程序代碼。最后通過(guò)檢查校驗(yàn)位檢測(cè)程序是否有效。如果有效,則Bootloader將CPUMCU控制權(quán)交給應(yīng)用程序。整個(gè)升級(jí)過(guò)程完成。Bootloader執(zhí)行過(guò)程如圖6所示。


    需要注意的是Bootloader自身的更新和應(yīng)用程序的更新還需區(qū)別處理。通過(guò)辨別接收到數(shù)據(jù)的編程地址來(lái)判斷是Bootloader更新還是應(yīng)用程序更新。若編程地址從0000H開始,則為Bootloader更新。Bootloader更新則需要執(zhí)行引導(dǎo)交換(boot swap)功能;若為應(yīng)用程序更新,自編程結(jié)束后,直接將CPU交給應(yīng)用程序。

5 結(jié)束語(yǔ)
     
本文探討了78KO/FC2系列μPD78F0881單片機(jī)的自編程功能以及Bootloader的設(shè)計(jì)方法。具體描述了通過(guò)單片機(jī)串口對(duì)相應(yīng)的應(yīng)用程序通過(guò)Bootloader進(jìn)行升級(jí)。此版本的Bootloader使用晶振20 MHz,通過(guò)串口Uart60,設(shè)置波特率為115 200,在μPD78F0881單片機(jī)上成功實(shí)現(xiàn)了用戶應(yīng)用程序的升級(jí)更新。在接下來(lái)的工作中,Bootloader的設(shè)計(jì)應(yīng)當(dāng)面向更多的通信接口。例如,通過(guò)CAN總線接口升級(jí),通過(guò)USB接口升級(jí)等等。Bootloader技術(shù)的開發(fā)和廣泛應(yīng)用,必將成為嵌入式產(chǎn)品開發(fā)的重要部分,為網(wǎng)絡(luò)化產(chǎn)品的應(yīng)用和開發(fā),特別是后期維護(hù)、升級(jí)帶來(lái)極大的便利。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲男女毛片无遮挡| 亚洲精品国产精品乱码不99| 亚洲第一狼人社区| 国产欧美在线观看| 国产精品久久毛片a| 欧美日韩免费高清一区色橹橹| 免费观看一区| 鲁大师影院一区二区三区| 久久精品成人一区二区三区| 亚洲欧美国产另类| 亚洲欧美不卡| 亚洲欧美在线一区二区| 亚洲资源av| 亚洲一区在线播放| 中文精品视频| 亚洲自拍16p| 午夜亚洲精品| 欧美亚洲综合久久| 欧美在线你懂的| 欧美综合二区| 久久精品女人| 久久久久久久久久久久久9999 | 久久美女性网| 麻豆精品精华液| 欧美激情视频在线免费观看 欧美视频免费一| 免费久久99精品国产| 欧美激情第一页xxx| 欧美片在线观看| 欧美视频在线播放| 国产精品欧美久久久久无广告| 国产精品网站一区| 国产主播在线一区| 亚洲第一毛片| 亚洲另类春色国产| 亚洲一区二区三区中文字幕在线 | 欧美在线综合视频| 最新高清无码专区| 亚洲香蕉在线观看| 久久不射电影网| 蜜臀av性久久久久蜜臀aⅴ| 欧美激情自拍| 国产精品第一区| 国产欧美一区二区三区久久人妖| 好看的日韩视频| 亚洲国产91| aa国产精品| 校园激情久久| 亚洲精品免费一区二区三区| 亚洲视频在线观看| 欧美一区激情视频在线观看| 久久一区国产| 欧美日韩亚洲视频一区| 国产欧美日韩麻豆91| 在线观看不卡av| 一区二区三区欧美日韩| 欧美亚洲日本一区| 99pao成人国产永久免费视频| 午夜亚洲福利| 欧美精品成人| 国产午夜精品一区二区三区视频| 亚洲狠狠丁香婷婷综合久久久| 宅男精品视频| 亚洲人体一区| 午夜在线一区| 欧美激情1区| 国产精品一区二区三区四区| 亚洲国产精品久久精品怡红院| 在线一区免费观看| 亚洲三级网站| 久久精品国内一区二区三区| 欧美激情小视频| 国产一区二区三区免费在线观看| 日韩视频中文字幕| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲一区二区三区中文字幕在线| 美女视频黄a大片欧美| 国产精品久久久久999| 在线精品亚洲| 香蕉av777xxx色综合一区| 亚洲视频免费观看| 你懂的网址国产 欧美| 国产欧美 在线欧美| 亚洲精品亚洲人成人网| 亚洲高清123| 欧美一区二区三区免费大片| 欧美日韩一级黄| 最近中文字幕日韩精品| 久久精品色图| 久久成人免费视频| 国产精品久久一区主播| 亚洲精品国产精品久久清纯直播| 亚洲第一区在线| 欧美一区二区观看视频| 欧美日韩在线播放三区四区| 亚洲福利在线视频| 亚洲国产精品成人精品| 欧美综合激情网| 国产精品老牛| 一区二区三欧美| 国产精品99久久久久久有的能看| 麻豆精品精华液| 好吊妞这里只有精品| 欧美在线1区| 久久精品理论片| 国产色产综合产在线视频| 亚洲香蕉网站| 亚洲欧美另类中文字幕| 国产精品igao视频网网址不卡日韩| 亚洲激情av| 亚洲美女在线国产| 欧美激情91| 亚洲国产一区二区三区在线播| 亚洲国产成人一区| 久久久久久黄| 国内精品免费在线观看| 性感少妇一区| 久久九九国产| 国产一区二区三区在线免费观看| 午夜一区二区三视频在线观看| 亚洲一区二区三区视频播放| 国产精品第一页第二页第三页| 日韩系列欧美系列| 亚洲一区二区黄| 欧美视频第二页| 中文欧美在线视频| 性久久久久久| 国产日韩亚洲| 久久国产夜色精品鲁鲁99| 久久欧美肥婆一二区| 激情av一区| 最新国产の精品合集bt伙计| 欧美电影在线观看完整版| 最新国产精品拍自在线播放| 一本色道久久综合亚洲91| 欧美日韩一区高清| 一区二区高清视频在线观看| 亚洲欧美区自拍先锋| 国产女人aaa级久久久级| 久久激情综合| 欧美国产91| av成人老司机| 性欧美大战久久久久久久久| 国产一二三精品| 亚洲人成绝费网站色www| 欧美巨乳波霸| 亚洲一二区在线| 久久久久国产精品一区二区| 伊人精品久久久久7777| 亚洲精品中文字幕有码专区| 欧美日韩一区在线观看视频| 亚洲砖区区免费| 久久青草欧美一区二区三区| 最新日韩在线| 亚洲欧美激情四射在线日 | 久久久精品国产99久久精品芒果| 一区二区视频在线观看| 亚洲精品少妇网址| 国产精品久久久91| 久久国产高清| 欧美理论大片| 午夜国产一区| 欧美成人高清视频| 一区二区三区www| 久久久久国产精品一区| 最新日韩在线视频| 欧美一区二区三区视频在线观看| 黄色精品免费| 亚洲一区高清| 国内精品久久久久影院 日本资源| 亚洲免费电影在线| 国产日本欧美一区二区三区在线| 亚洲精品国产精品国自产观看浪潮| 国产精品成人观看视频国产奇米| 欧美一级欧美一级在线播放| 欧美黄色片免费观看| 亚洲欧美激情在线视频| 欧美成人免费播放| 亚洲影院在线| 欧美大片在线观看一区| 亚洲一区欧美一区| 欧美激情中文字幕乱码免费| 午夜欧美大片免费观看| 欧美精品免费视频| 欧美在线一区二区| 国产精品porn| 亚洲日本va午夜在线影院| 国产精品日韩精品| 日韩视频在线一区二区| 国产深夜精品| 中文亚洲视频在线| 一区二区三区自拍| 欧美一区中文字幕| 99视频超级精品| 女仆av观看一区| 亚洲综合色在线| 欧美日韩一区二区精品| 亚洲国产精品一区二区第一页| 国产精品亚洲人在线观看| 一级成人国产| 亚洲国产91|