基于S32K的油门踏板检测项目(基于CAN的Bootloader覆盖升级、回滚升级)

该项目利用NXP S32K118芯片和AS5147P传感器,实现车载油门踏板角度检测。通过CAN通信进行Bootloader覆盖和回滚升级。主机负责数据传输,从机执行升级并具备回滚机制。硬件包括S32K118、AS5147P和SPI接口。软件涉及Xmodem协议、Bootloader和传感器程序设计。
摘要由CSDN通过智能技术生成

项目概述

本设计模拟一个车载电子油门踏板检测系统,采用NXP汽车级主控芯片S32K118,使用磁角度传感器AS5147P来模拟检测汽车的油门脚踏板磁角度,采用CAN进行通信控制Boot升级。

要求

  • 使用S32DS
  • 全部硬件软件设计
  • 使用磁角度传感器检测油门脚踏板角度
  • 实现CAN代码升级
  • 升级固件实现常规覆盖升级、回滚升级2种

Bootloader介绍

升级是用户的程序在运行过程中对Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 通常实现功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如 USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在Flash不同区域中,当芯片上电后,首先是第一个项目代码开始运行,如果进行升级的话接收完代码数据擦写到相应的地址然后跳转执行。

第一份代码通过JTAG或者SWD烧入,第二份功能代码通过第一份代码接收擦写烧入。第一份代码我们称之为Bootloader程序,第二个功能代码称为APP程序。这两个程序存放在Flash的不同地址,一般刚一开始是Bootloader程序,后面紧接着是APP程序。本次项目因为要实现回滚升级,在升级失败的时候可以回到上一个版本的代码,所以本次Flash中存放两个APP代码。

原理设计

功能设计

本次项目主要分为两部分主机和从机。主机的功能是实现UART转CAN,进行升级代码的数据传输。从机主要是执行Boot程序,在进行升级后跳转执行APP程序,将测量的磁角度数据显示在OLED上。在这里插入图片描述

硬件设计

在硬件方面,主要是稳压电路传感器电路CAN收发器电路,比较简单。
在这里插入图片描述

软件设计

主机

主机流程

主机程序在上电之后,就开始等待PC上位机发送第一帧代码数据,当接收到一帧数据后,通过CAN发送一帧数据给从机,在收到从机的应答之后再发送下一帧数据,保证数据的同步性,最后在收到上位机发出的EOT结束信号结束接收数据。
在这里插入图片描述

Xmodem协议

数据通信采用Xmodem协议,Xmodem协议的细节可以看我另一个博客。主要流程如下图
在这里插入图片描述

代码
int main(void)
{
   
    flexcan_msgbuff_t recvBuff;
	uint32_t bytesRemaining = 0;
	uint8_t frame_buf[XMOLEN] = {
   0};

	GPIOInit();
	FlexCANInit();

	LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0);

	LPUART_DRV_ReceiveDataPolling(INST_LPUART1, frame_buf, XMOLEN); /* 接收第一帧数据 */
	while(LPUART_DRV_GetReceiveStatus(INST_LPUART1, &bytesRemaining) != STATUS_SUCCESS);
	CANSendData(&(frame_buf[DATABIT]), DATALEN);

	while(1)
	{
   
		CANRevData(&recvBuff); /* 接收从机的应答信号,有信号才传输下一帧 */

		Xmodem_CANSend(frame_buf, recvBuff.data, 700000);  /* Xmodem数据解析传输 */
	}
}

从机

从机流程

从机在一上电的时候执行Boot程序,等待是否进入升级模式倒数15秒,超时没有接收到信号,会跳转执行未升级的APP程序;如果在这期间接收到BOOT信号,则进入升级流程,不断接收代码数据并擦写到对应地址的Flash。如果长时间接收不到数据或者升级期间出现错误,就会进行回滚升级执行上一个版本的代码。最后接收到OVER命令结束升级,跳转执行升级APP程序。
在这里插入图片描述

升级方案

升级方案是两块Flash进行轮流擦写。初始化之后,先判断这次应该升级哪块Flash,接收到升级命令后,不断接收代码数据进行擦写,升级完毕进行跳转执行,升级失败进行回滚到另外一块Flash执行上次的代码。
在这里插入图片描述

区域划分

需要更改每个代码的链接文件来进行

  • 3
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值