STM32F10x IAP固件升级

    前言:这是小编的第一篇博客,如有格式上的问题或者讲的不好的地方敬请谅解。小编之所以想写博客,是希望别的童鞋不要像小编那样走太多的弯路,甚至不惜花钱买了别人毫无参考价值的代码。
    关于IAP原理部分,小编相信你应该已经在别的童鞋的博客上看到过,这里小编就不重复那些内容,附上一个小编认为写的不错的链接供参考IAP原理
    看了IAP原理,相信大家都有自己的理解了,小编的理解用白话说就是:我们通过BootLoader程序,把APP程序存放在0x08000000+offset的flash之中,以后运行程序就是从0x08000000+offset开始。小编是个脑子不好使的人,一开始以为BootLoader是个什么了不起的东西,一看到BootLoader字眼就云里雾里的,到最后知道其核心就是flash写入还有程序跳转部分,一切便变得明了起来。其实到这里,IAP的内容几乎都差不多了,所以小编最主要是提供自己一路上遇见的问题,还有提供一些资料作为参考。
首先我们要搞清楚自己单片机的类型,我所讲解的是stm32f10x系列的单片机,虽然这类的单片机有很大的相似之处,但不一样的类型总归有些区别,待会小编会发一个关于stm32f103zet6的例程,当编程自己的单片机时一定要注意其类型是否一样,这里的区别会体现在其内存大小的不同,启动文件的不同,以及外设资源等区别。具体的移植到时可以自己网上搜索。小编第一个卡住的地方就是由于没注意到两种芯片不同的型号,还傻傻的不知道为什么例程都能出错。
    小编遇到的第二个问题是串口助手发送换行符的问题。我们都知道,一般发送信息,我们都会有一定的格式。小编当时也写了自己的格式,帧头,数据,校验,帧尾。问题就在串口助手的设置上。在波特率等串口配置上,小编相信大家没问题。但请一定不要发送换行符。我们接收到帧头之后,默认接下来的数据是作为数据段的,一开始小编发送了换行符,所以APP起始地址开头便存在换行符,导致接下来的校验if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x20000000)死活通不过。关于这句的解释,可以在IAP原理中翻阅找到解释,当然直接百度更快一些。
    小编遇到的第三个问题,也和串口有关。由于小编的板子没有指示灯或者屏幕作为APP程序是否更新成功作为依据,所以小编用的串口。在BootLoader程序里,我设置的波特率为9600,在APP中,我设置的波特率为115200,当我更新完程序时,由于波特率已经更换过了,导致接收到的数据出现错误,这也让小编懵逼了好一会,不过这种粗心的错误相信大家是不会犯的。这里是提醒大家APP的波特率设置最好与BootLoader一样,否则万一忘了就又要花冤枉的时间了。
    接下来我将讲一下BootLoader工程和APP工程的注意部分。
    关于BootLoader程序:其实这程序和一般的程序没什么区别,唯一的区别是存在跳转至APP的操作,关于flash操作的部分,已经集成为一个库文件,所以我们就不纠结于其如何实现,有兴趣的童鞋再自己去研究研究。我们需要注意的是FLASH_APP1_ADDR的设置,这是一个宏,指代你的APP的存储地址,这个就需要考虑你的BootLoader段的大小了,由于BootLoader占一定的大小,所以FLASH_APP1_ADDR的设置一定要在你BootLoader所在地址之后,而且由于FLASH读写是成块操作的(1块大小与芯片有关),所以FLASH_APP1_ADDR的设置应该为0x8000000+n*flash一页的大小(这点是我之后flash存数据时发现的,自己没有尝试过故意写错误的地址)。并且你也需要注意FLASH的大小,当APP的大小+BootLoader的大小要大于flash的大小时,你IAP升级就会出错。当然,如果FLASH够大,就不用担心这个问题,甚至可以写多个APP,根据开机时不同的状态运行不同的APP。我给出的例程中,APP数据是先全部接收到SRAM中,再写入到FLASH中,这会导致一个问题,就是APP程序超出SRAM的大小时,也将出错,所以我们可以边写入SRAM,边写入FLASH,小编本来担心写入FLASH不够快,但实践证明还是没问题的。这边讲一个特别重要的问题,就是你BootLoader中的中断用完后,一定要关闭,不然在APP中用到时会出现不知名的bug,明明程序跳转了且运行了,但是就是不按照你的想法去运作,这点真的很重要
    关于APP程序:首先我们需要设置APP程序的起始地址和存储空间大小,这个在我接下来给的资料中会教你如何实现,其次是设置中断向量表的偏移,同样在接下来的资料中会指出如何设置。这边值得注意的是,中断向量表的偏移一定要0x200的倍数,当然我只是针对了我用的stm32f103c8t6,其他的芯片我不能下此定论。还有,请注意你的中断向量表只设置一次,因为我的工程是别人的,他所用的模板中存在设置中断向量表的操作,而我一开始没发现,最后是他的设置覆盖了我的设置,导致一直运行不正确。最后是关于生成bin文件,小编会给出一个小软件,可以把HEX文件直接转换成bin文件。发送bin文件的程序的话,小编用XCOM V2.0,资料中也会给出。最后提醒一句,直接下载按以上步骤配置过的APP的hex工程是不能正常运行的,因为其存放区域从0x08000000开始,而你又配置了它从0x08000000+offset的地方开始运行,所以程序时不能运行的
    第一次博客的书写差不多该结束了,有错误或者不好的地方欢迎指出,最后附上资料链接:包括stm32f103zet6BootLoader的例程,IAP视频教程(视频是关于F4系列stm32的,但是由于代码差不多,且我们注重的是原理,所以根本不会影响到学习。况且以小编的智商都能懂,聪明的各位有什么不能懂的呢。),hex转bin工具,XCOM V2.0。资源链接

猜你喜欢

转载自blog.csdn.net/qq_36514344/article/details/83062463