背景:
在產品發布后,可能需要對韌體進行更新或者升級,那么在影響產品正常運行的情況下,如果升級韌體呢?
理論:
下面的所有理論部分內容參考《STM32開發指南》,
什么是IAP:
指在應用編程,即用戶程式運行中作自身的更新操作,需要在設計韌體程式時撰寫兩個專案代碼,第一個專案程式不執行正常的功能操作,(功能操作指:main函式里面的功能)而只是通過某種通信方式(如USB、USART)接收程式或資料,執行對第二部分代碼的更新;(第二部分代碼指需要更新的程式)第二個專案代碼才是真正的功能代碼,這兩部分專案代碼都同時燒錄在User Flash中,當芯片上電后,首先是第一個專案代碼開始運行,操作如下:
1.檢查是否需要對第二部分代碼進行更新;
2.不需要更新的話,跳轉到第二部分代碼執行,需要更新的話執行更新操作,
生成兩個專案代碼:
這里將第一個專案代碼稱之為Bootloader程式,第二個專案代碼稱為APP程式,他們存放在STM32 FLASH的不同地址范圍,一般從最低地址區開始存放第一個專案代碼,緊跟其后的就是第二專案代碼,當然如果記憶體夠,可以再緊跟多個APP程式,并且,這個APP程式,可以放到FLASH中,也可以放到SRAM中運行,
兩個專案代碼燒錄:
第一部分代碼必須JTAG 或ISP燒入;第二部分代碼可以使用第一部分代碼的IAP功能燒入,也可以和第一部分代碼一起燒入,以后需要更新程式時再通過第一部分IAP代碼更新,
STM32正常運行流程:

如上圖所示,STM32F4的內部FLASH位于Block 0,地址起始于0x0800 0000,一般情況下,程式檔案就從此地址開始寫入,程式啟動后(這里程式啟動應該指上電,根據啟動檔案描述:系統上電復位后執行的是由匯編撰寫的啟動檔案,啟動檔案主要包含:初始化堆疊指標、初始化PC指標、初始化中斷向量表、配置系統時鐘、進入main函式),將首先從“中斷向量表”取出復位中斷向量執行復位中斷程式完成啟動,cortex-m4內核的“中斷向量表”起始地址是0x0800 0004,當中斷來臨,內部硬體機制會將PC指標定位到“中斷向量表”處,取出對應的中斷向量執行中斷服務程式,執行完復位中斷后,會跳轉到main函式,如果再發生中斷,STM32會強制將PC指標指到中斷向量表處執行中斷完后再繼續運行main函式,

加入IAP之后的運行流程:

如上圖所示,對應的兩個專案的程式存盤地址,IC復位后,還是從0x0800 0004取復位中斷向量的地址并跳轉到中斷服務程式,再運行完后,跳轉到IAP的main函式,之后執行新的程式的復位中斷、main函式,并回應其他中斷,執行的是上圖下面灰色的部分,不同的是,在CPU得到一個中斷后,PC指標將強制跳轉到0x0800 0004中斷向量表處,而不是新程式的中斷向量表,
那么,新的程式必須在IAP程式之后的某個偏移地址開始,新的程式的中斷向量表也需要相應的移動偏移量,
如何配置/撰寫IAP程式:
APP偏移地址配置:
在options for target選型的target頁面下,IROM1的起始地址一般為0x0800 0000,大小為0x0010 0000,即從0x0800 0000開始的1024K空間是程式存盤區,而若將此起始地址設定為0x0801 0000,相當于偏移量0x10000(64K位元組),那么留給APP用的flash區域就只有0x0010 0000-0x10000=0xF0000(960K位元組),
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
偏移量在systemInit()函式中定義了,如上圖所示,一般不會在系統檔案中修改code,而在flash的APP的main函式最開頭處添加偏移量配置,那么:
1.如果不使用IAP功能,是否還需要設定偏移量?
· 2. 偏移量我的理解是設定APP程式的起始地址,而如果在APP的main函式中才定義偏移量,是不是有誤?
3. 偏移量的目的只是將flash程式與IAP的程式區分開?
如下圖所示:

燒錄配置:
MDK默認生成的檔案是.hex檔案,而IAP更新希望用的是.bin檔案,通過MDK自帶的fromeif.exe可以將.axf轉換成.bin檔案,
IAP程式撰寫:
在實作韌體升級的功能中,需要先撰寫IAP程式,包含1)撰寫函式將串口接收到的資料Buf中的內容保存在flash中;2)寫一個函式實作IAP到APP的跳轉;3)撰寫main函式實作串口的接收,APP程式保存及跳轉,
最后:在查資料程序中遇到以下疑問,下面將疑問以及理解寫出,供由相同疑問的學者參考:(其實疑問在代碼中可以解決)
1. 上面的這種方式和我們普通運行的程式是否不一樣?區別?
這里需要說STM32編程的兩種方式,一種是在線編程 ICP,通過JTAG/SWD協議或者系統加載程式(bootloader)下載用戶應用程式到微控制器;一種是在程式中編程IAP,通過任何一種通信介面下載程式或者應用資料到存盤器中, 但是,IAP需要至少一部分程式已經使用ICP方式燒錄到FLASH中(bootloader), 同時,每種STM32芯片,雖然主存盤器結構可能不同,但是都“系統存盤區域”,該區域是留給ST自己用來存放芯片的bootloader,此程式在芯片出廠的時候已經固化在芯片內部,
STM32 啟動模式:B1=0,B0=1,程式從系統存盤器中執行啟動程式bootloader,也就是從串口下載程式到主程式中,B0=0,FLASH被選為啟動區域,執行寫入的應用程式,
2. 那么,自己寫的bootloader和系統存盤器里本身有的是否一樣?
不一樣,自己寫的bootloader 需要先通過ICP的方式下載到存盤區域中,然后再通過IAP下載應用程式,
3. 在上圖3中,執行bootloader程式會跳轉到IAPmain,那么IAP的地址是什么?如何實作的跳轉?
其實,IAP就是bootloader程式,他們只有一個Main 函式,執行完復位中斷會直接跳轉到main函式,
4. 偏移的地址根據描述是APP程式的起始地址,還需要再在APP程式中配置中斷向量表?
通過上面IAP的main函式可以實作跳轉到APP程式,但是新的程式的中斷向量表需要重新配置,不然沒辦法回應中斷,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/385890.html
標籤:其他
