|
前言 最近断断续续的在做基于STM32F103的UDS Bootloader,没有项目驱动,只是自己感兴趣。目前基本已经可以实现功能了,在此对做的东西进行一下总结,希望可以帮助到有需要的人。 - _5 F! j6 {7 P 内存分配
' W' j( A* v+ P2 f, @- D4 d 本次使用的单片机为STM32F103RCT6,flash大小256k,一个扇区2k,SRAM:48KB flash起始地址为0x8000000,大小为0x40000(16进制)—>262144字节(10进制)—>256KB RAM起始地址为0x2000000,大小为0xC000(16进制)—>49125字节(10进制)—>48KB+ m/ M% b, {. ~$ C+ U7 U 将flash划分为Bootloader和App两块 APP跳转到boot,这个标志放在ram中,但要保证软复位时不清除.3 R' e8 `; @/ L, n- W FlashDrive需要放到ram中,每次下载APP时先下载FlashDriver APP有效标志放入Flash中,每次刷写前清除标志,刷写成功后写入标志。 flash分配如下:
" C/ k2 I% L+ ?. F5 m0 v ram分配如下: + j; _( [4 D5 a+ V4 g
UDS诊断协议需求CAN ID及时间参数 波特率:500k # P0 k0 ~) h& y$ d. R) T" z; o9 U7 K物理寻址ID:0x7114 n$ J( t" W! U6 a5 D! j 功能寻址ID:0x7DF% f7 C; K; B3 W ECU 响应ID: 0x766% ]/ x* h; I L P2 Server:50ms P2 *Server:5000ms$ K8 r+ Q L' W- ` P2 Client:50ms P2 *Client:5000ms& G. e- M0 P1 {( D S3server:5000ms1 i5 o/ ]$ @0 v7 g& H S3client:2000ms2 V2 O% a0 P a( s, X" Q5 L. N STmin:20ms 连续帧协议数据单元发送的最小时间间隔6 b6 a, [! _( ?$ @0 y BlockSize:0 每一块中包含连续帧的个数' O/ a f( o/ u3 }/ `, n
CANFrameFillerByte:0x55 数据帧不满8byte时的填充值 , O/ M; `# _1 @/ f+ a: D! x7 r 诊断服务Bootloader诊断服务
APP诊断服务
( ]. v. @4 Y/ V DID 22服务的DID:$ S% ]3 n/ o } F1AA:读取版本号$ }, F) S: I$ a Routine Control DID:8 D* D& Y' A+ l$ L. { FF00:擦除内存 0201:检查预编程条件 FF01:检查编程完整性和兼容性* \5 g6 _3 w* z U5 y1 {0 U 2E服务的DID:; q" J2 t3 w6 N' s# X; U( ?7 y F15A -写指纹, d1 B+ r/ d/ ~2 Q 0 f% f$ \' L) ~ 刷写流程0 M3 d4 N/ ~8 e4 Z4 f预编程 1.进入扩展模式(功能寻址)10 83 (83表示不需要服务器应答)9 X# ~1 T' ]! z: n& Y# ?! ^- P6 c 2.检查预编程条件(物理寻址)31 01 XX XX,针对要刷写的ECU。一般就是检查供电电压,车速这些,如果厂家没指定,那么由ECU自己定义。如果ECU不满足预编程条件,则收到10 02进入编程模式时,返回0x22不满足条件否定响应。% z' o4 K8 e/ f! h1 q2 { 3.停止DTC设置(功能寻址),85 82(82表示不需要服务器应答) 4.禁止无关通讯(功能寻址),28 83 03(83表示发送和接收报文都禁止,且不需要服务器应答,第三位01表示是应用软件报文,第三位03则表示应用软件和网络管理报文都禁止)6 V. H3 H6 h$ P/ H a# ~1 @ 5.读取版本号(物理寻址)22 XX XX ,诊断仪读取当前ECU版本信息。5 X4 w. N4 F1 y- c# ~$ s
4 j3 L* y8 v! r) P 主编程 1.进入编程会话10 02 ,此时在APP中应该执行复位,然后进入boot中的编程模式9 p- w9 K- a* f4 x K$ u/ g7 I0 F) q % @# E" k+ g( n1 \6 l7 ^4 T# q2.请求种子 27 01(x根据主机厂给的等级来定)) L1 p) B% }: M' I+ J 3.发送密匙 27 02 key 4.解锁成功后,2E服务写入指纹信息。一般就是时间和设备号这些; g3 Z o9 s5 y `- V 5.下载flash驱动程序,34 36 37服务。因为bootloader里是不带驱动程序的,防止意外操作导致flash改变,程序出现异常,所以只在刷写的时候才允许操作flash。下载完成后一般还需要例程控制31服务进行完整性检查(CRC32校验)和依赖性检查(ecu指定,DID为FF01-14229-1规定)(该步骤暂时不做) 6.擦除内存,由31服务执行,具体的DID按14229-1应该为FF00,需要给定擦除的起始地址和大小。 d d& y0 A) n7 w 7.下载APP程序,34,36,37服务。下载完成后也需要例程控制31服务中的完整性检查(CRC32校验)和依赖性检查(ecu指定,DID为FF01-14229-1规定) @7 [' O$ P9 i. P G4 {: U* K* ? 8.ECU复位,一般发送11 01进行复位,复位完成后Flash驱动程序将被清除。避免意外激活这些可能会进行非预期的内存擦除或程序操作的代码。 2 f6 r4 p! }& M
3 K1 ~3 X" y- S8 g* ~) {0 @. F2 d 后编程 1.主编程完成后,ECU复位,诊断仪发送进入扩展模式10 83(功能寻址,不需要ECU回复)( B( D l" Q: @+ D0 E # f$ h m% u& k3 [4 q7 X7 a5 P* ^2.恢复通讯28 80 03(功能寻址,不需要ECU回复,03表示网络管理报文和应用报文都恢复)% `- Y4 V5 m8 W( A6 f2 N/ O 3.开启DTC诊断85 81(功能寻址,不需要ECU回复) 4.清除刷写ECU的故障信息(物理寻址14 FF FF FF): o! F! [* g, B) m 5.进入默认会话模式10 81(功能寻址)" E/ u! m# e G- k+ r: p* o& a0 F
$ S& K6 {/ w; }; H3 K; h. K 总结 理清需求后,再进行后面的软件开发就比较方便了。不论是开发下位机还是上位机,都需要参考这部分需求。在后面的文章中将会继续介绍软件的设计。 ) W/ h% k, N, o1 G 转载自: 汽车电子学习笔记 如有侵权请联系删除 |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版