功能概述
BootLoader,顾名思义,就是驻留在ECU非易失性存储器(NVM)中的一段程序加载代码,每次ECU复位后,都会运行bootloader。它会检查是否有来自通信总线的远程程序加载请求(外部重编程请求,比如10 02),如果有,则进入bootloader模式,建立与程序下载端(通常为PC上位机)的总线通信并接收通信总线下载的应用程序、解析其地址和数据代码,运行NVM驱动程序,将其编程到NVM中,并校验其完整性,从而完成应用程序更新。如果没有来自通信总线的远程程序加载请求,则直接跳转到应用程序复位入口函数。
FBL刷写流程图

Start或者Reset以后,首先会检查是否有外部重编程请求(10 02),如果有重编程请求,此时就会直接进入BT的编程会话进行软件升级操作。
如果没有外部重编程请求,再检查APP是否有效,如果APP有效,就跳到APP默认会话;如果APP无效,就跳到BT里面的默认会话。
如果没有外部重编程请求,且APP有效,这时候就进入APP里的默认会话,在APP默认会话里请求10 03进入扩展会话,扩展也可以请求10 01进入默认会话,但是扩展会话请求10 02以后,就会把外部重编程位置1,也就是外部重编程有效,这时候再进行Reset操作,Reset相当于是一个开关,然后流程重新开始,外部重编程有效,进入BT里面的编程会话,就开始升级操作,升级完成后然后进行reset。
如果没有外部重编程请求,且APP无效,就会进入BT下的默认会话,走相应的流程,也会重新进行升级的操作,软件的升级就是在BT里的编程会话下完成,APP有效一般是跟Flash Driver擦除有关,在擦除前,我们就该把APP的有效位置0,防止擦除中Reset进APP,APP有效位置0的情况有,擦除前置0,APP扩展会话下使外部重编程标志位有效时使APP有效位置0
BT升级步骤
Step1:预编程
10 03 (Func) 进扩展
31 01 02 03 预编程检查(车速、转速)
85 02 (Func) 停止DTC状态位的更新
28 03 01 (Func) 禁通信
Step2:主编程
10 02 进编程会话
27 01 安全访问请求种子
27 02 安全访问发送密钥
#34 请求下载FlashDriver
#36 传输FlashDriver数据
#37 退出FlashDriver数据传输
31 01 02 02 完整性校验
31 01 FF 00 擦除内存,一般与APP大小相同
#34 请求下载APP
#36 传输APP数据
#37 退出APP数据传输
31 01 02 02 完整性校验
31 01 FF 01 兼容性校验,检查下载的内容与服务器的内存是否协调
Step3:后编程
#28 开启通信
#85 开启DTC
#11 Reset