STM32 跳转双APP区

使用了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区的地址,比如擦除扇区。

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;
	}
}

现在的处理方式很简单,有可能会出问题,大家有更好的方法可以分享一下,我学习学习

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值