(四)基于 LIN 实践篇

IAP和OTA(基于LIN)

效果演示

LIN_test

由视频可以看到,开始我们烧录了Lin_uds_ota(boot)进入flash,之后用图莫斯进行LIN UDS固件升级可以正常更新app到flash 的0xc800地址上,然后读取出升级之后flash里边的内容,发现不仅有Lin_uds_ota(boot),也存在Tproject(app)。

操作要点

boot与app划分

首先需要划分boot和app在芯片flash的哪个地址,因为KF32A156MQV这块芯片flash起始地址为0x0000 0000,所以我将boot设置大小为48K,之后48-50K用于存储标志位,之后从50-512k设置为APP的存储区域。
分区

划分boot和app

关键代码解析

在这里插入图片描述

工程代码主要包含Lin.c、Lin_Uds.c、Lin_buffer.c、Lin_bootloader.c。
Lin.c:底层LIN总线驱动
Lin_buffer.c:是一个队列,可以存储最多64帧数据
Lin_Uds.c:主要用于解析单帧,首帧和续帧,把真正的有用的UDS数据保存起来。
Lin_bootloader.c:对接收来的UDS数据进行解析,每个不同的服务,处理不同的功能。

上位机设置

10服务,进入编程会话,
在这里插入图片描述

更新
在这里插入图片描述
11服务,复位
在这里插入图片描述

报文解析

“10 02”,切换为编程会话
在这里插入图片描述
“31 01 FF 00”,例程控制,用于擦除APP
在这里插入图片描述
“34 00 44 00 00 C8 00 00 00 51 E0”,要烧录到哪个地址,烧录多少字节,一次可以传输多少字节
在这里插入图片描述

“36 XX 数据1 数据2 数据3 数据4…”
在这里插入图片描述
36服务应答
在这里插入图片描述

37服务,退出传输
11服务,ECU复位
在这里插入图片描述

注意点:

1.在使用0x37服务的时候,如果每次传输刚好是1024字节的话,那没有问题,如果到最后不足1024字节,比如480字节,此时需要注意,要补足1024字节再烧录,因为这款芯片比较特殊,必须是1024的倍数。480烧录时烧录失败的,这也就是为什么视频最后boot_app.hex读取出来的值和app.hex对比后边有那么多FF,因为擦除也是填充的FF,所以,用FF代替不足1024字节的部分
在这里插入图片描述

2.在上位机发送比如0x36烧录程序的服务时,我们需要先发送 “7F SID 78” ,意思是让上位机先等一等,因为在将数据下载到flash是关中断的,不允许被打断的,这样子ECU就没法对上位机进行响应,烧录完数据之后,再给上位机肯定响应

 case 0x31:
      if((DataLen>=3)&&(pData[0]==0x01)&&(pData[1]==0xFF)&&(pData[2]==0x00)){//Erase Flash Memory
        printf("Erase Flash Memory\r\n");
        uint8_t res[2]={SID,0x78};//Request Correctly Received Response Pending
        LIN_BOOT_Response(0x7F,res,2);
        pData[3] = LIN_BOOT_EraseApp();
        LIN_BOOT_Response(SID|0x40,pData,4);
      }

尾声

网上关于LIN进行IAP的讲解很少,例程参考更是少只有少,本例程参照图莫斯管方提供的LIN UDS例程进行修改,该例程是基于stm32f405的。在此基础上适配了KF32A156MQV。在此感谢图莫斯官方。另外,如果文章有什么不对的地方,欢迎大家指正。

参考链接

hex文件解析
图莫斯提供的LIN UDS例程

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值