主要的细节部分参考:基于STM32的简易Bootloader实现 - JiuLiBlog - 博客园这篇博文,写得比较较详细,这里是在他的基础上对部分内容做总结:
对bin文件的解释:
这个bin文件在ROM中的写入起始地址其实就应该是中断向量表的起始地址,若有偏移的话还应该加上偏移量,一般在bootloader中采用默认值,没有偏移,就是0x800 0000 。在APP函数中就会存在偏移量。
对中断向量表地址和复位函数地址的区分:
中断向量表:
中断向量表是芯片厂商默认的一些中断函数的入口地址组合成的一张表,它必须位于整个独立程序的最前面,紧接着就是复位函数,程序真正的执行就是从这个函数开始的。
中断向量的偏移我们可以通过下面方法来设置:
中断向量表的地址就是我们在升级中需要将应用程序写到ROM中具体对应的那个地址,用它作为起始地址,将整个应用程序的bin文件按顺序写入。
复位函数地址:
复位函数地址就是上面提到的在bin文件中读取的地址,它位于中断向量表的后面,它是编译器自动生成的,我们一般不做控制,在实际中可以看到它的值比中断向量表的值大。整个独立程序的执行就是从它开始的。
在实际操作中,我们可以通过下面的方式来实现程序切换到应用程序运行:
说明:app_addr变量表示程序在ROM中保存的地址值,其实就是中断向量表的起始地址
1:检查从bin文件读取的SP地址是否在合法的范围内
2:调用汇编语句将SP地址写入到内核SP寄存器中
3:从bin文件读取复位函数的地址
4:将复位函数的地址强制转换为函数指针类型
5:通过调用这个函数变量实现程序的跳转