文章目录

  • 1. 背景描述
  • 2. 准备工作
  • 2.1 工具&软件
  • 2.2 测试用例
  • 3. 功能测试
  • 3.1调试配置
  • 3.2 测试验证


1. 背景描述

最近和一些汽车电子客户交流了下XCP标定,了解到的大概流程如下:

  1. 首先对地址进行分区,分为工作页和参考页,工作页的地址为RAM地址,参考页的地址为Flash地址。同时分配工作页和参考页中的参数地址,要保证每个工作参数和对应的参考参数的地址偏移量是一样的。
  2. 上电之后,将参考页的参数(Flash区数据)拷贝到工作页的参数(RAM区变量)中,这个工作可以在主函数实现或者链接文件中实现。
  3. 然后在车辆运行时调整工作页参数,停车之后再调整对应的参考页参数。

但是这种标定方式对客户来说还是有些繁琐,如果有一个“掉电不丢失数据”的RAM区,那对客户来讲,操作就比较简单了。只需要将标定参数放在此区域中即可,不需要分工作页和参考页,同时标定完成之后也不需要将参数写入flash中进行保存。
下文基于S32K144开发板针对这种方式进行介绍,并用freemaster模拟XCP调整参数的过程。

2. 准备工作

2.1 工具&软件

  • S32K144EVB-Q100
  • S32 Design Studio for ARM 2.2
  • FreeMaster 2.5

2.2 测试用例

  1. 在S32DS 2.2 新建工程,选择S32DS Application Project这种方式,如下图所示:
  2. 给s32k工程加入freemaster支持_标定

  3. 关于S32DS Application Project和S32DS Project from Example两者创建工程方式的对比如下表,由于这次的例程需要修改ld文件,所以选择了前者的方式。

创建方式

S32DS Application Project

S32DS Project from Example

链接文件

工程目录下,可以修改

链接至安装目录下,不建议修改

SDK

工程目录下,不建议修改

链接至安装目录下,不建议修改

Generated Code

工程目录下

工程目录下

应用程序

工程目录下

工程目录下

创建速度



  1. 在ld文件中增加flexram区域的定义,如下图:
  2. 给s32k工程加入freemaster支持_标定_02

  3. 在main.c文件中使用attritube定义标定量,如下图所示:
__attribute__((section (".eeprom"))) volatile uint16_t cal_var_red_led = 0x0000;
  1. 完善功能代码,实现的功能为:
    使用变量cal_var_red_led控制PWM输出占空比,驱动RGB灯中的红光。上电重启后,红色LED的亮度不变。

元器件

S32K144

Red_LED

PTD15(FTM0_CH0)

  1. 创建对应的FreeMASTER工程,具体方法可以参考之前的文章:FreeMASTER快速入门

3. 功能测试

3.1调试配置

由于FlexRAM默认是未使用的,如果想要使用FlexRAM并配置成FlexRAM,需要重新分区。有两种办法:

  1. 在主函数中调用Flash初始化函数和分区函数,如下图:
/* Always initialize the driver before calling other functions */
ret = FLASH_DRV_Init(&Flash_InitConfig0, &flashSSDConfig);
DEV_ASSERT(STATUS_SUCCESS == ret);
/* Configure FlexRAM as EEPROM and FlexNVM as EEPROM backup region,
* For example on S32K144:
* - EEEDataSizeCode = 0x02u: EEPROM size = 4 Kbytes
* - DEPartitionCode = 0x08u: EEPROM backup size = 64 Kbytes */
ret = FLASH_DRV_DEFlashPartition(&flashSSDConfig, 0x02u, 0x08u, 0x0u, false, true);
DEV_ASSERT(STATUS_SUCCESS == ret);

其中:

  • S32K144的FlexRAM分配成4KB的EEPROM的Code为0x02,如下图所示:
  • 给s32k工程加入freemaster支持_工作页_03

  • S32K144的FlexNVM分配成64KB的EEPROM备份区域的Code为0x04或者0x08
  • 给s32k工程加入freemaster支持_标定_04

  1. 在Debug Configurations界面进行配置,如下图所示。此方法需要使用PEMicro厂家的调试器或者量产烧录器。

3.2 测试验证

  1. 由于是在ld文件中增加的flexram分区,此动作在调转main函数之前,所以选择使用OpenSDA进行分区操作。同时在控制台也能看到烧录器进行了分区操作,如下图所示:
  2. 给s32k工程加入freemaster支持_Code_05

  3. 打开之前准备好的FreeMASTER工程,连接上板子,一开始cal_var_red_led的值为0,此时RGB灯不亮,改变cal_var_red_led的值为8192(0x2000),此时红灯亮,如下图所示:
  4. 给s32k工程加入freemaster支持_工作页_06

  5. 关闭FreeMASTER界面,将板子断电重启,连上FreeMASTR,此时cal_var_red_led显示的值一直为8192(0x2000),如下图所示:
  6. 给s32k工程加入freemaster支持_重启_07

  7. 同时也可以使用OpenSDA的attach连接方式,连接开发板查看该变量的值。连接方式如下:
  8. 给s32k工程加入freemaster支持_工作页_08

  9. 在map文件中查看cal_var_red_led的起始地址为0x14000000,占2个字节
  10. 给s32k工程加入freemaster支持_工作页_09

  11. 在调试界面查看改地址的值为0x2000和FreeMASTER显示一致,如下图,说明cal_var_red_led修改后的值掉电不丢失。
  12. 给s32k工程加入freemaster支持_标定_10

Tips:如果标定时候对于变量的修改非常频繁,两次变量的修改间隔小于1ms,则不建议使用此方法。否则会导致芯片进入Hard Fault。