BootLoader的一点心得,记录一下

2019-07-20 23:25发布

本帖最后由 午夜狼嚎 于 2018-8-8 11:22 编辑

    在对STM32了解还不够,连FLASH和RAM都理不清的情况下,迫于需求要写BootLoader。经过奋战,现在能实现想要的效果,但还不够优化。写此贴记录一下心得,同时请大神指出我的错误理解与不足,并提出一些优化建议,谢谢!
    刚开始在网上找了一些资料和源程序,进行了一番琢磨,然后改了个雏形。
1、遇到的第一个问题就是地址问题:
    因为是模仿原子哥例程改的,例程里面有FLASH APP和SRAM APP两种,并且还有一个串口接收数据的SRAM区起始地址,刚开始对keil里面Target处地址设置比较迷。现在清楚我用的是FLASH APP,所以在IROM1处设置程序的存储的起始地址。而串口接收数据是缓存在SRAM里面,之前对FLASH不了解,以为串口接收的数据直接就存储在FLASH了,其实是缓存在SRAM里面,在程序中有个iap_write_appbin函数,就是将SRAM中缓存的数据(接收到的APP程序)写入FLASH对应地址。为了把APP写入对应的FLASH地址,需要在APP程序中设置IROM1的地址及范围,根据BootLoader及APP程序的大小来设置,并且需要在APP程序中进行中断向量偏移,就是用这个“SCB->VTOR”。
2、将地址摸清楚后,可以进行程序升级了,但是只能升级一次。也就是在BootLoader下载好后,将一个APP程序通过串口发送后可以实现功能,但是我想将另一个APP发送下去进行升级就不行。
无奈知识功底不够,只得进行各种尝试来实验了。
a、我首先对整个系统的运行进行了理解,我在BootLoader的main函数开头加了5s延时来等待,期间如果接收到新的APP,则进行升级。否则跳转至现有APP。这样一试就知道了开机后,程序还是先执行BootLoader,然后再跳转至APP的,并且这样可以实现多次升级,但是这样肯定不行的,这方法太土了。
b、《原子教你玩STM32》的IAP那章有一句话:“main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0x08000004中断向量表处,而不是新程序的中断向量表”。我的理解就是在APP执行过程中,如果串口接收到新数据,就会自动跳转至BootLoader的中断向量表查询中断,然后自然就进入了串口接收中断,接着就和第一个APP操作一样把新的APP写进去了。
    我用在线调试时,发现在发送第二个APP时并没有进入中断。然后抓了好久的头皮才有点头绪,既然当前正在执行APP程序,我是不是在APP里开启串口及中断,才会有相应的响应,于是我就这么尝试了,然后就OK了,所以刚开始是对那句话理解不够,对整个系统的运行理解也不够,任重道远!

现在不需要按键什么的,只要串口就可以实现升级了,想怎么生怎么生

文字功底不怎样,只能写成这样了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。