这里使用的是GD32F405RG,flash 为1M(0x08000000 - 0x080FFFFF),具体参考官方手册
因为每个芯片的falsh大小不一样,地址划分根据实际flash大小和自己的设计去分配就好, 自己的址划分如下 :
BOOT_ADDRESS:0x08000000 - 0x08003FFF 16k(扇区0)
APP_ADDRESS:0x08004000 - 0x0807FFFF 512k-16k=496k(扇区1-7)
Buffer_ADDRESS:0x08080000 - 0x080FEFFF 512k-4k=508k(扇区8-11)
Flags_ADDRESS :0x80FF000 -0x80FFFFF 4k(扇区11的最后4k)
IAP的升级思路基本是一样的,如图所示(懒得画图了,此图盗用(doge))
简单做了个usart接收的IAP升级方式,主要是USART+DMA+空闲中断接收,上位机发送上机命令,板子接收到升级命令后开始进行升级,上位机把bin文件按一帧1024个字节的方式进行传输,板子每接收到一帧就把数据写入到缓存区,上位机传输完发后发送一个结束命令。板子接收完毕则写入升级标志,然后跳转到boot执行复制,把Buffer的代码复制到APP地址,最后把PC指针指向APP。
以上是基本的思路,下面是代码过程
首先得写好写入和读出flash的代码,具体可参考官方的例程,兆易创新 (gd32mcu.com)
需要注意的是想要写入flash,必须先擦除,擦除flash按扇区擦除,官方的写入例程里包含了每次写入前的擦除对应扇区的操作,如果直接使用会导致把同个扇区之前的代码给擦除掉。
对此我们可以稍作修改,在写入前统一擦除buffer的扇区,然后可以一帧一帧地写入flash了
升级的接收模块:
当接收完成后,写入升级标志,然后跳转到boot进行复制
BootLoader:
vJumpToApplication():
USART 的配置就不附加,参考官方例程即可。
还需要注意的细节:
1、keil烧录时需要分配好烧录的地址,以免被覆盖掉
2、传输的文件是bin格式,flash上的类型是一个字,所以写入时记得以字的格式去写入
文章来源:https://www.toymoban.com/news/detail-532033.html
有任何问题可以留言交流,谢谢!文章来源地址https://www.toymoban.com/news/detail-532033.html
到了这里,关于GD32F4XX IAP升级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!