五、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默认采用了小端模式,符合一般逻辑,操作起来也比较容易。另外,一开始在调试的时候总是出现问题,最后确定是串口部分的原因,串口只需要开接收中断就可以了,我开了串口的另一个中断,一开始没当回事,也是教训,没必要的东西千万别打开!
几个注意点都提到了。 学习了,谢谢分亨。 :loveliness::loveliness:学习学习。。 这个要学习下。。。 本帖最后由 trochili 于 2016-3-1 10:16 编辑
这个我写了好久,如果下载的bin很大超过sarm大小,你怎么处理的? 我也是刚开始学习这个,采用的是最简单的方式,就是把接收的数据放在sram中,其限制就是bin文件和bootloader所占ram总和必须小于芯片总的ram,论坛里采用的方式有:.bin分多次发送,芯片多次接收,接收以此写一次。不过我还没去尝试:( 亲,可以将内容一并发到经验频道,很有机会获得每月之星的呢http://jingyan.eeboard.com/ 9robot 发表于 2016-3-1 11:02 static/image/common/back.gif
我也是刚开始学习这个,采用的是最简单的方式,就是把接收的数据放在sram中,其限制就是bin文件和bootloade ...
这个功能我实现,在190的活动中我会放出代码来。 trochili 发表于 2016-3-3 15:27 static/image/common/back.gif
这个功能我实现,在190的活动中我会放出代码来。
十分期待trochili大神将iap做的更完美,功能更强大!最近导师催论文,只能过段时间再搞了:'(
页:
[1]
2