天天看點

Bootloader 與 Firmware 一起用ULINK燒寫方法

(擴充-IAP主要用于産品出廠後應用程式的更新作用,上一篇博文詳細的對IAP更新程式做了詳細的分析http://blog.csdn.net/yx_l128125/article/details/12992773,考慮到出廠時要先燒寫IAP  再燒寫APP應用程式要燒寫2次增加勞工勞動力基礎上寫了“STM32 IAP+APP ==>雙劍合一”連結稍後發,希望通過IAP程式的hex檔案和 APP的hex檔案合成一個hex  或者把合成的hex檔案轉成.bin檔案減少“體力”)

一、簡單架構介紹

(簡單回顧上篇博文《IAP線上更新詳解》http://blog.csdn.net/yx_l128125/article/details/12992773的幾個重要知識點:

1、stm32内部flash起始位址:0x0800 0000 -- 0x0802 0000 ,其中從 0x0800 0000開始位置存放IAP更新程式,  從0x 0800 3000開始的位置存放APP應用程式[而APP中的中斷向量表放在0x0800 3000地方,更重要的是中斷向量表的第1項存放的是棧頂位址,第二項放的是”複位中斷“ ]

二、IAP +APP結合的方法

 IAP 和APP的hex 檔案合成1個hex檔案的方法有2種:

(1)  "簡單1+1"    

(2) IAP 先燒寫進flash的 0x0800 0000開始位置,  APP燒寫到 flash  的0x 0800 3000開始的地方;之後通過我上一篇博文的 IAP程式的檔案讀出功能讀取flash上的資料讀到一個.bin檔案上;

我們先來詳細分析“方法一”的操作:

1.我們設定編譯IAP程式的編譯器(如圖),這個設定意思是把IAP程式下載下傳到flash的 0x0800 0000開頭的位置,然後編譯程式

2.編譯完程式後,在工程目錄的output檔案夾中找到編譯後生産的.hex檔案;

用 notepad++  或者 UltraEdit打開  IAP 的.hex檔案  和APP 的.hex 檔案,  (順便問一下.hex檔案格式你會看嗎?)

hex檔案格式:

(1)以行為機關,每行以冒号開頭,内容全部為16進制碼(以ASCII碼形式顯示)

(2)在HEX檔案裡面,每一行代表一個記錄。記錄的基本格式為:

冒号 本行資料長度 本行資料起始位址 資料類型 資料 校驗碼
1 byte 2 bytes 1 byte n byte 1 byte

第一個位元組 表示本行資料的長度;

第二、三位元組表示本行資料的起始位址;

第四位元組表示資料類型,資料類型有:0x00、0x01、0x02、0x03、0x04、0x05。

'00' Data Rrecord:用來記錄資料,HEX檔案的大部分記錄都是資料記錄

'01' End of File Record:用來辨別檔案結束,放在檔案的最後,辨別HEX檔案的結尾

'02' Extended Segment Address Record:用來辨別擴充段位址的記錄

'03' Start Segment Address Record:開始段位址記錄

'04' Extended Linear Address Record:用來辨別擴充線性位址的記錄

'05' Start Linear Address Record:開始線性位址記錄

然後是資料,最後一個位元組 為校驗和。

校驗和的算法為:計算校驗和前所有16進制碼的累加和(不計進位),檢驗和 = 0x100 - 累加和

打開.hex内容如下:(中間部分資料略去)

[plain] view plaincopy

1.  <strong>:020000040800F2  

2.  :10000000B80B00207D250008850300088703000841</strong>  

3.  :100010009B0300089F030008A303000800000000E2  

4.  :10002000000000000000000000000000A70300081E  

5.  :10003000A903000800000000AB030008AD0300089E  

6.  。  

7.  。  

8.  。  

9.  :102B40000400000000000000000000000000000081  

10. :102B50000000000000000000000000000000000075  

11. :102B6000010203040102030406070809020406081F  

12. :102B700000366E01000000000000000001020304A6  

13. :042B80000607080933  

14. <strong>:0400000508000121CD  

15. :00000001FF</strong>  

先分析第一條語句---- “:02 0000  04 0800  F2”

冒号 本行資料長度 本行資料起始位址(偏移位址) 資料類型 資料 校驗碼
1 byte 2 bytes 1 byte n byte 1 byte

[plain]view plaincopy

1.    

[plain]view plaincopy

1.    

02 0000 04 0800 F2

在上面的資料類型後2種記錄(04,05)都是用來提供位址資訊的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個“基”位址。對于後面的資料記錄,計算位址的時候,都是以這些“基”位址為基礎的。以我們的語句為例:

第1條記錄的長度為02,LOAD OFFSET為0000,RECTYPE為04,說明該記錄為擴充段位址記錄。資料為0008,校驗和為F2。從這個記錄的長度和資料,我們可以計算出一個基位址,這個位址為(0x0800 << 16) = 0x0800 0000 ,後面的資料記錄都以這個位址為基位址。

第二條語句----“ :10000000B80B00207D250008850300088703000841”

冒号 本行資料長度 本行資料起始位址(偏移位址) 資料類型 資料 校驗碼
1 byte 2 bytes 1 byte n byte 1 byte

[plain]view plaincopy

1.    

[plain]view plaincopy

1.    

: 10 0000 00 B80B00207D2500088503000887030008 41

第2條記錄的長度為10(0x10=16位元組),LOAD OFFSET為0000,RECTYPE為00('00' Data Rrecord:用來記錄資料,HEX檔案的大部分記錄都是資料記錄),資料為B80B00207D2500088503000887030008  校驗碼為41;此時基位址為:0x0800 0000  加上偏移位址:0x0000   這條記錄的16個位元組的資料的起始位址為:0x0800000 + 0x0000 =0x0800 0000

第3條語句----“:0400000508000121CD”

冒号 本行資料長度 本行資料起始位址(偏移位址) 資料類型 資料 校驗碼
1 byte 2 bytes 1 byte n byte 1 byte

[plain]view plaincopy

1.    

[plain]view plaincopy

1.    

: 04 0000 05 08000121 CD

記錄的長度為04,LOAD OFFSET為0000,RECTYPE為05,此時,EIP寄存器裡存放的位址:0x0800 0121;即IP指向下一個要執行的指令所在位址,我們來看一下IAP工程list目錄下的.map檔案,其中第393行處如圖:(看到沒?0x0800 0121值main函數的入口位址)

EIP是32位機的指令寄存器, IP是指令寄存器,存放目前指令的下一條指令的位址。CPU該執行哪條指令就是通過IP來訓示的

上圖參考hex資料文檔:http://pages.interlog.com/~speff/usefulinfo/Hexfrmt.pdf 或 http://microsym.com/editor/assets/intelhex.pdf

第4條語句---“:00000001FF”  (每一個.hex檔案的最後一行都是固定為這個内容)

冒号 本行資料長度 本行資料起始位址(偏移位址) 資料類型 資料 校驗碼
1 byte 2 bytes 1 byte n byte 1 byte

[plain]view plaincopy

1.    

: 00 0000 01 FF

 (每一個.hex檔案的最後一行都是固定為這個内容)

記錄的長度為00,LOAD OFFSET為0000,RECTYPE為01  (01' End of File Record:用來辨別檔案結束,放在檔案的最後,辨別HEX檔案的結尾)

三、iap和app  的.hex檔案結合

操作1:設定編譯IAP程式的編譯器(如圖),這個設定意思是把IAP程式下載下傳到flash的 0x0800 0000開頭的位置,然後編譯程式,生産.hex檔案;

操作2:設定編譯APP程式的編譯器(如圖),這個設定意思是把APP程式下載下傳到flash的 0x0800 3000開頭的位置,然後編譯程式,生産.hex檔案;

操作3:用 notepad++  或者 UltraEdit打開  IAP 的.hex檔案  和APP 的.hex 檔案

把IAP的.hex最後一句結束語句去掉(即:删除:00000001FF)

把APP的.hex全部内容拷貝複制到剛才删掉結束語句的 IAP的.hex後面(如圖)

原來第701行為 :00000001FF的結束語句

操作4:把兩個.hex合成的.hex檔案重新命名,燒寫到0x0800 0000 開始位置的位址即可;

繼續閱讀