STM32 跳转双APP区

这篇具有很好参考价值的文章主要介绍了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文件

mcu 双app,stm32,单片机,嵌入式硬件

 起始地址为0x08080000时候的bin文件

mcu 双app,stm32,单片机,嵌入式硬件

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

现在的处理方式很简单,有可能会出问题,大家有更好的方法可以分享一下,我学习学习文章来源地址https://www.toymoban.com/news/detail-813236.html

到了这里,关于STM32 跳转双APP区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包