這里使用的是GD32F405RG,flash 為1M(0x08000000 - 0x080FFFFF),具體參考官方手冊
因為每個芯片的falsh大小不一樣,地址劃分根據(jù)實際flash大小和自己的設(shè)計去分配就好,?自己的址劃分如下 :
BOOT_ADDRESS:0x08000000 - 0x08003FFF? ? ?16k(扇區(qū)0)
APP_ADDRESS:0x08004000 - 0x0807FFFF? ? ?512k-16k=496k(扇區(qū)1-7)
Buffer_ADDRESS:0x08080000 - 0x080FEFFF? ? 512k-4k=508k(扇區(qū)8-11)
Flags_ADDRESS :0x80FF000 -0x80FFFFF? ? ? ? 4k(扇區(qū)11的最后4k)
IAP的升級思路基本是一樣的,如圖所示(懶得畫圖了,此圖盜用(doge))
?簡單做了個usart接收的IAP升級方式,主要是USART+DMA+空閑中斷接收,上位機(jī)發(fā)送上機(jī)命令,板子接收到升級命令后開始進(jìn)行升級,上位機(jī)把bin文件按一幀1024個字節(jié)的方式進(jìn)行傳輸,板子每接收到一幀就把數(shù)據(jù)寫入到緩存區(qū),上位機(jī)傳輸完發(fā)后發(fā)送一個結(jié)束命令。板子接收完畢則寫入升級標(biāo)志,然后跳轉(zhuǎn)到boot執(zhí)行復(fù)制,把Buffer的代碼復(fù)制到APP地址,最后把PC指針指向APP。
以上是基本的思路,下面是代碼過程
首先得寫好寫入和讀出flash的代碼,具體可參考官方的例程,兆易創(chuàng)新 (gd32mcu.com)
?需要注意的是想要寫入flash,必須先擦除,擦除flash按扇區(qū)擦除,官方的寫入例程里包含了每次寫入前的擦除對應(yīng)扇區(qū)的操作,如果直接使用會導(dǎo)致把同個扇區(qū)之前的代碼給擦除掉。
?對此我們可以稍作修改,在寫入前統(tǒng)一擦除buffer的扇區(qū),然后可以一幀一幀地寫入flash了
升級的接收模塊:
?當(dāng)接收完成后,寫入升級標(biāo)志,然后跳轉(zhuǎn)到boot進(jìn)行復(fù)制
BootLoader:
?vJumpToApplication():
?USART 的配置就不附加,參考官方例程即可。
還需要注意的細(xì)節(jié):
1、keil燒錄時需要分配好燒錄的地址,以免被覆蓋掉
?2、傳輸?shù)奈募莃in格式,flash上的類型是一個字,所以寫入時記得以字的格式去寫入
文章來源:http://www.zghlxwxcb.cn/news/detail-532033.html
有任何問題可以留言交流,謝謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-532033.html
到了這里,關(guān)于GD32F4XX IAP升級的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!