分享我的GD32F450的IAP過程


最近一個項目使用GD32F450VI+ESP8266需要做遠程升級,基本參考正點原子IAP的那一章節,但是在GD32F450上卻遇到了問題,無法跳轉,然后使用正點原子的開發板stm32f429,以及stm32f103c8和gd32f103c8運行同樣流程的程序,卻又沒有問題,於是咨詢了一下GD的FAE后,才知道問題出在GD的FLASH的特殊性上。本文中就不對IAP的一般流程做介紹,只對GD32F4相較於stm32的特殊之處做出介紹。

在GD的F4的用戶冊中提到,“在閃存的前512K字節空間內,CPU執行指令零等待(在閃存大小等於256K或512K時,閃存全片執行指令零等待);在此范圍外,CPU讀取指令存在較長延時;”,GD的FAE告訴我,我使用的這款GD32F450VI只有前256K能夠實現零等待的,后面的速度都比較慢,所以需要在bootloader程序和APP程序的時鍾初始化中添加 RCC->CFGR |= RCC_CFGR_HPPE_DIV2; 這一句,並且APP程序需要在前256K之內,但是我用這個方式也沒有成功,不能從bootloader跳轉到app程序。后來我就自己重新試了一種方式,下面說明。

在我的APP程序中,一直使用的200M頻率,在自己的bootoloader程序中,使用主頻最高可以為140M,程序中頻率配置是使用stm32cube來配置的,實測72M、108M、120M都能夠正常跳轉。其他的都采用cube默認生成的配置就好。

我的FLASH分配如下圖:

 

紅圈中為全速運行,bootloader程序一般占用很小,大部分情況下16KB都能放下,我原來的程序是88K左右,考慮到以后升級的需要,雖然目前估計不會超過128K,但還是把扇區4和5都作為APP運行區,總共192K,應該能夠滿足大部分情況。APP為什么沒有從扇區1開始呢?因為從程序下載區copy到APP運行區,如果從扇區1開始,跨越的扇區太多,程序結構上復雜一些,我怕扇區越多越容易出錯,所以就固定使用扇區4和5,參考我文章的朋友可以根據自己的需求更改。在APP運行的時候,下載的bin文件將存放到扇區6、7,bootloader程序檢查之后把bin文件更新到APP運行的扇區4、5。 為了保證安全,我還把扇區8、9作為程序備份區,在出廠燒寫的時候,就把扇區4、5中的程序在扇區8、9也備份一下,萬一以后升級失敗,還能把扇區8、9中的程序恢復到APP運行區域。

至於怎么檢查升級后的APP程序能否正常運行,我是在APP運行之后在flash后面某個固定地址寫入一個特殊數值,bootloader程序每次去讀取它,如果連續幾次沒有讀取到正確的數值,則把扇區8、9中的程序恢復到扇區4、5中。目前經過我模擬,這種方式可行的。

本人第一次做IAP遠程升級,還不知道這種方式實際使用中有沒有考慮不周的地方,如果有什么錯誤歡迎指出。如果需要交流的,歡迎到GD32交流群205696642中來交流。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM