做Bootloader(Boot)开发的小伙伴应该比较关注一个问题:“Application(App)程序升级,需要通过诊断服务($10 02/82),让程序进入编程会话(跳转到Boot),请求Boot升级新的App程序。问题来了:App如何将"请求升级"信息传递给Boot呢?” 进入编程会话会涉及一个Action,即:程序从App跳入Boot。因为App和Boot是独立的程序,会共用uC的资源,为了保证Boot使用uC资源的可靠性和安全性,App进入Boot程序之前,需要对App使用的资源进行去初始化(De-Init)操作,程序进入Boot程序之后,再重新初始化软/硬件资源。对于Boot,可以参考前文Bootloader开发:初识Bootloader。 既然需要重新初始化软/硬件资源,那么大部分的RAM区会被清零,Boot如何知道App有“升级请求”呢?其实,方式有多种,根据项目情况,选择适合的方式即可。 本文基于英飞凌tc3xx,分享一种方法:将诊断请求$10 02/82信息存RSTCON2寄存器,该寄存器特点:软复位,USRINFO位域不清零。 使用RSTCON2寄存器,实质是使用RSTCON2寄存器的USRINFO位域。RSTCON2寄存器有什么特点呢?如下所示: 根据手册的说明,USRINFO位域只有冷启动的时候,信息被清除,软复位的时候($10 02/82请求属于软复位),信息不清除。因此,可以利用该特性,在App中,向USRINFO位域写入“升级请求”信息(eg:10 02/82),程序跳转入Boot以后,Boot程序首先读取USRINFO位域信息,如果读取到10 02/82信息,则进入编程会话,执行App程序升级,否则,判断App Flag是否有效,如果有效则跳入App程序。 实现示意如下所示: 代码实现
Boot中的代码实现如下所示:
参考资料 |
|
来自: 开心果NeedCar > 《待分类》