Bootloader 與 Firmware 一起用ULINK燒寫方法

(擴展-IAP主要用於產品出廠後應用程序的更新作用,上一篇博文詳細的對IAP升級程序做了詳細的分析http://blog.csdn.net/yx_l128125/article/details/12992773,考慮到出廠時要先燒寫IAP  再燒寫APP應用程序要燒寫2次增加工人勞動力基礎上寫了“STM32 IAP+APP ==>雙劍合一鏈接稍後發,希望通過IAP程序的hex文件 APPhex文件合成一個hex  或者把合成的hex文件轉成.bin文件減少體力

 

一、簡單框架介紹

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

1stm32內部flash起始地址:0x0800 0000 -- 0x0802 0000 ,其中 0x0800 0000開始位置存放IAP升級程序,  0x 0800 3000開始的位置存放APP應用程序[APP中的中斷向量表放在0x0800 3000地方,更重要的是中斷向量表的第1項存放的是棧頂地址,第二項放的是復位中斷“ ]

  

二、IAP +APP結合的方法

 IAP APPhex 文件合成1hex文件的方法有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

 

 

 

 

 

 

 

 

 

 

 

 

第一個字節 表示本行數據的長度;

第二、三字節表示本行數據的起始地址;

第四字節表示數據類型,數據類型有:0x000x010x020x030x040x05

'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種記錄(0405)都是用來提供地址信息的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個地址。對於後面的數據記錄,計算地址的時候,都是以這些地址爲基礎的。以我們的語句爲例:

1條記錄的長度爲02LOAD OFFSET0000RECTYPE04,說明該記錄爲擴展段地址記錄。數據爲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條記錄的長度爲100x10=16字節)LOAD OFFSET0000RECTYPE00'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

記錄的長度爲04LOAD OFFSET0000RECTYPE05,此時,EIP寄存器裏存放的地址:0x0800 0121;IP指向下一個要執行的指令所在地址,我們來看一下IAP工程list目錄下的.map文件,其中第393行處如圖:(看到沒?0x0800 0121main函數的入口地址)

EIP32位機的指令寄存器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文件的最後一行都是固定爲這個內容)
記錄的長度爲00LOAD OFFSET0000RECTYPE01  01' End of File Record:用來標識文件結束,放在文件的最後,標識HEX文件的結尾)

三、iapapp  .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 開始位置的地址即可;

 

發佈了74 篇原創文章 · 獲贊 36 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章