目錄
一、什么是IAP?
二、串口IAP實驗
1. 實驗說明
2. 工程說明
IAP工程:
LED工程:
3. IAP源碼說明?
(1)主函數(shù):
(2)主菜單函數(shù)Main_Menu
(3)下載程序功能函數(shù)SerialDownload?
4、下載驗證
(1)下載IAP程序
?(2)通過IAP程序引導下載LED程序
(* ̄︶ ̄)創(chuàng)作不易!期待你們的?點贊、收藏和評論喔。?
一、什么是IAP?
IAP
是?In Application Programming
的首字母縮寫,IAP是用戶自己的程序在運行過程中對 User Flash 的部分區(qū)域進行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預留的通信口對產(chǎn)品中的固件程序進行更新升級。
在重新編程過程中可以使用任意類型的通信協(xié)議,如 UART、I2S、SPI?等。這篇筆記分享的是使用 UART方式IAP 。
二、串口IAP實驗
先理一理流程(本實驗是以?STM32F103ZET6
為例):
1. 實驗說明
做這個實驗需要準備兩個?keil
工程,一個工程用于編寫IAP程序,另一個工程用于編寫我們的應用程序(要實現(xiàn)某些功能的程序),這里我們以一個點燈程序為例。最終,兩份工程編譯出來的可執(zhí)行文件都需要燒寫到芯片的FLASH
中。只不過需要燒寫到不同的地址,簡單的示意圖如下:
這里使用的STM32型號為 STM32F103ZET6 ,其FLASH大小是512KB,0x08000000為其FLASH被映射的地址,程序被燒寫到的就是這個地址。此處,我們的IAP程序燒寫到這個地址,根據(jù)IAP程序的大小,我們在keil里可以設置合適的IAP結束地址。?
注意:在沒有IAP程序的情況下,0x08000000這個地址就是應用程序燒寫的地址。
2. 工程說明
本實驗用到的兩個工程可按照文末的方式獲取,其中IAP工程移植至ST官方例程。下面對兩個工程進行簡單的說明。
-
IAP工程:
(1)需要在?target
選項卡里設置我們IAP程序的 起始地址與大小 ,如:
這里我們的IAP程序起始地址設為 0x08000000,大小設為 0x3000,即IAP所能用的FLASH空間為12KB。其中IAP所能占的占空間的大小可根據(jù)IAP的實際大小進行修改。
(2)需要修改程序中我們需要跳轉到的應用程序的地址(即IAP程序的結束地址):
-
LED工程:
(1)需要在?target?
選項卡里設置我們LED程序的 起始地址與大小 ,如:
這里我們的?LED?程序起地址設為?0x08003000 ,大小設為 0x10000 ,即LED所能用的FLASH空間為 64KB 。其中結束地址可根據(jù)LED應用程序的實際大小進行修改。
(2)生成對應的?.bin
文件 。這需要在?User
選項卡里添加如下命令(即編譯后執(zhí)行的命令):
其中,fromelf.exe
是我們 keil安裝目錄 下的一個可執(zhí)行程序,可以把?.axf
文件 轉換成?.bin
文件 。要在keil中直接調(diào)用 fromelf 命令,必須要把?fromelf.exe?
所在目錄添加到環(huán)境變量中。添加環(huán)境變量的方法如下(該方法來自于《【野火】零死角玩轉STM32—F429挑戰(zhàn)者V2.pdf》):
本文以 Win7系統(tǒng) 為例添加工具鏈的路徑到 PATH 環(huán)境變量,其它系統(tǒng)是類似的。
(1)右鍵電腦系統(tǒng)的?計算機圖標
,在彈出的菜單中選擇?屬性
,如圖:
(2)在彈出的屬性頁面依次點擊?高級系統(tǒng)設置 -> 環(huán)境變量
,在用戶變量一欄中找到名為?PATH?
的變量,若沒有該變量,則新建一個。編輯?PATH
變量 ,在它的變量值中輸入工具鏈的路徑,如本機的是:D:\work\keil5\ARM\ARMCC\bin
,注意要使用分號;
讓它與其它路徑分隔開,輸入完畢后依次點?確定
,如圖:
(3)打開 Windows 的命令行,點擊系統(tǒng)的?開始菜單
,在搜索框輸入?cmd
,在搜索結果中點擊?cmd.exe
即可打開命令行,如圖:?
?
(4)在彈出的命令行窗口中輸入?fromelf
回車,若窗口打印出?formelf
?的幫助說明,那么路徑正常,就可以開始后面的工作了;若提示?不是內(nèi)部名外部命令,也不是可運行的程序…
信息,說明路徑不對,請重新配置環(huán)境變量,并確認該工作目錄下有編譯工具鏈。
這個過程本質就是讓命令行通過“PATH”路徑找到?fromelf.exe
程序運行 。
學會配置?fromelf.exe
,也就學會配置了?MinGW
。MinGW是一個工具集,包含編譯C與C++的gcc、g++,使用它就可以在Windows命令行下編譯C程序。
3. IAP源碼說明?
(1)主函數(shù):
int main(void)
{
FLASH_Unlock(); /* FLASH解鎖 */
KEY_Init(); /* 按鍵初始化 */
IAP_Init(); /* IAP初始化 */
/* 按鍵按下則進入主菜單開始更新程序(注意:需要按下復位鍵的同時按下該按鍵觸發(fā)程序更新) */
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){}
return0;
}
可見,我們按下復位的同時按下?PE2
對應的按鍵即可觸發(fā)應用程序更新操作,否則跳轉到應用程序的起始地址執(zhí)行應用程序(斷點重啟也是默認執(zhí)行應用程序),這里的?ApplicationAddress
就是我們上面設置的?0x08003000
。?
(2)主菜單函數(shù)Main_Menu
?這個函數(shù)里就是該 IAP 程序的功能,根據(jù)其中的打印信息:
可以知道,該IAP有三個功能(分別輸入鍵盤上的數(shù)字1、2、3進行選擇):
- 1是下載程序(電腦->STM32);
- 2是上傳程序(STM32->電腦);
- 3是執(zhí)行新程序(即剛下載完成的程序)。
(3)下載程序功能函數(shù)SerialDownload?
?首先,上位機使用Ymodem協(xié)議進行數(shù)據(jù)下發(fā),STM32根據(jù)協(xié)議解析數(shù)據(jù),拿到有用的數(shù)據(jù),并把這些數(shù)據(jù)寫入FLASH對應的地址中,即ApplicationAddress。關于Ymodem協(xié)議及SerialDownload函數(shù)這里不展開討論。
4、下載驗證
(1)下載IAP程序
可以使用J-link等調(diào)試器進行下載,也可用串口ISP
進行下載,我們選用的是?串口ISP
進行下載,借用的工具是?FlyMcu
:
這里下載的是?.hex
文件 ,如果下載?.bin
文件 ,則會提示如下錯誤:?
程序文件不是 0x8000000 和 0x20000000 區(qū)域的
使用 ISP 方式下載需要進行的硬件操作是:BOOT0引腳拉高,BOOT1引腳接地
。即系統(tǒng)存儲器被選為啟動區(qū)域:?
在點擊?開始編程
按鈕后,需要按下板子上的復位鍵,即可下載程序。?
?(2)通過IAP程序引導下載LED程序
上面提到下載程序使用的是 Ymodem 協(xié)議,所以得選用帶有Ymodem協(xié)議傳輸方式的上位機軟件來把應用程序下載到板子里??梢赃x用?SecureCRT
,也可以選用超級終端。這里選用的是超級終端:
首先,按下數(shù)字鍵1觸發(fā)下載程序操作,此時會不斷打印?CCCCC...
。然后點?傳送 -> 發(fā)送文件
,選擇要下載的?.bin
文件 及?Ymodem
協(xié)議 。下載完成后按下 數(shù)字3 即可執(zhí)行新下載得應用程序:
終于LED閃爍起來了,點燈項目成功!斷電重啟之后,默認執(zhí)行的是這個點燈程序,要想下載新的程序,按下復位的同時按下PE2
所對應的按鍵(需要一定的手速)即可觸發(fā)更新程序操作。文章來源:http://www.zghlxwxcb.cn/news/detail-829313.html
(* ̄︶ ̄)創(chuàng)作不易!期待你們的?點贊、收藏和評論喔。?
本文來源網(wǎng)絡,免費分享知識,版權歸原作者所有。如涉及作品版權問題,請聯(lián)系我進行刪除!文章來源地址http://www.zghlxwxcb.cn/news/detail-829313.html
到了這里,關于【嵌入式開發(fā)學習】__扒一扒單片機串口IAP原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!