IAR和OTA(基于CAN)
效果演示
can_ota_new
从视频中可以看出,烧录Can_uds_ota(boot)进芯片,之后通过图莫斯可以接收到Tproject(app)并更新到flash指定地址空间中,拿beyond对比更新后flash里边的内容,可以发现与Boot和App对应上了。
注:Boot_App.hex和App.hex对比,最下边(Boot_App.hex)有红色多出的部分,那是因为KF32A156写flash一次最少需要写1024字节,小于1024会写入错误,所以我在App.hex后边不足1024的部分填充满到了1024字节。
Boot_App.hex和boot.hex对比,最下边(Boot_App.hex)有红色多出的部分,该区域是存储的boot和app的标志位,也是分别1024字节(前边的55AA55AA就是标志)。
Boot_APP <-> boot
Boot_APP <-> app
Boot、APP划分
需要更改一下链接文件。对于boot,更不更改链接文件无所谓,因为如果不更改的话,最开始烧录的默认是从0x0000 0000地址烧录,之后更新app进入,也不会去覆盖到boot的那一部分;对于app,就要更改链接文件ld了,它指示将app烧录的起始地址和空间大小。图莫斯ota进去的话也是根据这里的设置来配置的。
上位机配置
1.设置物理地址、功能地址、响应地址
2.进入扩展会话(10 03服务)
3.检测编程的前提条件(31 01服务)
4.关闭DTC设置(85 02 服务)
5.关闭非诊断通信(28 03服务)
6.进入编程会话(10 02服务)
7.解锁ECU(27服务)
ECU会有一个种子,将这个种子发送给图莫斯之后,图莫斯通过dll动态库里边的算法,计算出key,再将key和ECU计算出的key进行比较。图莫斯提供了dll的源码,可以直接在里边适配自己的算法。后边会提供。
8.接收烧录app.hex(34服务、36服务)
9.复位(11 01服务)
报文解析
简单看一下报文,和LIN篇的大同小异,本实验主要是实现一个框架,对关闭DTC,key值的计算,验证app有效性没有具体实现。只实现了烧录部分。
代码
#define UDS_ADDR_FORMATS NORMAL //NORMAL=0,EXTENDED,MIXED
int MaxSFDataLen=0;
int MaxFFDataLen=0;
int MaxCFDataLen=0;
int DataIndex=0;
if(UDS_ADDR_FORMATS==NORMAL){ //wuboyu:这里采样标准地址格式
MaxSFDataLen = UDS_MAX_DLC-1;
MaxFFDataLen = UDS_MAX_DLC-2;
MaxCFDataLen = UDS_MAX_DLC-1;
}else{
MaxSFDataLen = UDS_MAX_DLC-2;
MaxFFDataLen = UDS_MAX_DLC-3;
MaxCFDataLen = UDS_MAX_DLC-2;
buffer[DataIndex++] = UDS_EXT_ADDR;
}
if((DataLen+1) <= MaxSFDataLen){//SF
buffer[DataIndex++] = DataLen+1;//PCI
buffer[DataIndex++] = RSID;
for(int i=0;i<DataLen;i++){
buffer[DataIndex++] = *pData++;
}
uint8_t ret = CAN_UDS_SendData(buffer,DataIndex);
if(!ret){
return ret;
}
}else{//FF+CF
注意到这个UDS_ADDR_FORMATS没有?这个它其实是个宏定义,可以选择NORMAL, EXTENDED, MIXED,分别对应上一篇说到的寻址格式。处标准寻址外,其他的两种,“数据段”的第一个字节为扩展地址,第二个字节是PCI,之后才是真的有用的数据。
参考资料
在此特别感谢图莫斯提供的代码和技术支持,感谢!
CAN_UDS_OTA源码
27服务(生成.dll的源码)