小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

超完整,講解單片機的BootLoader

 新用戶62592529 2023-08-20 發(fā)布于四川

對于一個復(fù)雜的單片機項目來說,有一個 BootLoader(以下簡稱BL)是非常重要的。它可以使得你的應(yīng)用程序代碼維護和升級更加便捷。

本篇文章,帶你了解為什么要設(shè)計 Bootloader,以及如何設(shè)計 Bootloader。爭取做到知其然、知其所以然。

通過對 BL 進行詳細(xì)的講解,希望讓大家可以體會到它的重要性。

1、燒錄方式的更新迭代

古老的燒錄方式
單片機誕生于20世紀(jì)80年代,以 51 為代表開始廣泛應(yīng)用于工業(yè)控制、家電等很多行業(yè)中。起初對于單片機的燒錄,也就是將可執(zhí)行的程序?qū)懭氲狡鋬?nèi)部的ROM中,不是一件容易的事情,而且成本不低,因為需要依賴于專門的燒錄設(shè)備。由于受到半導(dǎo)體技術(shù)與工藝的限制,對于ROM的燒寫大多需要高壓。這種境況一直持續(xù)到2000年左右,如圖所示。

圖片

ISP與ICP燒錄方式
隨著低壓電可擦寫ROM的成熟,單片機開始集成可通過數(shù)字電平直接讀寫的存儲介質(zhì)。
其最大的優(yōu)勢在于可實現(xiàn)在系統(tǒng)或在電路直接燒錄程序,而無需像以前一樣把單片機芯片從電路中拿出來,放到編程器上,這種燒錄方式就是 ISP(In System Programming) 或 ICP(In Circuit Programming),如圖所示。

圖片

有人問過這樣一個問題:“ISP和ICP我都聽說過,都說是可以在電路板上直接燒錄程序,而無需拿下芯片,那ISP和ICP有什么區(qū)別?”
從廣義上來說,兩者沒有區(qū)別,平時我們把其意義混淆也毫無問題。非要刨根問底的話,那可以這樣來理解:
ISP要求單片機中駐留有專門的程序,用以與上位機進行通信,接收固件數(shù)據(jù)并燒錄到自身的ROM中,很顯然ISP的單片機是需要可運行的,即要具備基本的最小系統(tǒng)電路(時鐘和復(fù)位)。
而 ICP 可以理解為 MCU 就是一塊可供外部讀寫的存儲電路,它不需要預(yù)置任何程序,也不需要單片機芯片處于可運行的狀態(tài)。
支持 ISP 或 ICP 的芯片,以AT89S51最為經(jīng)典,當(dāng)時從 AT89C51 換成 S51,多少人因此不再依賴燒錄器而大呼爽哉。這種并口下載線非常流行,如圖3.3,網(wǎng)上還有各種ISP小軟件,可以說它降低了很多人入門單片機的門檻,讓單片機變得喜聞樂見。一臺電腦、一個S51最小系統(tǒng)板、一條并口ISP下載線,齊了!

圖片

更方便的ISP燒錄方式

串口ISP
后來我們發(fā)現(xiàn)帶有并口的電腦越來越少。那是在2005年前后,STC單片機開始大量出現(xiàn),在功能上其實與S51相差無幾,甚至比同期的一些高端51單片機還要遜色。但是它憑借一個優(yōu)勢讓人們對它愛不釋手,進一步降低了單片機的學(xué)習(xí)門檻。
這個優(yōu)勢就是--串口ISP,這是真正意義上的 ISP,如圖所示。

圖片

圖片

再后來,9針串口都很少見了,只有USB。這促使一個燒錄和調(diào)試神器炙手可熱 -- USB TTL串口。這下232轉(zhuǎn)換芯片省掉了,直接通過USB進行燒錄。這種方式造福了無數(shù)的單片機學(xué)習(xí)者和工程師。
多年來,在串口與單片機的交互上,我動了很多腦筋,這也是我樂于開發(fā) Bootloader 的一個原因。我希望“USB串口在手,一切全有!”
STC 并不是第一個使用串口 ISP 燒錄程序的,但它是最成功和最深入人心的。與之同期的很多單片機,包括時至今日仍然應(yīng)用最廣泛的 STM32 全系列也都支持了串口 ISP,它成為了一種標(biāo)配的、非常普遍的程序燒錄手段。
各種USB ISP
串口ISP固然方便,但是下載速度是它的硬傷,當(dāng)固件體積比較大的時候,比如一些大型嵌入式項目的固件動輒幾百K,甚至幾M,再用串口ISP就未免太慢了。所以一些單片機配有專門的USB ISP下載器。以下列舉幾種比較主流單片機及其USB ISP下載器。
1) AVR
AVR 單片機曾經(jīng)盛極一時,但經(jīng)歷了 2016 年的缺芯風(fēng)波之后,加之 STM32 的沖擊,開始變得一蹶不振,鮮有人用了。與之配套的USB ISP下載器非常多樣,有些是官方發(fā)布的,更多的是愛好者開源項目的成果,如圖所示。

圖片

2) C8051F

圖片

3) MSP430

圖片

我們會發(fā)現(xiàn),一個具體良好生態(tài)的主流單片機,一定有配套的高效便捷的燒錄下載工具??梢娨环N好的燒錄方式,對單片機開發(fā)是多么重要。
不論是串口 ISP 還是各種專用的 ISP 下載器,都有一些共同的弊端。

1、依賴于專門的上位機或下載器硬件,不能作到統(tǒng)型;

2、下載器價格仍然比較高,尤其是原廠的,這也是為什么有些單片機催生出很多第三方的下載器,比如 AVR;
3、下載的時候通常需要附加額外的操作,比如STC要重新上電、STM32需要設(shè)置BOOT引腳電平等等。這些額外的操作都增加了燒錄的復(fù)雜性。尤其是在產(chǎn)品形態(tài)下要去重新燒錄程序,比如嵌入式升級,就要打開外殼,或?qū)⒏郊有盘栆龅綒ね?。這都是非常不高效,不友好的作法。
如果有一種燒錄方法,對于任何一種單片機:

1、通信方式統(tǒng)一(比如一律都用串口));

2、提供一個友好的操作界面(比如命令行方式);

3、高效快速,沒有附加操作,最好一鍵自動化燒錄;

4、另外再增加一些嵌入式固件管理的功能(比如固件版本管理)。

這一定會讓我們事半功倍。Bootloader 就能實現(xiàn)上述的這一切!

關(guān)于Bootloader

Bootloader的基本形態(tài)

直接看圖

圖片

可以看到BL就是一段存儲在ROM中的程序,它主要實現(xiàn)4個功能:

1、通過某種途徑獲取要燒錄的固件數(shù)據(jù);

2、將固件數(shù)據(jù)寫入到ROM的APP區(qū)中;

3、跳轉(zhuǎn)到APP區(qū)運行,將燒錄進去的用戶程序引導(dǎo)起來;

4、在此過程中,提供必要而友好的人機交互界面。
這么說可能不好理解,我們還是通過實例來進行講解。

Bootloader的兩個設(shè)計實例

下面的兩個實例,用于說明BL的實際應(yīng)用形態(tài),不涉及具體的實現(xiàn)細(xì)節(jié),旨在讓大家了解 BL 實際是如何運行的。
帶Shell命令行的串口BL

基本的操作邏輯如下:

1、通過超級終端、SecureCRT 或 Xshell 之類的串口終端輸入命令 program;

2、BL 接收到命令后,開始等待接收固件文件數(shù)據(jù);

3、串口終端通過某種文件數(shù)據(jù)傳輸協(xié)議(例如  X/Y/Zmodem協(xié)議)將固件數(shù)據(jù)傳給BL;

4、BL 將固件數(shù)據(jù)寫入到 ROM 的 APP 區(qū)中;

5、BL 將 APP 區(qū)中的程序引導(dǎo)運行起來。
更具體的示意如圖所示。

圖片

這里把操作邏輯說得很簡單,實際實現(xiàn)起來卻并不容易,我們放在后面去細(xì)究其具體實現(xiàn)。
插SD卡即燒錄的BL

基本的操作邏輯如下:

1、將待燒錄的固件拷貝到SD卡中;

2、將SD卡插入到卡槽中;

3、BL 檢測到 SD 卡插入,搜索卡中 BIN 文件;

4、將 BIN 文件數(shù)據(jù)讀出寫入到 ROM 的 APP 區(qū)中;

5、BL 將 APP 區(qū)中的程序引導(dǎo)運行起來。
如圖所示。

圖片

通過這兩個設(shè)計實例,大家應(yīng)該已經(jīng)了解BL是什么了吧。有沒有感受到 BL 是比 ISP 燒錄器更通用、更靈活、更友好、功能更強大的固件燒錄和管理手段呢?
有人可能知道 Linux 下的 Uboot,它就是一個強大的 BL,它提供非常強大的刷機(燒錄操作系統(tǒng)鏡像)的功能以及完備而靈活的Shell界面,如圖所示。其實我們電腦的BIOS也是一種廣義的BL。

圖片

那如何實現(xiàn)一個BL呢?別急,要實現(xiàn)BL是需要滿足一些基本要求的。

BL實現(xiàn)的要點

首先要說,并不是任何一個單片機都可以實現(xiàn)BL的,要滿足幾個要點。
芯片體系架構(gòu)要支持
來看圖

圖片

我們知道單片機程序的最開頭是中斷向量表,包含了程序棧頂?shù)刂芬约癛eset程序入口,通過它才能把程序運行起來。很顯然在從BL向APP跳轉(zhuǎn)的時候,APP程序必須有自己的中斷向量,并且而且單片機體系架構(gòu)上要允許中斷向量表的重定向。
傳統(tǒng)51單片機的中斷向量表只允許放到ROM開頭,而不能有偏移量,所以傳統(tǒng)51單片機是不能支持BL的。
有人要問“你這不是自相矛盾嗎?你前面說STC的51單片機是支持串口ISP的,那它應(yīng)該內(nèi)置有ISP程序,我理解它應(yīng)該和BL是一個道理?!?/span>
沒錯,它內(nèi)置的 ISP 程序就是一種 BL。STC 之所以可以實現(xiàn) BL 功能,是因為宏晶半導(dǎo)體公司對它的硬件架構(gòu)進行了改進,請看圖

圖片

可以看到,STC51 單片機多出了一塊專門存放 BL 的 ROM,稱為 BOOTROM。
網(wǎng)上有一位叫 shaoziyang 的網(wǎng)友為 AVR 單片機寫了一個 BL,還配套開發(fā)了一款叫 AVRUBD 的上位機,如圖。(AVRUBD是很有用的,它可以讓我們實現(xiàn)隔空燒錄),實現(xiàn)了AVR單片機的串口燒錄,讓很多人擺脫了對USBISP之類ISP下載器的依賴(雖然ISP下載器已經(jīng)很方便了,但它畢竟還需要銀子嘛)。

圖片

AVR 在硬件架構(gòu)上與 STC51 是一個套路,如圖所示。

圖片

通過配置AVR的熔絲位可以控制復(fù)位入口地址以及BOOT區(qū)的大小和開始地址,如圖所示。

圖片

講到這里,有人會說:“那有沒有一種單片機,程序放在ROM的任何位置都可以運行起來,也就是中斷向量表可以重定位?”
當(dāng)然有,這種單片機還很多,其中最典型的就是 STM32。它的程序之所以可以放之各地皆可運行,是因為在它的 NVIC 控制器中提供了中斷向量表偏移量的相關(guān)配置,這個后面我們再詳細(xì)說。
ROM 要支持 IAP
這也是需要單片機硬件支持的。很好理解,在 BL 獲取到固件數(shù)據(jù)之后,需要將它寫入到 ROM 的 APP 區(qū)中,所以說單片機需要支持 IAP 操作,所謂 IAP 就是 In Application Programming,即在應(yīng)用燒錄。也就是在程序運行過程中,可以對自身ROM進行擦除和編程操作。
大家仔細(xì)想想是不是這樣?似乎支持串口ISP的單片機都支持IAP功能。STC還把這一功能包裝成了它的一大特色,可以用內(nèi)部ROM來充當(dāng)EEPROM的功能,可以在運行時記錄一些掉電不丟失的參數(shù)信息。
STM32 的 ROM 擦寫在配套的固件庫(標(biāo)準(zhǔn)庫或HAL庫)中已經(jīng)有實現(xiàn),大家可以參考或直接使用。
APP程序的配套修改
為了讓BL可以順利的將APP程序引導(dǎo)運行起來,APP 程序在開發(fā)的時候需要配合BL作出相應(yīng)的修改。最重要的就是 APP 程序的開始地址(即中斷向量表的開始地址)以及對中斷控制器的相應(yīng)配置。
對于51、AVR這類單片機APP程序不用修改,具體原因大家應(yīng)該明白。這里主要對 STM32 APP程序如何修改進行詳細(xì)講解。
我們依然是結(jié)合實例,請看圖所示。

圖片

假設(shè)我們所使用的 STM32 的 ROM 總大小為 128KB,BL程序的體積是16K,APP程序緊鄰BL,那么APP區(qū)的開始地址為0X08004000,也就是APP程序的中斷向量表偏移地址為0X4000。
如果我們使用MDK作為開發(fā)環(huán)境的話,需要修改這里,如圖所示。

圖片

而如果我們使用的是 gcc 的話,則需要對 link.ld 鏈接文件進行修改,如圖3.18。

圖片

然后我們還需要對NVIC的中斷向量表相關(guān)參數(shù)進行配置,主要是中斷向量表的偏移量,如下代碼。

#define VECT_TAB_OFFSET 0x4000

OK,經(jīng)過修改后的程序,我們把它放到 ROM 的 0X08004000 開始地址上,然后再讓BL跳轉(zhuǎn)到這個地址,我們的程序就能運行起來了。
有人又會問:“BL中的跳轉(zhuǎn)代碼怎么寫?”別急,這是我們要講的下一個要點。
BL中的跳轉(zhuǎn)代碼
跳轉(zhuǎn)代碼是 BL 要點中的關(guān)鍵,直接關(guān)系到 APP 程序能否正常運行,如圖

圖片

我直接給出 STM32 的 jump_app 函數(shù)代碼。

typedef void (*iapfun)(void);

iapfun jump2app;

void MSR_MSP(u32 addr)
{
  __ASM volatile('MSR MSP, r0');   //set Main Stack value*
  __ASM volatile('BX r14');*
}


void load_app(u32 appxaddr)
{
  if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)//**檢查棧頂?shù)刂泛戏?
  {

    //**用戶代碼區(qū)第二個字為程序開始地址(**復(fù)位地址)
    jump2app=(iapfun)\*(vu32\*)(appxaddr+4);

    //**初始化APP**堆棧指針(**用戶代碼區(qū)的第一個字用于存放棧頂?shù)刂?
    MSR_MSP(*(vu32*)appxaddr);  

    jump2app();   //**跳轉(zhuǎn)到APP.
  }
}

這段代碼大家自行研究,如果展開講就屬于贅述了。
到這里BL相關(guān)的要點就介紹完了,大家應(yīng)該有能力去完成一個簡單的BL了。基于 STM32 設(shè)計的一個小實驗,大家有興趣可以小試牛刀一下,如圖

圖片

我們將 BL 程序用 Jlink 燒錄到 0X08000000 位置,而把 APP 程序燒錄到 0X08002000 開始位置,然后復(fù)位,如果串口打印了 hello world 或流水燈亮起來了,就說明我們的 BL 成功了。

把Bootloader玩出花

上面我所講的都是BL最基礎(chǔ)的一些內(nèi)容,是我們實現(xiàn)BL所必須了解的。BL真正的亮點在于多種多樣的固件數(shù)據(jù)獲取方式。

BL的實現(xiàn)與延伸(串口傳輸固件)

前面我講到過兩個BL應(yīng)用的實例,一個是串口傳輸固件文件,一個是SD卡拷貝固件文件。它們是在實際工程中經(jīng)常被用到的兩種BL形式。

這里著重對前一個實例的實現(xiàn)細(xì)節(jié)進行講解剖析,因為它非常具有典型意義,如圖

圖片

這個流程圖提出了3個問題:
  • 串口通信協(xié)議是如何實現(xiàn)的?
  • 為什么獲取到上位機傳來的固件數(shù)據(jù),不是直接寫入到APP區(qū),而是先暫存,還要校驗?
  • 對固件數(shù)據(jù)是如何實現(xiàn)校驗的?

第一個問題,串口通信協(xié)議以及文件傳輸實現(xiàn)的相關(guān)內(nèi)容略顯繁雜,在以后的文章會專門進行講解。

第二個問題:經(jīng)過串口傳輸最終由單片機接收到的固件數(shù)據(jù)是可能出現(xiàn)差錯的,而有錯誤的固件冒然直接寫入到APP區(qū),是一定運行不起來的。所以,我們要對數(shù)據(jù)各幀進行暫存,等全部傳輸完成后,對其進行整體校驗,以保證固件數(shù)據(jù)的絕對正確。

針對第三個問題,我們要著重探討一下。

一個文件從發(fā)送方傳輸?shù)浇邮辗?,如何確定它是否存在錯誤?

通常的做法在文件中加入校驗碼,接收方對數(shù)據(jù)按照相同的校驗碼計算方法計算得到校驗碼,將之與文件中的校驗碼進行對比,一致則說明傳輸無誤,如圖。

圖片

上圖是對固件文件的補齊以及追加校驗碼的示意。

為什么要對文件補齊?嵌入式程序經(jīng)過交叉編譯生成的可燒錄文件,比如 BIN,多數(shù)情況下都不是128、256、512或1024的整數(shù)倍。這就會導(dǎo)致在傳輸?shù)臅r候,最后一幀數(shù)據(jù)的長度不足整幀,就會產(chǎn)生一個數(shù)據(jù)尾巴。

取整補齊是解決數(shù)據(jù)尾巴最直接的方法。這一操作是在上位機上完成的,通常是編寫一個小軟件來實現(xiàn)。這個小軟件同時會將校驗碼追加到固件文件末尾。這個校驗碼可以使用校驗和(Checksum)或者 CRC,一般是 16 位或 32 位,如圖,通過一個小軟件實現(xiàn)對固件文件補齊和添加校驗碼。

圖片

又有人會問:“要把整個固件暫存下來,再作校驗,那得需要額外的存儲空間吧,外擴ROM(FlashROM或EEPROM)?

是的。如果想節(jié)省成本,我們也可以不暫存,傳輸時直接燒寫到APP區(qū)。這是有風(fēng)險的,但是一般來說問題不大(STC和STM32的串口ISP其實也都是實時燒寫,并不暫存)。

因為在傳輸?shù)倪^程中,傳輸協(xié)議對數(shù)據(jù)的正確性是有一定保障的,它會對每一幀數(shù)據(jù)進行校驗,失敗的話會有重傳,連續(xù)失敗可能會直接終止傳輸。所以說,一般只要傳輸能夠完成,基本上數(shù)據(jù)正確性不會有問題。

但是,仍然建議對固件進行整體校驗,在成本允許的情況下適當(dāng)擴大ROM容量。同時,固件暫存還有一個另外的好處,在APP區(qū)中的固件受到損壞的時候,比如固件意外丟失或IAP時不小心擦除了APP區(qū),此時我們還可以從暫存固件恢復(fù)回來(完備的BL會包含固件恢復(fù)的功能)。

其實也不必非要外擴ROM,如果固件體積比較小的話,我們可以把單片機的片上ROM砍成兩半來用,用后一半來作固件暫存。將片上ROM劃分為3部分:

圖片

我們將片上ROM劃分為3部分,分別用于存儲 BL、APP 固件以及暫存固件。比如我們使用 STM32F103RBT6,它一共有128KB 的 ROM,可以劃分為 16K/56K/56K。

有些產(chǎn)品對成本極為敏感。我就有過這樣的開發(fā)經(jīng)歷,當(dāng)時使用的單片機是 STM32F103C8T6,片上ROM總?cè)萘繛?4K,固件大小為48K,BL為12K。在通過BL進行固件燒寫時根本沒有多余的ROM進行固件暫存。我使用了一招“狗尾續(xù)貂”,如圖

圖片

我無意中了解到 STM32F103C8T6 與 RBT6 的晶元是同一個。只是因為有些芯片后 64KB 的ROM性能不佳或有瑕疵,而被限制使用了。我實際測試了一下,確實如此。

但是后 64K ROM 的使用是有前提的,也就是需要事先對其好壞進行驗證。如果是好的,則暫存校驗,再寫入APP區(qū);而如果是壞的,那么就直接在固件傳輸時實時寫入APP區(qū)(這個辦法我屢試不爽,還沒有發(fā)現(xiàn)后64K有壞的)。

以上振南所介紹的是一種“騷操作”,根本上還是有一定的風(fēng)險的,ST 官方有聲明過,對后 64K ROM 的質(zhì)量不作保證,所以還是要慎用。

10米之內(nèi)隔空燒錄

這個“隔空燒錄”源于我的一個 IoT 項目,它是對空調(diào)的外機進行工況監(jiān)測。大家知道,空調(diào)外機的安裝那可不是一般人能干的,它要不就在樓頂,要不就在懸窗上。這給硬件升級嵌入式程序帶來很大的困難。

所以,我實現(xiàn)了“隔空燒錄”的功能,其實它就是串口BL應(yīng)用的一個延伸,如圖所示,通過藍(lán)牙串口模塊實現(xiàn)“隔空燒錄”。

圖片

“隔空燒錄確實牛,但是總要抱著一個電腦,這不太方便吧?!贝_實是!還記得前面我提過的AVRUBD通信協(xié)議嗎?它的上位機軟件是有手機版的。這樣我們只要有手機,就能“隔空燒錄”了,如圖,手機連接藍(lán)牙串口模塊實現(xiàn)“手機隔空燒錄”。

圖片

“哪個APP?快告訴我名字”,別急,藍(lán)牙串口助手安卓版,下圖是正在傳輸固件的界面。

圖片

AVRUBD其實是對 Xmodem 協(xié)議的改進,這個我們放在專門的文章進行詳細(xì)講解。

BL的分散燒錄

我們知道BL的核心功能其實就是程序燒錄。那你有沒有遇到過比較復(fù)雜的情況,如圖所示,一個系統(tǒng)(產(chǎn)品)中有多個部件需要燒錄固件。

圖片

這種情況是有可能遇到的。主 MCU+CPLD+通信協(xié)處理器+采集協(xié)處理器就是典型的復(fù)雜系統(tǒng)架構(gòu)。這種產(chǎn)品在批量生產(chǎn)階段,燒錄程序是非常繁瑣的。首先需要維護多個固件,再就是需要一個個給每一個部件進行燒寫,燒寫方式可能還不盡相同。所以我引入了一個機制,叫“BL的分散燒錄”。

首先,我們將所有的固件拼裝成一個大固件(依次數(shù)據(jù)拼接),并將這個大固件預(yù)先批量燒錄到外擴 ROM 中,比如spiFlash;再將主MCU預(yù)先燒錄好BL;然后進行SMT焊接。

PCBA生產(chǎn)出來之后,只要一上測試工裝(首次上電),BL會去外擴ROM中讀取大固件,并從中分離出各個小固件,分別以相應(yīng)的接口燒錄到各個部件中去。配合工裝的測試命令,直接進行自檢。

這樣做,批量化生產(chǎn)是非常高效的。當(dāng)然,這個 BL 開發(fā)起來也會有一定難度,最大問題可能還是各個部件燒錄接口的實現(xiàn)(有些部件的燒錄協(xié)議是比較復(fù)雜的,比如 STM32 的 SWD 或者 ESP8266 的 SLIP)。

BL沒有最好的,只有最適合自己的。通常來說,我們并不會把BL設(shè)計得非常復(fù)雜,原則上它應(yīng)該盡量短小精煉,以便為APP區(qū)節(jié)省出更多的ROM空間。畢竟不能喧賓奪主,APP才是產(chǎn)品的主角。

不走尋常路的BL

Bootpatcher

我來問大家一個問題:“Bootloader在 ROM 中的位置一定是在 APP 區(qū)前面嗎?”很顯然不是,AVR 就是最好的例子。那如果我們限定是 STM32 呢?似乎是的。上電復(fù)位一定是從0X08000000位置開始運行的,而且BL一定是先于APP運行的。

在某些特殊的情況下,如果 APP 必須要放在0X08000000位置上的話,請問還有辦法實現(xiàn)BL串口燒錄嗎?要知道APP在運行的時候,是不能 IAP 自己的程序存儲器的(就是自己能自己擦出重新燒錄新固件)。請看圖,BL位于APP之后稱之為Bootpatcher。

圖片

APP運行時,想要重新燒錄自身,它可以直接跳轉(zhuǎn)到后面的BL上,BL運行起來之后開始接收固件文件,暫存校驗OK之后,將固件寫入到前面的APP區(qū)。然后跳轉(zhuǎn)到 0X08000000,或者直接重啟。這樣新的APP就運行起來了。

這個位于 APP 后面的 BL,我們稱之為 Bootpatcher(意為啟動補?。5沁@種作法是有風(fēng)險的,一旦 APP 區(qū)燒錄失敗,那產(chǎn)品就變磚了。所以這種方法一般不用。

APP反燒BL

前面我們都是在講BL燒錄APP,那如果BL需要升級怎么辦呢?用 JLINK。不錯,不過有更直接的方法,如圖,APP燒錄BL區(qū)。

圖片

這是一種逆向思維,我們在 APP 程序中也實現(xiàn)接收固件文件,暫存校驗,然后將其燒錄到 BL 區(qū)。這種作法與Bootpatcher 同理,也是有一定風(fēng)險的,但一般都沒有問題。

最后

OK,本系列文章對BL進行了詳盡的剖析講解,應(yīng)該做到了深入淺出,包含基本的原理,以及實例的實現(xiàn),還有一些知識的擴展。希望能夠?qū)Υ蠹耶a(chǎn)生啟發(fā),在實際的工作中將這些知識付諸實踐。

作者/來源:一起學(xué)嵌入式

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多