使用了STM32F407芯片,因为芯片内有1M的Flash,所以打算留两个APP区,采用OTA的方法,外部通过串口把数据传输进芯片,然后通过判断当前在哪个APP区,来擦除另一个APP区并且烧写数据进另一个区,是在APP中来烧写的,BootLoader只是负责跳转,之前遇到问题了在网上查了一下双APP区的资料很少,下面是这个过程中遇到的几个坑,记录一下。
1)使用Keil设置程序起始Flash地址为0x08010000,烧录进A区,BootLoader跳转正常,发送编译后的bin文件,固件升级程序开始运行,正常擦除和烧录进B区,但是跳转的时候一直跳转到了A区,但是试了修改keil起始地址为另一个区的起始地址,烧录进去后,使用Jlink监控发现跳转正常,一开始不了解bin文件的内容定义,只知道hex文件是有定义数据的起始地址,所以专门使用bin文件来做固件升级,以为bin文件只用直接烧录进去就行,后面对比了一下设置不同起始地址生成的bin文件,发现里面是不同的
使用在线Hex查看网站:HexEd.it — 基于浏览器的十六进制编辑器
下面是起始地址为0x08010000时候的bin文件
起始地址为0x08080000时候的bin文件
因为BootLoader跳转的时候,PC指针是需要跳转到起始地址+4的位置,因为我一直都是在0x08010000的起始地址下编译,所以生成的文件起始地址就是0x08010000,所以烧录到B区后,BootLoader读取到B区的Flash中存储的是0x0801xxxx,所以最后PC会跳转到A区去了
因为不想每次ota都要改起始Flash地址,解决的方式是比较简单粗暴的在A区的时候烧录程序到B区的话,把收到的数据做遍历,把0x0801xxxx的数据替换成了0x0808xxxx,同时不能把0x08010000替换成0x08080000,因为0x08010000是程序中定义的A区的起始地址,被替换了的话,后面程序会有问题运行需要A区起始地址的时候会操作B区的地址,比如擦除扇区。文章来源:https://www.toymoban.com/news/detail-813236.html
for(i=0;i<Data_Len;i++)
{
if(i%4 == 0)
{
if(DATA[i] != 0x00 && DATA[i+1] != 0x00 && DATA[i+2] == 0x01 && DATA[i] == 0x08)
DATA[i+2] = 0x08;
}
}
现在的处理方式很简单,有可能会出问题,大家有更好的方法可以分享一下,我学习学习文章来源地址https://www.toymoban.com/news/detail-813236.html
到了这里,关于STM32 跳转双APP区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!