9robot 发表于 2016-2-29 21:44:16

五、GD32F207的IAP下载

本帖最后由 9robot 于 2016-3-3 19:03 编辑

昨天把GD32F207的内部FLASH学习了一下,掌握了简单的页擦除和flash编程(32位数据)。今天迫不及待地想试试GD32用iap的方式下载应用程序。要想实现该功能,最重要的是制作一个bootloader。
bootloader程序中使用到的知识主要有串口(我用的是串口,当然也可以是USB、IIC、SPI等通讯方式)、内部FLASH编程,还有比较重要的是C中指针的知识,指针功能太强大了,也就让它的使用变得很复杂,一不小心会出错,扯远了。利用指针可以指向一个函数来实现程序的跳转,类似于调用。这部分知识,我参考了C primer plus 第五版第413页函数和指针的知识。
正常的代码执行流程如下图


iap程序是在FMC程序的基础上编写的,只有两个函数,一个函数是将串口接收到的bin文件写到设定好的flash地址中,第二个函数是跳转到app程序中,需要对中断向量表进行偏移设置。void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
      u32 t;
      u16 i=0;
      u32 temp;
      u32 fwaddr=appxaddr;//
      u8 *dfu=appbuf;
      for(t=0;t<appsize;t+=4)
      {
      
                temp=(u32)dfu<<24;
                temp|=(u32)dfu<<16;
                temp|=(u32)dfu<<8;
                temp|=(u32)dfu;
                dfu+=4;//
                iapbuf=temp;
                if(i==512)
                {
                  i=0;
                        GD32FMC_Write(fwaddr,iapbuf,512);
                        fwaddr+=2048;//
                }      
      }
      if(i)
                        GD32FMC_Write(fwaddr,iapbuf,i);//
}void iap_load_app(u32 appxaddr)
{
      if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)
      {
                jump2app=(iapfun)*(vu32*)(appxaddr+4);
                MSR_MSP(*(vu32*)appxaddr);
                jump2app();
      }
}               
bootloader是从0x0800000开始烧录的,那么app程序就必须另外开始烧录。bootloader会占据一定空间,所以app从0x08000000开始烧录,设置完之后,还需要将.hex文件转换为.bin文件
D:\Keil_v5\ARM\ARMCC\bin\fromelf.exe   --bin -o..\USER\Objects\Template.bin ..\USER\Objects\Template.axf
这是我的工程中需要设置的参数


同时,在app程序的主函数中做如下设置:

最后编译app程序,然后可以在工程设置的文件目录中找到.bin文件。完成上述工作后,找个串口调试助手,发送.bin文件就大功告成

我自己的总结,对于iap这部分,这次是照葫芦画瓢,参考了STM32的iap程序,区别是:参考的STM32工程对flash采用了半字编程,而GD32F207的库函数中只有对字的编程,但它是支持半字编程的,没有去自己重新写用半字编程的函数,修改了iap文件中的部分代码。GD32默认采用了小端模式,符合一般逻辑,操作起来也比较容易。另外,一开始在调试的时候总是出现问题,最后确定是串口部分的原因,串口只需要开接收中断就可以了,我开了串口的另一个中断,一开始没当回事,也是教训,没必要的东西千万别打开!


Roger Z 发表于 2022-4-20 16:50:51

:lol谢谢分享,最近一直被这个困扰

lixuhui112 发表于 2019-12-12 09:07:08

谢谢分享:lol:lol:lol:lol

zbber 发表于 2016-10-8 19:08:24

强烈支持楼主ing……

胤幻1988 发表于 2016-10-8 14:05:31

写的很好,谢谢了。

9robot 发表于 2016-6-17 18:10:36

trochili 发表于 2016-6-17 12:46 static/image/common/back.gif
上位机我也写了。最近换电脑,全丢了。

我打算这个暑假学学怎么编写上位机,还有就是如何在SRAM比较小时,完成下载。现在sram小就没办法

trochili 发表于 2016-6-17 12:46:17

上位机我也写了。最近换电脑,全丢了。

zznmylove 发表于 2016-5-19 09:20:14

谢谢分享,正是我需要的,但是,可否提供一个上位机工具呢

9robot 发表于 2016-3-3 17:04:02

trochili 发表于 2016-3-3 15:27 static/image/common/back.gif
这个功能我实现,在190的活动中我会放出代码来。

十分期待trochili大神将iap做的更完美,功能更强大!最近导师催论文,只能过段时间再搞了:'(

trochili 发表于 2016-3-3 15:27:47

9robot 发表于 2016-3-1 11:02 static/image/common/back.gif
我也是刚开始学习这个,采用的是最简单的方式,就是把接收的数据放在sram中,其限制就是bin文件和bootloade ...

这个功能我实现,在190的活动中我会放出代码来。
页: [1] 2
查看完整版本: 五、GD32F207的IAP下载

Baidu
map