目录
1、概述
2、如何在BootLoader响应10 02
2.1、实现流程图
2.2、实现方式(代码思路)
3、刷死拯救机制(100%能救活,适配各类控制器的方法)
3.1、强留Boot流程图
3.2、实现方式(代码思路)
1、概述
BootLoader作为升级APP程序必不可少的一环,作为固件烧录在MCU的固定地址(一般地址的较为考前位置),记录一下在日常工作中遇到的有关BootLoader的疑问点、比较值得记录点、一些使用方法等。
2、如何在BootLoader响应10 02
2.1、实现流程图
部分客户需求、刷写APP的时候,编程会话10 02 需要响应在BootLoader里面,之前一直对如何响应在BootLoader存疑,毕竟响应是Can发出去的,BootLoader没接收,怎么响应的呢?
响应流程如下
2.2、实现方式(代码思路)
前置条件:已经判断了重刷写标志位置位。
static const uint8 Boot_ReprogrammingResponse[8]=
{
0x06u,0x50u,0x02u,ADPT_SESSION_RESPONSE0,ADPT_SESSION_RESPONSE1,
ADPT_SESSION_RESPONSE2,ADPT_SESSION_RESPONSE3,CANTP_FRAME_PADDING_VALUE
};
(void)Canif_Write(ADPT_UDS_TX_HANDLE, (uint16)sizeof(Boot_ReprogrammingResponse),Boot_ReprogrammingResponse);
伪代码如下
void Fun(void)
{
If(Reprogramming == true)
{
Canif_Write(Handle,size,buff);
}
}
3、刷死拯救机制(100%能救活,适配各类控制器的方法)
目前项目中遇到一个问题,将英飞凌的Hex刷写进了NXP的芯片里面,上电就死机,由于BootLoader做法比较简单,刷错有时候也是不可避免。所以一般需要留一些后门比较好点。
3.1、强留Boot流程图
大概思路如下,软件流程图如下
3.2、实现方式(代码思路)
- 每次上电,前50ms不执行跳去初始化与跳APP的操作,执行诊断服务这一层的代码
If((stayinboottime == 0)&&(stayinbootFlag == 0)&&(AppValidFlag == 1))
{
X_DeInit();
Clear_Ram();
Go_App();
}
else
{
CanTp();
Uds();
}
在上电前的50ms,诊断服务判断会话模式,检测到10 03 将stayinbootFlag = 1,此时就会一直停留在Boot里面了,实现正常升级其他程序。