[资源分享] CAN UDS升级实现

[复制链接]
13381|39
手机看帖
扫描二维码
随时随地手机跟帖
JasonLee27|  楼主 | 2021-6-15 10:53 | 显示全部楼层 |阅读模式
硬件平台:AC7811通用开发板  USB CANFD 200U
软件平台:keil 5.23  ZCANPRO

工程主要有3个,flash工程用于生成动态flash驱动。UDS_Demo是APP,主要实现接收10 02服务后执行复位并设置升级标志功能,里面协议处理没有实时更新,所以协议部分还是以UDSBoot_Demo为准,UDSBoot_Demo是boot,实现了UDS升级的大部分功能,包括安全访问,31,34,36,37服务等。tool里面为ZCANPRO下的ECU刷写设置示例(实测路径改变后会加载内容会变化)。以及算法dll库,算法只是做了个架子,实际应用应该使用自己的算法。
4049160c814dcd0d60.png

7460460c815f51f91a.png


canuds_nm.rar (4.3 MB)

使用特权

评论回复
评论
15051867613 2022-6-9 16:25 回复TA
请问 一下CANTp.c是干什么的,可以简单的说说吗,里面的东西和硬件没有关系吧 
评分
参与人数 1威望 +6 收起 理由
infofans + 6 赞一个!
Linley| | 2021-7-5 18:06 | 显示全部楼层
正在做这一块,感谢大神分享

使用特权

评论回复
评论
zwzzq 2021-7-16 17:56 回复TA
能分享下实现过程嘛,小弟也是第一次接触 
guijial511| | 2021-7-5 20:46 | 显示全部楼层
感谢分享

使用特权

评论回复
zwzzq| | 2021-7-14 19:22 | 显示全部楼层
这个是什么软件

使用特权

评论回复
评论
JasonLee27 2021-7-20 10:08 回复TA
@zwzzq :你可以把UDS理解成一个简单的互联网协议,15765就是TCP/IP,14229就是基于TCP/IP之上的协议,说白了就是对一串数据进行解析,然后标准里面定义了一些状态等等,比如会话状态,比如通信状态等等。 
zwzzq 2021-7-16 18:20 回复TA
@JasonLee27 :typedef struct { uint8_t curSessionState:3; uint8_t SecurityAccessState:2; UdsCCCtrlType CCCtrlType; UdsCCComType CCComType; UdsDTCSettingType DTCSettingType; uint8_t ECUResetType; uint8_t reqSid; }UdsCtrlType; 您好,第一次接触UDS,怎么理解UDS实现的过程; 
zwzzq 2021-7-16 18:18 回复TA
@JasonLee27 :typedef struct { uint8_t curSessionState:3; uint8_t SecurityAccessState:2; UdsCCCtrlType CCCtrlType; UdsCCComType CCComType; UdsDTCSettingType DTCSettingType; uint8_t ECUResetType; uint8_t reqSid; }UdsCtrlType; 您好,第一次接触UDS.怎么理解UDS实现的过程 
JasonLee27 2021-7-15 13:24 回复TA
周立功的ZCANPRO 
TomyStark| | 2021-7-16 12:14 | 显示全部楼层
本帖最后由 TomyStark 于 2021-7-16 12:22 编辑

有一点疑问,在Flash驱动的工程中,编译链接后导出的bin文件除了包括eFLASH_EraseSector、eFLASH_Program、eFLASH_ProgramCheck这3个函数外,相应的还包括了其它被这3个函数调用的子函数,通过反汇编查看这些函数的地址,都是位于0x00000XXX的地址上,而到了Bootloader的工程中,只对那3个函数的地址重定向到了RAM的实际地址,即对bin文件开头的12个字节的函数向量表中的3个函数指针的值加上0x2000F800变成RAM中的实际地址,而其它被这3个函数调用的子函数却没有重定向(例如EFLASH_PageErase、EFLASH_PageProgram、EFLASH_UnlockCtrl、EFLASH_LockCtrl……),实际在Bootloader中调用那3个函数应该会出问题吧
@JasonLee27

QQ截图20210716120457.png
flash驱动工程的map文件:
QQ截图20210716121938.png


flash驱动工程编译链接后的hex文件(bin文件内容也一样):
QQ截图20210716122100.png

使用特权

评论回复
评论
JasonLee27 2021-8-6 16:44 回复TA
@TomyStark :都是一样的,我也可以用宏来实现,只是我用了结构体 
TomyStark 2021-8-6 16:05 回复TA
@JasonLee27 :原来如此,我之前看了NXP的UDS实现,他们将Flash Driver工程中的擦、写函数中调用的子函数都改成了宏函数的形式(这就意味着不会有函数的跳转),我当时的猜测是在nxp gcc编译器环境下,编译后函数之间跳转是按照绝对地址来的,所以作为Flash Driver导出hex文件给Bootloader使用时需要更改为单级函数。 
JasonLee27 2021-8-6 13:22 回复TA
@TomyStark :代码还会逐渐完善,你的建议会考虑一下 
JasonLee27 2021-8-6 13:22 回复TA
@TomyStark :不用的,arm的相对跳转地址范围很宽,同一个工程里面的函数之间相互调用都不会涉及到绝对地址 
TomyStark 2021-7-21 13:47 回复TA
@JasonLee27 :另外您提供的这份UDS实现相比之前原厂提供的那一份完善了很多,请问贵公司有在gitee或者Github开源维护的计划否? 
TomyStark 2021-7-21 13:45 回复TA
@JasonLee27 :请问要实现编译链接后函数的调用是采用相对跳转的方式,需要在Keil中做其它的设置吗,我目前只是看到了启动文件(.s文件)和分散加载文件(.sct文件)有做修改 
JasonLee27 2021-7-20 10:06 回复TA
flash驱动工程内部的调用会使用相对跳转的方式,只要相互之间的偏移地址不变,放哪里都能跳转 
里面有晴雨| | 2021-7-17 08:50 | 显示全部楼层
感谢分享,话说什么叫UDS升级?

使用特权

评论回复
csjedi| | 2021-7-22 11:12 | 显示全部楼层
这个很赞

使用特权

评论回复
lzwujun| | 2021-7-23 12:53 | 显示全部楼层
不错,支持国产芯片!

使用特权

评论回复
JasonLee27|  楼主 | 2021-8-6 13:20 | 显示全部楼层
WJY19950827 发表于 2021-7-29 16:43
楼主,请教个问题,我将你的工程移植到7801的MCU上,发现这么一个问题,当App初始化运行到UpdateFlagAddr地 ...

#define UpdateFlagAddr  0x2000F700这个是通过宏定义了一个指向SRAM某一个空间的地址,7801的SRAM没那么大,所以这个地址是无效的,你要改小
这里注释错了,应该是64K,最开始是划了200K,因为UDS升级是先擦除app,区域设的太大,擦起来太久,为了省事就改小了。

使用特权

评论回复
评论
baoyingbin1989 2021-10-20 14:41 回复TA
请问用RAM 来存储标志位。从app跳转到boot,ram不会重新初始化丢失吗? 
单片小菜| | 2021-9-1 09:28 | 显示全部楼层
正在做这部分,有了楼主的帖子,学习了,很棒。

使用特权

评论回复
zuoluoting| | 2021-9-5 01:05 | 显示全部楼层
请问下Flash工程没有main函数怎么编译的?

使用特权

评论回复
zuoluoting| | 2021-9-6 10:43 | 显示全部楼层
请问下flash驱动,没有main函数怎么编译?能说下具体操作吗?多谢

使用特权

评论回复
chenjun89| | 2021-9-8 20:47 | 显示全部楼层
谢谢楼主分享,下载看看。

使用特权

评论回复
Bobby13| | 2021-9-12 18:57 | 显示全部楼层
哥哥,放gitee嘛,不用放github,方便分享,一起维护改进。

使用特权

评论回复
JasonLee27|  楼主 | 2021-9-14 10:15 | 显示全部楼层
zuoluoting 发表于 2021-9-6 10:43
请问下flash驱动,没有main函数怎么编译?能说下具体操作吗?多谢

sct分散加载文件里面把root段注释掉,启动文件去掉了__main,所以不需要有main函数

使用特权

评论回复
JasonLee27|  楼主 | 2021-9-14 10:15 | 显示全部楼层
Bobby13 发表于 2021-9-12 18:57
哥哥,放gitee嘛,不用放github,方便分享,一起维护改进。

没搞过,可以学习了解下先

使用特权

评论回复
baoyingbin1989| | 2021-10-20 14:39 | 显示全部楼层
JasonLee27 发表于 2021-8-6 13:20
#define UpdateFlagAddr  0x2000F700这个是通过宏定义了一个指向SRAM某一个空间的地址,7801的SRAM没那么 ...

请问用RAM 来存储标志位。从app跳转到boot,ram不会重新初始化丢失吗?

使用特权

评论回复
WJY19950827| | 2022-3-28 15:17 | 显示全部楼层
楼主,请教下,上位机将flashdriver的bin文件下载到RAM区域时,文件中是有地址的,但是是怎样指定长度的呢,只是找到地址但是也得需要读RAM区域读到什么地方结束吧

使用特权

评论回复
skyred| | 2022-4-6 15:28 | 显示全部楼层
uds是什么

使用特权

评论回复
chenjun89| | 2022-4-7 08:23 | 显示全部楼层
感谢分享,下载看看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则