
LIN诊断:实现基于UDS协议的OTA升级功能代码及资料(含AB面升级、上位机源码、MCU
端源码等)
最近在折腾LIN总线下的OTA升级项目,发现这玩意儿虽然不如CAN总线常见,但在某些低端车载场
景里真香。刚好手头有个基于复旦微FM33LE015A的方案,支持AB面升级的bootloader设计,今天就跟大伙
唠唠实现细节。
搞过车载的小伙伴应该知道,UDS诊断这玩意儿在CAN上用得飞起,但LIN上实现起来就有点...怎么
说呢?像是在乡间小道上开卡丁车。不过咱们的LIN协议栈处理得挺巧妙,特别是多帧传输这块。来看个处
理下载请求的代码片段:
```c
// UDS 0x34服务处理
void HandleRequestDownload(uint8_t* data) {
uint32_t startAddr = (data[2] << 16) | (data[3] << 8) | data[4];
uint32_t dataSize = (data[5] << 16) | (data[6] << 8) | data[7];
if(CheckMemoryRange(startAddr, dataSize)) {
currentAddress = startAddr;
remainingBytes = dataSize;
SendPosResponse(0x74, NULL, 0); // 回复最大包长度
} else {
SendNegResponse(0x34, 0x31); // 参数错误
}
}
```
这代码有个小机关——CheckMemoryRange函数里其实暗藏AB面校验。比如当擦写地址落在APP_B分区
时,会自动触发先验校验证书有效性的操作,防止手抖把整个系统干废。
说到双分区升级,bootloader里最刺激的当属切换分区时的跳转操作。看看这个乾坤大挪移:
```c
void JumpToApplication(uint32_t appAddress) {
typedef void (*pFunction)(void);
pFunction Jump_To_App;
__disable_irq();