
前言 最近断断续续的在做基于STM32F103的UDS Bootloader,没有项目驱动,只是自己感兴趣。目前基本已经可以实现功能了,在此对做的东西进行一下总结,希望可以帮助到有需要的人。 ![]() * U; D5 I# y' R4 b: |+ ]3 p; n' W 本次使用的单片机为STM32F103RCT6,flash大小256k,一个扇区2k,SRAM:48KB: r0 G+ a9 K2 F; V% ^, ]" \' q flash起始地址为0x8000000,大小为0x40000(16进制)—>262144字节(10进制)—>256KB RAM起始地址为0x2000000,大小为0xC000(16进制)—>49125字节(10进制)—>48KB" E: c0 Z& {) Q$ H6 I r 将flash划分为Bootloader和App两块$ W* @; W3 m. B$ t APP跳转到boot,这个标志放在ram中,但要保证软复位时不清除.# B, x( ^+ \' j1 e FlashDrive需要放到ram中,每次下载APP时先下载FlashDriver APP有效标志放入Flash中,每次刷写前清除标志,刷写成功后写入标志。 flash分配如下: ![]() ram分配如下: ; G& O$ j, T* O4 n1 r9 Z7 f/ [2 a9 b: ]/ B ![]() UDS诊断协议需求CAN ID及时间参数 波特率:500k* F, w o! H9 P. a# Q! Z 7 i' S, i0 V3 y0 d e+ ~物理寻址ID:0x711/ J: P/ D7 d+ b3 a' l9 K7 s; g 功能寻址ID:0x7DF. i0 O0 m, s- ~ ECU 响应ID: 0x766# f: K9 ~& t9 F: J! v0 [+ C P2 Server:50ms P2 *Server:5000ms P2 Client:50ms P2 *Client:5000ms S3server:5000ms- w2 j8 A. e" `9 U8 h- T6 h I S3client:2000ms1 F3 I$ A7 y+ K: I# v" o' u STmin:20ms 连续帧协议数据单元发送的最小时间间隔 BlockSize:0 每一块中包含连续帧的个数 ![]() . n& L8 }; X( R& E) i% C CANFrameFillerByte:0x55 数据帧不满8byte时的填充值 * L8 v& J# \2 f* x 诊断服务1 w D( k; ?, jBootloader诊断服务
APP诊断服务
DID 22服务的DID:$ e* e6 `* i( Q3 H1 S$ { F1AA:读取版本号4 r' u& B# Y6 `/ \2 W3 p$ v2 n+ b Routine Control DID: FF00:擦除内存# C0 s6 Y1 T8 S 0201:检查预编程条件* n% ~4 H N' K* h/ M ?% `& K FF01:检查编程完整性和兼容性# Z% N9 \1 \- f; ?* c6 U 2E服务的DID:& l. u6 B$ u+ w* s F15A -写指纹 预编程 1.进入扩展模式(功能寻址)10 83 (83表示不需要服务器应答) 2.检查预编程条件(物理寻址)31 01 XX XX,针对要刷写的ECU。一般就是检查供电电压,车速这些,如果厂家没指定,那么由ECU自己定义。如果ECU不满足预编程条件,则收到10 02进入编程模式时,返回0x22不满足条件否定响应。2 O; y" K+ j* v' d7 X 3.停止DTC设置(功能寻址),85 82(82表示不需要服务器应答)+ l. T( r, V( y 4.禁止无关通讯(功能寻址),28 83 03(83表示发送和接收报文都禁止,且不需要服务器应答,第三位01表示是应用软件报文,第三位03则表示应用软件和网络管理报文都禁止)! d5 S& G: C, i 5.读取版本号(物理寻址)22 XX XX ,诊断仪读取当前ECU版本信息。9 b) ^5 ^, k) S! \/ q; `- S, ~ , C% m! _+ C+ `. E ![]() 主编程 1.进入编程会话10 02 ,此时在APP中应该执行复位,然后进入boot中的编程模式 $ d) d1 Q. d, a/ x7 [* ~) d2.请求种子 27 01(x根据主机厂给的等级来定) 3.发送密匙 27 02 key" C9 \0 H4 H5 R" W 4.解锁成功后,2E服务写入指纹信息。一般就是时间和设备号这些) e% W4 ]. x& o5 X- p l 5.下载flash驱动程序,34 36 37服务。因为bootloader里是不带驱动程序的,防止意外操作导致flash改变,程序出现异常,所以只在刷写的时候才允许操作flash。下载完成后一般还需要例程控制31服务进行完整性检查(CRC32校验)和依赖性检查(ecu指定,DID为FF01-14229-1规定)(该步骤暂时不做)% W4 F& b' ]* ^0 K9 G1 ] 6.擦除内存,由31服务执行,具体的DID按14229-1应该为FF00,需要给定擦除的起始地址和大小。 7.下载APP程序,34,36,37服务。下载完成后也需要例程控制31服务中的完整性检查(CRC32校验)和依赖性检查(ecu指定,DID为FF01-14229-1规定) 8.ECU复位,一般发送11 01进行复位,复位完成后Flash驱动程序将被清除。避免意外激活这些可能会进行非预期的内存擦除或程序操作的代码。4 y M# e$ v' B, s& k ![]() 9 J8 d6 U" l) m5 a9 M$ r; f1 C : r q" X: h* q1 h, ~ 后编程 1.主编程完成后,ECU复位,诊断仪发送进入扩展模式10 83(功能寻址,不需要ECU回复) - s- Z G7 a, Y9 t+ ~' T2.恢复通讯28 80 03(功能寻址,不需要ECU回复,03表示网络管理报文和应用报文都恢复)4 o9 C% A) ~) @- d- S6 }9 v 3.开启DTC诊断85 81(功能寻址,不需要ECU回复) 4.清除刷写ECU的故障信息(物理寻址14 FF FF FF)& ]# q# `. M* d+ g, F( l 5.进入默认会话模式10 81(功能寻址) ![]() 8 J; [! w3 y. R3 ~/ o5 d) P1 l5 k" r( g 总结 理清需求后,再进行后面的软件开发就比较方便了。不论是开发下位机还是上位机,都需要参考这部分需求。在后面的文章中将会继续介绍软件的设计。 ! f4 L$ K- p6 K5 K w 转载自: 汽车电子学习笔记 如有侵权请联系删除 ) D+ U, @$ V# r4 ^0 v0 w+ M9 A# A) E! A9 S( g- A2 p |
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南