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默认采用了小端模式,符合一般逻辑,操作起来也比较容易。另外,一开始在调试的时候总是出现问题,最后确定是串口部分的原因,串口只需要开接收中断就可以了,我开了串口的另一个中断,一开始没当回事,也是教训,没必要的东西千万别打开!


yanhaijian 发表于 2016-2-29 22:42:42

几个注意点都提到了。

黑溱郎 发表于 2016-3-1 08:55:29

学习了,谢谢分亨。

Paderboy 发表于 2016-3-1 09:17:53

:loveliness::loveliness:学习学习。。

党国特派员 发表于 2016-3-1 09:19:56

这个要学习下。。。

trochili 发表于 2016-3-1 10:14:41

本帖最后由 trochili 于 2016-3-1 10:16 编辑

这个我写了好久,如果下载的bin很大超过sarm大小,你怎么处理的?

9robot 发表于 2016-3-1 11:02:16

我也是刚开始学习这个,采用的是最简单的方式,就是把接收的数据放在sram中,其限制就是bin文件和bootloader所占ram总和必须小于芯片总的ram,论坛里采用的方式有:.bin分多次发送,芯片多次接收,接收以此写一次。不过我还没去尝试:(

糖悦之果飞 发表于 2016-3-1 13:52:47

亲,可以将内容一并发到经验频道,很有机会获得每月之星的呢http://jingyan.eeboard.com/

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

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

这个功能我实现,在190的活动中我会放出代码来。

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

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

十分期待trochili大神将iap做的更完美,功能更强大!最近导师催论文,只能过段时间再搞了:'(
页: [1] 2
查看完整版本: 五、GD32F207的IAP下载