一、什麼是IAP?
IAP
是
In Application Programming
的首字母縮寫,IAP是使用者自己的程式在執行過程中對User Flash的部分割槽域進行燒寫,目的是為了在產品釋出後可以方便地透過預留的通訊口對產品中的韌體程式進行更新升級。
在重新程式設計過程中可以使用任意型別的通訊協議,如UART、I2S、SPI等。這篇筆記分享的是使用UART方式IAP。
二、串列埠IAP實驗
先理一理流程(本實驗是以
STM32F103ZET6
為例):
1、實驗說明
做這個實驗需要準備兩個
keil
工程,一個工程用於編寫IAP程式,另一個工程用於編寫我們的應用程式(要實現某些功能的程式),這裡我們以一個點燈程式為例。最終,兩份工程編譯出來的可執行檔案都需要燒寫到晶片的
FLASH
中。只不過需要燒寫到不同的地址,簡單的示意圖如下:
這裡使用的STM32型號為STM32F103ZET6,其FLASH大小是512KB,0x08000000為其FLASH被對映的地址,程式被燒寫到的就是這個地址。此處,我們的IAP程式燒寫到這個地址,根據IAP程式的大小,我們在keil裡可以設定合適的IAP結束地址。
注意:在沒有IAP程式的情況下,0x08000000這個地址就是應用程式燒寫的地址。
2、工程說明
本實驗用到的兩個工程可按照文末的方式獲取,其中IAP工程移植至ST官方例程。下面對兩個工程進行簡單的說明。
IAP工程:
(1)需要在
target
選項卡里設定我們IAP程式的起始地址與大小,如:
這裡我們的IAP程式起始地址設為0x08000000,大小設為0x3000,即IAP所能用的FLASH空間為12KB。其中IAP所能佔的佔空間的大小可根據IAP的實際大小進行修改。
(2)需要修改程式中我們需要跳轉到的應用程式的地址(即IAP程式的結束地址):
嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!
無償分享大家一個資料包,差不多150多G。裡面學習內容、面經、專案都比較新也比較全!某魚上買估計至少要好幾十。
點選這裡找小助理0元領取:
點選文中藍色字型即可領取
LED工程:
(1)需要在
target
選項卡里設定我們LED程式的起始地址與大小,如:
這裡我們的LED程式起地址設為0x08003000,大小設為0x10000,即LED所能用的FLASH空間為64KB。其中結束地址可根據LED應用程式的實際大小進行修改。
(2)生成對應的
。bin
檔案。這需要在
User
選項卡里新增如下命令(即編譯後執行的命令):
其中,
fromelf。exe
是我們keil安裝目錄下的一個可執行程式,可以把
。axf
檔案轉換成
。bin
檔案。要在keil中直接呼叫fromelf命令,必須要把
fromelf。exe
所在目錄新增到環境變數中。新增環境變數的方法如下(該方法來自於《【野火】零死角玩轉STM32—F429挑戰者V2。pdf》):
本文以 Win7 系統為例新增工具鏈的路徑到 PATH 環境變數,其它系統是類似的。
(1) 右鍵電腦系統的
計算機圖示
,在彈出的選單中選擇
屬性
,如圖:
(2) 在彈出的屬性頁面依次點選
高階系統設定 ->環境變數
,在使用者變數一欄中找到名為
PATH
的變數,若沒有該變數,則新建一個。編輯
PATH
變數,在它的變數值中輸入工具鏈的路徑,如本機的是
;D:\work\keil5\ARM\ARMCC\bin
,注意要使用分號
;
讓它與其它路徑分隔開,輸入完畢後依次點
確定
,如圖:
(3) 開啟 Windows 的命令列,點選系統的
開始選單
,在搜尋框輸入
cmd
,在搜尋結果中點選
cmd。exe
即可開啟命令列,如圖:
(4) 在彈出的命令列視窗中輸入
fromelf
回車,若視窗打印出
formelf
的幫助說明,那麼路徑正常,就可以開始後面的工作了;若提示
不是內部名外部命令,也不是可執行的程式…
資訊,說明路徑不對,請重新配置環境變數,並確認該工作目錄下有編譯工具鏈。
這個過程本質就是讓命令列透過“PATH”路徑找到
fromelf。exe
程式執行 。
學會配置
fromelf。exe
,也就學會配置了
MinGW
。MinGW是一個工具集,包含編譯C與C++的gcc、g++,使用它就可以在Windows命令列下編譯C程式。
3、IAP原始碼說明
(1)主函式
:
int main(void){ FLASH_Unlock(); /* FLASH解鎖 */ KEY_Init(); /* 按鍵初始化 */ IAP_Init(); /* IAP初始化 */ /* 按鍵按下則進入主選單開始更新程式(注意:需要按下復位鍵的同時按下該按鍵觸發程式更新) */ if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0x00) { SerialPutString(“\r\n======================================================================”); SerialPutString(“\r\n= (C) COPYRIGHT 2010 STMicroelectronics =”); SerialPutString(“\r\n= =”); SerialPutString(“\r\n= In-Application Programming Application (Version 3。3。0) =”); SerialPutString(“\r\n= =”); SerialPutString(“\r\n= By MCD Application Team =”); SerialPutString(“\r\n======================================================================”); SerialPutString(“\r\n\r\n”); Main_Menu (); } /* 保持執行使用者應用程式 */ else { /* Test if user code is programmed starting from address “ApplicationAddress” */ if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application‘s Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); } } while (1){} return 0;}
可見,我們按下復位的同時按下
PE2
對應的按鍵即可觸發應用程式更新操作,否則跳轉到應用程式的起始地址執行應用程式(斷點重啟也是預設執行應用程式),這裡的
ApplicationAddress
就是我們上面設定的
0x08003000
。
(2)主選單函式Main_Menu
這個函數里就是該IAP程式的功能,根據其中的列印資訊:
可以知道,該IAP有三個功能(分別輸入鍵盤上的數字1、2、3進行選擇):一是下載程式(電腦->STM32);二是上傳程式(STM32->電腦);三是執行新程式(即剛下載完成的程式)。
(3)下載程式功能函式SerialDownload
首先,上位機使用Ymodem協議進行資料下發,STM32根據協議解析資料,拿到有用的資料,並把這些資料寫入FLASH對應的地址中,即ApplicationAddress。關於Ymodem協議及SerialDownload函式這裡不展開討論。
4、下載驗證
(1)下載IAP程式
可以使用J-link等偵錯程式進行下載,也可用
串列埠ISP
進行下載,我們選用的是
串列埠ISP
進行下載,借用的工具是
FlyMcu
:
這裡下載的是
。hex
檔案,如果下載
。bin
檔案,則會提示如下錯誤:
程式檔案不是0x8000000和0x20000000區域的
使用ISP方式下載需要進行的硬體操作是:
BOOT0引腳拉高,BOOT1引腳接地
。即系統儲存器被選為啟動區域:
在點選
開始程式設計
按鈕後,需要按下板子上的復位鍵,即可下載程式。
(2)透過IAP程式引導下載LED程式
上面提到下載程式使用的是Ymodem協議,所以得選用帶有Ymodem協議傳輸方式的上位機軟體來把應用程式下載到板子裡。可以選用
SecureCRT
,也可以選用超級終端。這裡選用的是超級終端:
首先,按下數字鍵1觸發下載程式操作,此時會不斷列印
CCCCC。。。
。然後點
傳送->傳送檔案
,選擇要下載的
。bin
檔案及
Ymodem
協議。下載完成後按下數字3即可執行新下載得應用程式:
終於,LED閃爍起來了,點燈專案成功
。斷電重啟之後預設執行的是這個點燈程式,要想下載新的程式,按下復位的同時按下
PE2
所對應的按鍵(需要一定的手速
)即可觸發更新程式操作。
原文連結:https://mp。weixin。qq。com/s/8IBANNYce6V7BzXdrBzqJQ
轉載自:嵌入式微處理器
原文連結:扒一扒微控制器串列埠IAP原理
本文來源網路,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯絡我進行刪除。