boot程序即bootloader引导程序, 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,以及升级程序,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用系统准备好正确的环境。而这bootloader程序几乎大部分应用在CPU、ARM等芯片上。
而对于单片机来说,其boot并不复杂,因为厂家在出厂之前就已经默认了单片机的启动位置。除了具有多种boot启动方式的单片机以外,一般的单片机就只有默认的厂家启动方式。
提到boot,如果单片机有了一段boot代码(注意这里的boot虽然和LINUX系统下的boot相似,但也有区别,区别就在于存储的位置和启动位置不同,linux芯片的boot存在于外部FLASH等存储芯片,而单片机的boot其实就相当于存储在自身ROM的一段用户代码,通过这段用户代码跳转到另一端用户代码)。那么对于后续单片机的维护那将是非常方便的事。说到这里,就很清晰了 这就涉及到了IAP编程。而如果要实现IAP编程,那么实现单片机程序的跳转就是必须的了。
要实现程序跳转,如下几步既可以完成。
boot程序设置:
1、添加如下代码
JumpAddress = 0x2000; //复位地址
Jump_To_Application = (pFunction) (JumpAddress+1);
__set_MSP(JumpAddress); //将栈顶指针设置成栈顶地址
Jump_To_Application(); //设置PC指针为复位地址
2、设置 Options Target
同样的,对于app程序来说,就需要设置其对应的地址即可
app程序设置:
JumpAddress = 0x0;
Jump_To_Application = (pFunction) (JumpAddress+1);
__set_MSP(JumpAddress);
Jump_To_Application();
注意一点,如果app程序中包含中断的话,那么就需要把中断向量表的偏移与设置的起始地址一致。
以上就是boot程序和app程序的设置方法。
为了形象说明,在boot程序里用串口发送"BOOT",然后跳转到APP程序,app程序发送"APP",然后跳转到boot程序,循环往复
见如下视频展示的效果
app和boot程序跳转
以上就是boot和app程序的互相跳转,实现了跳转,那么对于后续程序的升级和维护(IAP)来说,就相当的方便了。
关注公众号“嵌入式软硬件爱好者” ,发送"跳转",获取boot和app互相跳转源码