文章

顯示從 7月, 2020 起發佈的文章

[應用] STM32 DFU (Device Firmware Upgrade)

圖片
DFU 說明         DFU (Device Firmware Upgrade) 顧名思義是升級晶片的韌體程式,這相當於嵌入式系統中的 bootloader 程式。一般來說,我們所開發設計的韌體程式會存放在晶片內建的 flash 或者外部的 flash、 NOR、NAND,而 DFU 程式就是為了更新放在那些 flash 裡的韌體。另外,更新的方式可以透過 RS-232、Ethernet、USB...等,從這些媒介收到更新的程式碼,再燒錄到所存放的對應位址。         對於 STM32 晶片來說,當電源啟動後,晶片第一執行的位址就是 0x8000000,所以我們把這一小段 DFU 程式安排在這個位址,此時 DFU 內部程式執行後,我們會設計成做個判斷「是否做韌體升級」,如果沒有的話,DFU 會將執行位址跳到 APP 定義的位址,如下圖所示。圖一中,APP 程式碼安排在 0x8003000 位址,這個位址可以自己定義,假如 DFU 程式碼比較大,勢必要將 APP 位址往後移,如果 DFU 程式碼較小,就可以將位址往前移。         如果判斷為更新韌體,這時 DFU 要啟動輸入媒介(RS-232、Ethernet、USB)的驅動,同時也要啟動寫入 flash 的驅動。將收到的韌體程式碼,逐步寫入 flash 裡面。接下來本文的例子是以 STM32 USB 的更新方式來說明,STM32 網站有提供 DFU USB 的範例程式。 圖一:STM 內部記憶體配置 位址安排         當我們用 KEIL IDE 開發環境編譯時,需要先配置程式碼儲存的地方,圖二和圖三分別是 DFU 和 APP 程式碼定義的位址,DFU 放置在 0x8000000,大小為 0x3000 ,然後 APP 程式碼則要放在 0x8003000 ,這就是程式碼配置的關鍵步驟。         此外,還要留意一點,由於 APP 程式碼起始位址已經偏移了,它的中斷向量表 Vector 位址也已經偏移了,所以我們必須要 APP 程式裡把新的中斷向量表做重新的 map,指向新位址。請參考底下這個函數                             NVIC_SetVectorTable ( NVIC_VectTab_FLASH, 0x3000 ); 圖二:設置 DFU 的