GD32F4XX IAP升级

这里使用的是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上的类型是一个字,所以写入时记得以字的格式去写入

有任何问题可以留言交流,谢谢!

猜你喜欢

转载自blog.csdn.net/cuncun666/article/details/128241741