1. 程式人生 > >一種基於STM32的APP和BootLoader設計的方法

一種基於STM32的APP和BootLoader設計的方法

IAP(In Application Programming)即在應用程式設計, IAP 是使用者自己的程式在執行過程中對User Flash 的部分割槽域進行燒寫,目的是為了在產品釋出後可以方便地通過預留的通訊口對產品中的韌體程式進行更新升級。 通常實現 IAP 功能時,即使用者程式執行中作自身的更新操作,需要在設計韌體程式時編寫兩個專案程式碼,第一個專案程式不執行正常的功能操作,而只是通過某種通訊方式(如 USB、 USART)接收程式或資料,執行對第二部分程式碼的更新;第二個專案程式碼才是真正的功能程式碼。這兩部分專案程式碼都同時燒錄在 User Flash 中,當晶片上電後,首先是第一個專案程式碼開始執行,它作如下操作:

1)檢查是否需要對第二部分程式碼進行更新
2)如果不需要更新則轉到 4)
3)執行更新操作
4)跳轉到第二部分程式碼執行

第一部分程式碼必須通過其它手段,如 JTAG 或 ISP 燒入;第二部分程式碼可以使用第一部分程式碼 IAP 功能燒入,也可以和第一部分程式碼一起燒入,以後需要程式更新時再通過第一部分 IAP程式碼更新。我們將第一個專案程式碼稱之為 Bootloader 程式,第二個專案程式碼稱之為 APP 程式,他們存放在 STM32F4 FLASH 的不同地址範圍,一般從最低地址區開始存放 Bootloader,緊跟其後的就是 APP 程式(注意,如果 FLASH 容量足夠,是可以設計很多 APP 程式的,本章我們只討論一個 APP 程式的情況)。 這樣我們就是要實現 2 個程式: Bootloader 和 APP。 –節選自正點原子戰艦開發板教程

在一般的工程應用中,我們都會給設計的程式預留升級功能,升級的方式可以是串列埠、網口、SPI、USB等等,只要是可以傳輸資料都可以用來升級用。那麼這個時候我們就必須要設計一個BootLoader程式碼,這段程式碼有兩個主要功能
1) 接受需要更新的檔案,即APP程式碼,
2) 更新完成後跳轉到APP程式。

通常,我們的APP程式碼在除錯階段時,使用正常的開發模式,即不更改中斷向量表,當除錯完成後,再更改中斷向量表。

#ifdef WIFIUPDATA
    SCB->VTOR = 0x08000000 | 0x10000;       //0x08010000
#endif

然後編譯生成.bin檔案,最後通過BootLoader可以成功升級該韌體到目標MCU中。

在工廠生產中,我們可以使用Jflash工具把已經燒錄好的MCU的flash讀取出來,然後製作生成.hex檔案,最後直接把這份.hex檔案發給工廠,這樣出廠板子就帶了BootLoader和APP了,後續也可以通過BootLoader升級APP。