CAN诊断实现基于UDS协议的OTA升级功能代码及资料(支持AB面升级 )。 产品包括: 1...
CAN诊断实现基于UDS协议的OTA升级功能代码及资料支持AB面升级 。 产品包括: 1.升级上位机VS源码 2.MCU端源码bootapp包含UDS协议框架(tp层代码基于iso15765和常用SID服务代码基于iso14229) 3.CAN学习资料和ISO14229资料。最近在折腾CAN总线的OTA升级方案刚好手头有个基于UDS协议的AB面升级实现。这个方案最骚的地方在于用标准诊断协议玩出了固件空中升级的花活今天就跟大伙唠唠具体实现里那些有意思的坑。先说整体架构整个系统分三块打架上位机负责发号施令Bootloader负责接镖App负责躺平被替换。这里有个骚操作——用UDS的0x34/0x36/0x37这三个诊断服务直接传输固件数据包相当于把CAN总线当快递小哥使唤。看这段服务处理代码就明白了// UDS服务路由表 const tUDS_Service UDS_ServiceTable[] { {0x10, SessionControl}, // 会话控制 {0x34, RequestDownload}, // 请求下载 {0x36, TransferData}, // 传输数据 {0x37, RequestTransferExit}, // 请求传输退出 //...其他服务 }; // 固件数据传输处理 UDSServiceStatus TransferData(uint8_t *request, uint8_t *response) { uint16_t blockNum (request[1] 8) | request[2]; // 取数据块编号 uint8_t data[4096]; memcpy(data, request[3], request[0]-3); // 提取有效数据 Flash_Write(FLASH_ADDR blockNum*BLOCK_SIZE, data); // 写入Flash response[0] 0x76; // 正响应格式 response[1] blockNum 8; response[2] blockNum 0xFF; return POSITIVE_RESPONSE; }这代码有个隐藏技巧——用数据块编号直接算Flash地址偏移。好处是不用维护额外映射表但得确保上位机严格按照顺序发包。实测发现如果中间丢包整个升级直接翻车后来加了个CRC校验才稳如老狗。传输层TP的实现也够有意思。ISO15765的流控机制和CAN报文的定时发送掐得死去活来最后搞了个滑动窗口#define MAX_CAN_PAYLOAD 4096 static uint8_t tx_buffer[MAX_CAN_PAYLOAD]; static uint16_t window_size 8; // 动态流控窗口 // 发送多帧处理 void ISO15765_SendMultiFrame(uint8_t *data, uint16_t len) { uint8_t sn 0; uint16_t offset 0; // 首帧发送 SendSingleFrame(0x10 | (len 8), len 0xFF, data, 2); offset 6; // 首帧带2字节长度 // 连续帧发送 while(offset len) { if(WaitForFlowControl() TIMEOUT) { // 等流控帧 AbortTransfer(); return; } for(uint8_t i0; iwindow_size; i) { SendSingleFrame(0x20 | sn, 0, dataoffset, 0); offset 7; // 每帧7字节数据 sn (sn 1) % 16; if(offset len) break; } } }这段代码最坑的是流控帧的等待超时处理。最早没加超时机制遇到总线干扰直接卡死后来加了个30ms超时重试才解决。还有那个动态调整window_size的骚操作根据总线负载率自动缩放窗口大小实测传输效率能提升40%以上。CAN诊断实现基于UDS协议的OTA升级功能代码及资料支持AB面升级 。 产品包括: 1.升级上位机VS源码 2.MCU端源码bootapp包含UDS协议框架(tp层代码基于iso15765和常用SID服务代码基于iso14229) 3.CAN学习资料和ISO14229资料。AB面切换才是真·刺激战场。Bootloader里维护了个双备份结构体typedef struct { uint32_t magic_flag; uint8_t active_partition; uint32_t crc32; uint32_t version; } PartitionInfo; // 分区表存储在Flash最后4K #define PARTITION_TABLE_ADDR 0x0800F000 void SwitchPartition() { PartitionInfo *current (PartitionInfo*)PARTITION_TABLE_ADDR; if(current-active_partition PARTITION_A) { current-active_partition PARTITION_B; current-crc32 CalculateCRC(PARTITION_B_ADDR); } else { current-active_partition PARTITION_A; current-crc32 CalculateCRC(PARTITION_A_ADDR); } Flash_Erase(PARTITION_TABLE_ADDR); Flash_Write(PARTITION_TABLE_ADDR, (uint8_t*)current, sizeof(PartitionInfo)); }这个设计有个暗坑——写分区表前必须严格校验新固件的CRC否则切到坏镜像直接变砖。后来在Boot流程里加了三重验证CRC校验、向量表校验、栈指针校验确保万无一失。实战中发现OTA成功率受CAN总线负载影响极大。解决方法是在上位机加了智能重传机制——连续丢3个包就自动降速同时用0x78否定响应码通知上位机重传特定数据块。这个优化让升级成功率从75%直接飙到99%。代码仓库里还有个骚气功能——模拟器模式。把CAN驱动替换成虚拟总线直接在本机跑完整升级流程。这对调试帮助巨大毕竟不用每次都烧录到板子上测试。不过要小心虚拟模式和实际硬件的时序差异有些死锁问题只在真机上才会暴露。最后给个忠告OTA安全千万不能马虎项目里实现了简单的签名验证用的是ECC算法。虽然比不上专业的HSM但总比裸奔强from ecdsa import SigningKey sk SigningKey.generate() # 生成私钥 vk sk.verifying_key # 公钥烧录到MCU with open(firmware.bin, rb) as f: firmware f.read() signature sk.sign(firmware) # 将签名附加到固件尾部 with open(signed_firmware.bin, wb) as f: f.write(firmware) f.write(signature)这套方案虽然比不上AES加密但胜在资源占用小。STM32F103这种老爷车都能跑起来实测签名校验代码只占2KB Flash真·贫民窟方案。玩转UDS OTA的核心秘诀就八个字分而治之冗余校验。把升级流程拆成无数个小步骤每个环节都做好错误恢复。代码里那些看似多余的校验关键时刻都是救命的稻草。

相关新闻

基于双向DC - DC变换器(DAB)的储能系统控制仿真探索

基于双向DC - DC变换器(DAB)的储能系统控制仿真探索

Matlab/Simulink仿真模型,基于双向DC-DC变换器(双有源桥变换器DAB)的储能系统控制仿真模型,采用电压电流双PI闭环控制策略,单移相控制,在母线电压受到外界干扰的情况下,通过控制电池的充电和放电…

2026/7/3 12:06:18 阅读更多 →
详解自动化安全扫描:用 OWASP ZAP 与 Nuclei 体检你的 CSP/MIME 配置

详解自动化安全扫描:用 OWASP ZAP 与 Nuclei 体检你的 CSP/MIME 配置

在很多团队里,CSP(Content-Security-Policy)和 MIME 相关安全响应头(例如 X-Content-Type-Options、正确的 Content-Type 等)往往是“写过一次就不再管”的存在: 上线前从某篇文章抄了一段配置,…

2026/5/17 5:55:55 阅读更多 →
纠结,有必要和领导发拜年短信吗?

纠结,有必要和领导发拜年短信吗?

大年二十九的晚上,脑子里闪过一个念头:今年,还要不要给领导发拜年短信?这个问题,曾经困扰了我很多年。发吧,不知道说啥,复制粘贴的群发文案太假,自己写的又怕词不达意,更…

2026/5/17 5:55:54 阅读更多 →

最新新闻

IPC-2152 标准实战:3个关键参数与5种PCB场景下的走线/过孔通流计算

IPC-2152 标准实战:3个关键参数与5种PCB场景下的走线/过孔通流计算

IPC-2152标准实战:3个关键参数与5种PCB场景下的走线/过孔通流计算当你在设计一块需要承载大电流的PCB时,是否曾为选择合适的走线宽度和过孔尺寸而纠结?过宽的走线会占用宝贵的布线空间,而过窄的走线又可能导致过热甚至烧毁。IPC-2…

2026/7/6 7:39:13 阅读更多 →
AD5593R与PIC18F46K80的嵌入式信号处理系统设计

AD5593R与PIC18F46K80的嵌入式信号处理系统设计

1. AD5593R与PIC18F46K80的硬件协同设计AD5593R作为一款8通道12位精度的ADC/DAC转换器,与PIC18F46K80微控制器的组合在嵌入式信号处理领域展现出独特的优势。这个组合的核心价值在于实现了模拟信号采集与数字信号处理的无缝衔接。1.1 芯片选型与技术参数解析AD5593R…

2026/7/6 7:37:13 阅读更多 →
PIC18F85K22外扩EEPROM存储方案与I2C接口优化

PIC18F85K22外扩EEPROM存储方案与I2C接口优化

1. 为什么需要外扩EEPROM存储空间?在嵌入式系统开发中,PIC18F85K22这类微控制器虽然功能强大,但其内部存储资源往往有限。以PIC18F85K22为例,其Flash程序存储器最大为64KB,RAM为3.8KB,而内部EEPROM仅有1KB。…

2026/7/6 7:37:13 阅读更多 →
M95M04 EEPROM与PIC18F55K42嵌入式存储方案详解

M95M04 EEPROM与PIC18F55K42嵌入式存储方案详解

1. 硬件选型与核心特性解析在嵌入式系统中实现用户偏好、日程设置和自定义配置的持久化存储,M95M04 EEPROM与PIC18F55K42的组合堪称经典搭档。M95M04是ST(意法半导体)推出的4Mbit(512KB)串行EEPROM,采用行业…

2026/7/6 7:37:13 阅读更多 →
告别下载焦虑:3个实战场景教你玩转流媒体视频保存

告别下载焦虑:3个实战场景教你玩转流媒体视频保存

告别下载焦虑:3个实战场景教你玩转流媒体视频保存 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE 你…

2026/7/6 7:35:12 阅读更多 →
ncmdump终极指南:5分钟掌握网易云音乐NCM转MP3完整免费解决方案

ncmdump终极指南:5分钟掌握网易云音乐NCM转MP3完整免费解决方案

ncmdump终极指南:5分钟掌握网易云音乐NCM转MP3完整免费解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾被网易云音乐下载的NCM格式文件困扰?想要在车载音响、手机播放器或任何设备上自由播放…

2026/7/6 7:33:11 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻