基于XCP(On CAN)协议的Bootloader升级方案

基于XCP(On CAN)协议的Bootloader升级方案


前言

本文展示了一种ECU设备的的升级方案。用户可以通过CAN网络通讯,实现的对ECU设备内部软件的升级。
此方案主要有以下特色:
1.功能全面:由于此方案使用了XCP协议栈,用户在不使用调试接口的情况下,即可实现对ECU内部的软件完成
升级、存储数据读写(通过a2l文件和工具可观测\改写C代码中声明的变量)、数据标定以及功能调试等。
2.代码标准化:此方案的软件使用了部分AUTOSAR架构中的标准模块,在网上拥有丰富的学习资源(例:
https://www.autosar.org/nc/document-search/)。
3.易移植:由于使用了AUTOSAR软件架构的标准模块,使得此方案中的代码可以很容易在其他项目中重复使用
(在STM32平台和TC27X平台已移植验证通过)。
实例中展示的是STM32F407平台下的源码,包括bootloader、和上位机程序。
上位机程序: https://download.csdn.net/download/weixin_38194877/20688243
Bootloader程序:https://download.csdn.net/download/weixin_38194877/20688267

在这里插入图片描述


一、ECU端设计

1.Flash分配

如下图,将MCU的Flash分为两个部分,一个存放bootloader程序(0x08000000–0x0800C000),另一个存放应用程序(0x0800C000–0x08080000),当MCU通过上电复位时默认的中断向量表的起始位置为0x08000004。上电复位后,程序首先从Bootloader程序的复位中断向量开始运行(即执行bootloader程序),在bootloader程序中,可以跳转至应用程序的复位中断向量位置去执行应用程序。在应用程序初始化阶段,需将中断向量表转移到应用程序所在的存储区域,否则在中断到来时,程序又会跳转至boot loader程序中。
在这里插入图片描述

2.软件架构层次图

由于boot loader程序功能比较简单,这里只用到了AUTOSAR软件架构中的几个模块,对于这些模块大家可以在 https://www.autosar.org/nc/document-search 查找如下文档:
AUTOSAR_SWS_DIODriver.pdf
AUTOSAR_SWS_PortDriver.pdf
AUTOSAR_SWS_FlsDriver.pdf
AUTOSAR_SWS_WdgDriver.pdf
...
USART模块不属于标准的AUTOSAR模块,这里主要用于串口输出调试信息。

在这里插入图片描述
下图为MCU端代码结构,可以下AUTOSAR标准文档中学习使用这些代码。
在这里插入图片描述

3.流程图

由于这里我们使用了XCP协议栈,这里可以很多复杂的操作。

在这里插入图片描述

4.源码

以下是一些关键的代码。

main.c

	AppEntrFuncType AppEntrFunc;
	uint32 MsCounter = 0;
	uint8 AppProgramFlag = 0;
	boolean LEDSt = FALSE;

	Xcp_GetState_t Xcp_State;

	Port_Init(Port_Config);
	MUSART_Init();
	Can_Init(Can_Config);
	CanIf_Init(&CanIf_Config);
	Xcp_Init(&Xcp_Config);

	printf("Start Bootloader !\r\n");
	Fls_Read(APP_FLASH_START_ADDR-1,&AppProgramFlag,1);
	CanIf_SetControllerMode(0,CANIF_CS_STARTED);
	CanIf_SetPduMode(0,CANIF_SET_ONLINE);

	while(1)
	{
   
		if(1 == MsCounter%5)
		{
   
			Xcp_EventChannel(XcpConf_XcpEventChannel_XcpEventChannel_daq5ms);
		}

		if(2 == MsCounter%10)
		{
   
			Xcp_EventChannel(XcpConf_XcpEventChannel_XcpEventChannel_daq10ms);
		}

		if(3 == MsCounter%100)
		{
   
			Xcp_EventChannel(XcpConf_XcpEventChannel_XcpEventChannel_daq100ms);
		}

		if(4 == MsCounter%1000)
		{
   
			LEDSt = !LEDSt;
			Dio_WriteChannel(Dio_LED1_Channel,LEDSt);
			Dio_WriteChannel(Dio_LED2_Channel,LEDSt);
			Dio_WriteChannel(Dio_LED3_Channel,LEDSt);
		}

		Xcp_MainFunction();

		MsCounter++;
		Delay(
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于XCP (on CAN) 协议bootloader 升级是一种用于改进和更新汽车电子控制单元(ECU)的软件的方法。该协议是在CAN总线上进行通信的一种标准化协议,可用于在ECU之间进行数据交换。 在进行基于XCP协议bootloader升级时,首先需要保证ECU具备XCP通信接口。ECU与升级工具之间通过CAN总线进行通信,由升级工具发送命令和数据到ECU,ECU则响应和执行这些命令以完成升级过程。 具体的升级过程如下: 1. 准备升级工具和升级文件:在执行升级之前,需要准备用于升级的工具和相应的升级文件。升级文件通常是经过厂商认证的固件更新包。 2. 建立通信连接:通过CAN总线将升级工具与要升级的ECU连接起来。升级工具将发送XCP命令来进行通信和协商升级的细节。 3. 发送升级命令:升级工具发送命令给ECU,指示ECU开始进入升级模式。ECU在收到命令后,进入升级模式,并等待接收升级文件。 4. 传输升级文件:升级工具将升级文件分成多个数据帧,并通过CAN总线逐个传输给ECU。ECU在接收到每个数据帧后,会进行校验和验证,确保数据的完整性和准确性。 5. 执行升级:一旦所有的数据帧都被成功传输,ECU会开始执行升级过程。ECU将使用接收到的升级文件来更新内部的固件或软件。 6. 验证升级:在完成升级后,ECU会发送确认消息给升级工具,表示升级成功。升级工具可以根据接收到的确认消息来验证升级的结果。 基于XCP (on CAN) 协议bootloader升级可以有效地更新汽车的ECU软件,提高车辆性能、安全性和功能。这种协议的使用可以确保升级过程的可靠性和稳定性,同时减少人工操作的复杂性和错误的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值