STM32 IAP公升級 知識點記錄

2021-09-28 10:50:31 字數 2119 閱讀 1202

1.1    書寫程式,keil生成bin檔案

1.2    上位機載入bin檔案,生成校驗碼,通過串列埠,將bin檔案和校驗碼傳送到微控制器

1.3    微控制器接收bin檔案,所有資料存在usart_rx_buf中

1.4    微控制器程式校驗接收資料是否正確

1.5    程式判斷中斷向量入口是否正確 if(((*(vu32*)(0x20001000+4))&0xff000000)==0x08000000)

1.7    將寫入資料重新讀出,對比是否全部正確寫入,以判斷公升級無誤。(可選)

1.7    讀取剛寫入資料的中斷入口位址,即頭4位資料,判斷是否正確。

1.8    入口正確則說明這是乙個程式,可以執行。

很多人會疑惑這個判斷是什麼意思,尤其是0x20001000這個位址怎麼來?

原子例程中有提到:「串列埠接收過來的資料,是從:0x20001000開始儲存的。」

即:0x20001000是串列埠資料快取陣列的起始位址,也就是usart_rx_buf的起始位址。但實際情況下,usart_rx_buf的起始位址不一定是0x20001000。所以書寫的時候,需注意。

也可以這樣寫:

u32 flash_interruptaddr=0;

flash_interruptaddr = usart_rx_buf[7]; //usart_rx_buf[7]=0x08

flash_interruptaddr = (flash_interruptaddr<<8)|usart_rx_buf[6];//usart_rx_buf[6]=0x00

flash_interruptaddr = (flash_interruptaddr<<8)|usart_rx_buf[5];//usart_rx_buf[5]=0x01

flash_interruptaddr = (flash_interruptaddr<<8)|usart_rx_buf[4];//usart_rx_buf[4]=0x01

if((flash_interruptaddr&0xff000000)==0x08000000)//判斷是否為0x08******.

(*(vu32*)(0x20001000+4),這個就是取中斷向量的入口位址。如下圖,bin檔案中,0~3是msp位址,4~7是中斷向量入口位址。

指令:fromelf --bin -o ..\bin\test.bin "#l"

開始位址為0x8000000,size選擇控制flash所有記憶體0x10000(64kb)。

iram1: 使用全部記憶體0x5000(20kb)

開始位址為0x8002800(10kb位置開始),size = 0x10000-0x2800 = 0xd800,使用剩餘全部記憶體

iram1:使用全部執行記憶體(20kb)

關鍵程式:scb->vtor = flash_base | 0x2800; /* vector table relocation in internal flash. */

/**

* @brief 主函式

* @param 無

* @retval 無

STM32 IAP公升級工具

1 內部包含了crc mode的檢驗 2 檔案包含了頭尾 長度的資料,確保公升級操作的可靠性 3 win32串列埠查詢功能getseriallist 4 regkey.open hkey local machine,t hardware devicemap serialcomm key read e...

STM32 IAP公升級韌體 上位機 例程

本例程實現功能 一 iap公升級簡單介紹 基本原理不做贅述,參見 兩種方式 方式2 4 引數區域存放公升級標誌以及其他引數 本例程採用方式二公升級 二 韌體程式 stm32f103cbt6晶元使用hal庫開發 1 flash區域劃分 分割槽大小 扇區位址 iap10k 0 90x08000000 0...

STM32 iap移植筆記

對於大多數基於 flash 的系統而言,在最終產品中安裝之後,能夠對韌體進行更新,這一點非常重要。這一功能被稱為在應用中程式設計 iap stm32f4xx 微控制器能夠執行使用者指定的韌體,從而執行微處理器內建 flash 的 iap。借助這一特性,在重新程式設計過程中可以使用任意型別的通訊協議。...