有没哪位大哥弄过stm32的一个BootLoader和两个app程序的跳转啊?

2019-10-16 04:59发布

最近在弄一个程序碰到个问题,就是编译app程序的时候一定要配置IAR里的一个地址,而且这个地址就是烧写程序到flash上的地址,有没有办法就是不配置IAR的地址信息,然后app程序随便下载到flash的某块地址上,通过BootLoader进行跳转。就是在片内flash的0x08000000上烧一个BootLoader,然后在0x08005000的地方上有个app1程序,在0x08012800的地址上有个app2程序。
执行过程的话是芯片上电运行bootloader,在BootLoader中判断一个标志位决定是跳转执行0x08005000的app1还是0x08012800的app2。如果执行0x08005000的app1,在app1中实现从远程将一个app程序写在0x08012800的flash让它成为app2,然后设置标准位,最后关闭中断软件复位,通过BootLoader跳转到app2去执行程序。

一句话就是通过app1程序下载app2程序然后复位执行app2程序,还可以通过app2程序下载app1程序然后复位执行app1程序
问题就是怎么编译app程序让app既可以放在app1位置也可以放在app2位置上?
表达能力有限多多见谅哦
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
正点原子
1楼-- · 2019-10-16 07:33
你可以修改flash算法,利用仿真器将代码烧写到指定区域(注意擦除是整个扇区擦的,所以代码的起始地址,最好是一个扇区的起始地址,另外不要勾选全片擦除!),这可以解决你下载2个APP的问题,用仿真器下载。.
至于你说的两个APP互相跳转,当然是没有问题的,你只要逻辑上设计好,就OK的了。

神的诱惑
2楼-- · 2019-10-16 08:35
yklstudent 发表于 2016-11-30 19:43
能玩一个就能玩两个,不过觉得一般也用不着

理是这个理,主要是还需要用两个app来达到远程升级这个目的,如果只执行一个app的话还要对flash进行两次擦除和写入,时间久了,应该会对flash有影响吧。
密耳
3楼-- · 2019-10-16 13:28
神的诱惑
4楼-- · 2019-10-16 15:02
 精彩回答 2  元偷偷看……
zc123
5楼-- · 2019-10-16 18:27
单靠KEIL目前没有这个功能,研发时都是下两次,不过量产后我是用UBIN(http://www.pc6.com/softview/SoftView_90998.html) 这个软件把BIN文件合成一个,用JLINK下载一次就可以
神的诱惑
6楼-- · 2019-10-16 23:39
正点原子 发表于 2016-11-30 18:11
你可以修改flash算法,利用仿真器将代码烧写到指定区域(注意擦除是整个扇区擦的,所以代码的起始地址,最 ...

感谢原子哥的回帖
我的想法是说一般情况下就通过BootLoader读取一个标志位跳转到app1执行app1代码,突然某天想升级了,就在app1的代码中的一个下载功能把程序烧到app2的位置上更改标志位,下次运行的时候就从BootLoader读取标志位后跳到app2一直执行app2代码,以后又想升级了,再通过app2把程序下载app1的位置上,这样一直重复下去。然后就想说有没有办法把app的程序编译链接成一个位置无关的.bin文件。
想法有点天真,不知道可行的程度有多高

一周热门 更多>