STM32串口IAP分享


什么是IAP?

IAPIn 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程序的結束地址):

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程序運行 。

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://zhengnianli.github.io/

我的微信公眾號:嵌入式大雜燴,關注並回復【1024】獲取1TB大雜燴資料。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM