好久没有写东西,前段时间发生了不少事情,现在终于能静下心来。停下脚步望望曾经的自己,一路走来,对技术的**是多么的可贵。人的时间是有限的,作为一个嵌入式工程师,对新技术的热爱和好奇心将产生前进的驱动力。至于可以达到怎样的高度,全看个人的执行力和自我约束,兴趣常常是最好的导向。 最近研究了下IAP bootloader的实现方法,这在产品设计中是非常有用的。所谓IAP就是在线应用编程,可以用于远程程序升级。比如我们设计了一个产品,使用较为复杂的工艺被封装在精美的外壳中,或者被用于偏远的场景,如果在使用过程中需要修改程序,使用烧写器烧写是非常麻烦的,费时费力。真正的工业产品几乎都会有自己的bootloader。
其实,实现自己的bootloader在原理上并不复杂,就是通过MCU的接口把外部新的程序文件烧写到其内部的flash中,然后去运行新程序。以前怎么也没想过如何在同一个flash里面运行毫无关系的两个程序,bootloader就可以实现。其核心跳转代码就只有三行:
app_program = (void(*)())((*(__IO uint32_t*)(ApplicationAddress+4)));
__set_MSP(*(__IO uint32_t*) ApplicationAddress);//初始化堆栈指针
app_program();//跳转到app程序去执行
其中ApplicationAddress,是应用程序在flash中存储的地址,ApplicationAddress+4就是复位中断向量地址,因为程序最开始都是去执行复位中断函数的。在这之前,先用一张图说明下stm32的正常启动过程。下图很好的说明了arm的启动过程,以及程序在flash中的存储方式:
|