1. 程式人生 > 其它 >c++ win32 獲取串列埠高低電平_STM32F103 IAP線上升級通過串列埠升級

c++ win32 獲取串列埠高低電平_STM32F103 IAP線上升級通過串列埠升級

技術標籤:c++ win32 獲取串列埠高低電平c++獲取串列埠裝置名稱java 讀取串列埠資料demojlink v9可升級韌體‘stm32 cube 串列埠stm32 ucosii訊息佇列 串列埠

STM32F103 IAP線上升級通過串列埠升級

↑ 點選上方,關注“Tkwer望遠鏡”

9545b429-b61a-eb11-8da9-e4434bdf6706.jpeg

作者:Tkwer

公眾號:Tkwer望遠鏡

前言

有很多種IAP線上應用升級韌體的方法,具體可以參照bug菌寫的文章: 【重磅】剖析MCU的IAP升級軟體設計(設計思路篇) 下面我將從STM32F103RXT6這塊板子進行實驗,這板子已完全硬體開源可訪問此篇文章獲取設計檔案: 【自制分享】分享一塊自制STM32F103RETX開發板!!!功能實用 9645b429-b61a-eb11-8da9-e4434bdf6706.gif
首先宣告該程式並不是我寫的,而是havenxie大佬寫的。我們需要以下工程檔案,boot資料夾是IAP的BootLoader載入程式,app資料夾是執行的應用程式demo,具體應用程式內容可根據自己的程式做修改,winapp資料夾是一個串列埠應用程式,可利用該軟體實現iap升級功能。

9845b429-b61a-eb11-8da9-e4434bdf6706.png

下面將具體介紹這三個工程:

boot程式

第一個是boot程式,我們知道stm32可以通過設定boot0,boot1使stm32啟動從System memory啟動,在廠家提供的BootLoader中,提供了串列埠下載程式的韌體,可以通過這個BootLoader將程式下載到系統的Flash中。具體看之前寫的文章: 【IAP更新裝置】STM32CubeProgrammer DFU功能實現裝置韌體升級 但是我們可以犧牲一點flash,寫一個新的bootloader固化再flash地址前面。這樣我們不用每次都得通過設定boot0,boot1才能進行燒錄,每次都在Flash memory啟動,但是又通過bootloader檢查是否有應用程式,這種方式在一些遠端升級更加常用。
intmain(void){
IAP_Init();

while(1)
{
switch(IAP_ReadFlag())
{
caseAPPRUN_FLAG_DATA://jumptoapp
if(IAP_RunApp())
IAP_WriteFlag(INIT_FLAG_DATA);
break;
caseINIT_FLAG_DATA://initialzestate(blankmcu)
IAP_Main_Menu();
break;
caseUPDATE_FLAG_DATA://downloadappstate
if(!IAP_Update())
IAP_WriteFlag(APPRUN_FLAG_DATA);
else
IAP_WriteFlag(INIT_FLAG_DATA);
break;
caseUPLOAD_FLAG_DATA://uploadappstate
//if(!IAP_Upload())
//IAP_WriteFlag(APPRUN_FLAG_DATA);
//else
//IAP_WriteFlag(INIT_FLAG_DATA);
break;
caseERASE_FLAG_DATA://eraseappstate
IAP_Erase();
IAP_WriteFlag(INIT_FLAG_DATA);
break;
default:
break;
}
}
}
IAP_ReadFlag()與IAP_WriteFlag()函式是程式執行狀態讀寫函式,利用了備用暫存器存取片子上一階段的狀態,即掉電也會儲存該資料。例如,通常我們在上次已燒寫應用程式進去,下次上電可以直接執行app,不用再執行Bootloader。可以通過IAP_WriteFlag()寫入標誌,下次執行通過IAP_ReadFlag()讀取標誌,直接跳轉執行app程式。其他同理。
/*DefinetheAPPstartaddress-------------------------------*/
#defineApplicationAddress0x8003000
上面一行程式碼是需要設定app程式儲存的起始地址。bootloader程式儲存在0x8000000~0x8002FFF。

官方介紹:

9945b429-b61a-eb11-8da9-e4434bdf6706.png

app程式 很重要一點的是先設定app程式放置的起始位置

9a45b429-b61a-eb11-8da9-e4434bdf6706.png

此外開啟system_stm32f1xx.c 檔案,修改中斷向量偏移量,註釋上說明偏移量要是0x200的整數倍。我們修改和app的啟動地址偏移一致0x3000. 但是一個完整的app程式不僅是能實現應用功能,還能有跳轉回bootloader執行的能力。這裡就不做詳細介紹了,具體大家可以看原始碼,作者是通過正點原子的方法使用usmart.c實現。 官方介紹: 9b45b429-b61a-eb11-8da9-e4434bdf6706.png

winapp程式

9c45b429-b61a-eb11-8da9-e4434bdf6706.png

應用如上圖所示,採用winform設計的,同時串列埠下載程式的協議採用YModem協議校驗。

實驗

9d45b429-b61a-eb11-8da9-e4434bdf6706.gif

我修改了一下源程式,添加了led_allon()與led_alloff();函式,以下是效果:

9f45b429-b61a-eb11-8da9-e4434bdf6706.gif

板子燈亮起來的。 最後

正如作者所說,達到了無痛移植的效果,用起來十分舒服。再次十分感謝havenxie分享的原始碼,我在原文閱讀中可點選訪問其github主頁,大家可以去其github主頁下載程式。同時修改的程式,我將在公眾號後臺放出連結,大家複製文末的關鍵詞連結到後臺回覆即可獲得下載連結。

END

a045b429-b61a-eb11-8da9-e4434bdf6706.jpeg公眾號ID:Tkwer望遠鏡掃碼關注最新動態

提供原始檔,公眾號內回覆即可獲取:IAP升級原始碼