文章目录
项目概述
本设计模拟一个车载电子油门踏板检测系统,采用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执行上次的代码。
区域划分
需要更改每个代码的链接文件来进行