stm32 IAP + APP合成一個燒寫檔案
(擴充套件-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 plain copy
- <strong>:020000040800F2
- :10000000B80B00207D250008850300088703000841</strong>
- :100010009B0300089F030008A303000800000000E2
- :10002000000000000000000000000000A70300081E
- :10003000A903000800000000AB030008AD0300089E
- 。
- 。
- 。
- :102B40000400000000000000000000000000000081
- :102B50000000000000000000000000000000000075
- :102B6000010203040102030406070809020406081F
- :102B700000366E01000000000000000001020304A6
- :042B80000607080933
- <strong>:0400000508000121CD
- :00000001FF</strong>
先分析第一條語句---- “:02 0000 04 0800 F2”
冒號 | 本行資料長度 | 本行資料起始地址(偏移地址) | 資料型別 | 資料 | 校驗碼 |
1 byte | 2 bytes | 1 byte | n byte | 1 byte | |
[plain]view plain copy
|
[plain]view plain copy
|
||||
: | 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 plain copy
|
[plain]view plain copy
|
||||
: | 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 plain copy
|
[plain]view plain copy
|
||||
: | 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 plain copy
|
|||||
: | 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 開始位置的地址即可;
這裡把 合成的.hex檔案上傳到我的資源:http://download.csdn.net/detail/yx_l128125/6475171(必須把PB1管腳拉低,串列埠1連線超級終端才能看到升級程式的引導資訊):