1. 背景描述
最近和一些汽车电子客户交流了下XCP标定,了解到的大概流程如下:
- 首先对地址进行分区,分为工作页和参考页,工作页的地址为RAM地址,参考页的地址为Flash地址。同时分配工作页和参考页中的参数地址,要保证每个工作参数和对应的参考参数的地址偏移量是一样的。
- 上电之后,将参考页的参数(Flash区数据)拷贝到工作页的参数(RAM区变量)中,这个工作可以在主函数实现或者链接文件中实现。
- 然后在车辆运行时调整工作页参数,停车之后再调整对应的参考页参数。
但是这种标定方式对客户来说还是有些繁琐,如果有一个“掉电不丢失数据”的RAM区,那对客户来讲,操作就比较简单了。只需要将标定参数放在此区域中即可,不需要分工作页和参考页,同时标定完成之后也不需要将参数写入flash中进行保存。
下文基于S32K144开发板针对这种方式进行介绍,并用freemaster模拟XCP调整参数的过程。
2. 准备工作
2.1 工具&软件
- S32K144EVB-Q100
- S32 Design Studio for ARM 2.2
- FreeMaster 2.5
2.2 测试用例
-
在S32DS 2.2 新建工程,选择S32DS Application Project这种方式,如下图所示:
-
关于S32DS Application Project和S32DS Project from Example两者创建工程方式的对比如下表,由于这次的例程需要修改ld文件,所以选择了前者的方式。
创建方式 | S32DS Application Project | S32DS Project from Example |
---|---|---|
链接文件 | 工程目录下,可以修改 | 链接至安装目录下,不建议修改 |
SDK | 工程目录下,不建议修改 | 链接至安装目录下,不建议修改 |
Generated Code | 工程目录下 | 工程目录下 |
应用程序 | 工程目录下 | 工程目录下 |
创建速度 | 慢 | 快 |
-
在ld文件中增加flexram区域的定义,如下图:
-
在main.c文件中使用attritube定义标定量,如下图所示:
__attribute__((section (".eeprom"))) volatile uint16_t cal_var_red_led = 0x0000;
- 完善功能代码,实现的功能为:
使用变量cal_var_red_led控制PWM输出占空比,驱动RGB灯中的红光。上电重启后,红色LED的亮度不变。
元器件 | S32K144 |
---|---|
Red_LED | PTD15(FTM0_CH0) |
- 创建对应的FreeMASTER工程,具体方法可以参考之前的文章:FreeMASTER快速入门
3. 功能测试
3.1调试配置
由于FlexRAM默认是未使用的,如果想要使用FlexRAM并配置成FlexRAM,需要重新分区。有两种办法:
- 在主函数中调用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,如下图所示:
-
S32K144的FlexNVM分配成64KB的EEPROM备份区域的Code为0x04或者0x08
- 在Debug Configurations界面进行配置,如下图所示。此方法需要使用PEMicro厂家的调试器或者量产烧录器。
3.2 测试验证
-
由于是在ld文件中增加的flexram分区,此动作在调转main函数之前,所以选择使用OpenSDA进行分区操作。同时在控制台也能看到烧录器进行了分区操作,如下图所示:
-
打开之前准备好的FreeMASTER工程,连接上板子,一开始cal_var_red_led的值为0,此时RGB灯不亮,改变cal_var_red_led的值为8192(0x2000),此时红灯亮,如下图所示:
-
关闭FreeMASTER界面,将板子断电重启,连上FreeMASTR,此时cal_var_red_led显示的值一直为8192(0x2000),如下图所示:
-
同时也可以使用OpenSDA的attach连接方式,连接开发板查看该变量的值。连接方式如下:
-
在map文件中查看cal_var_red_led的起始地址为0x14000000,占2个字节
-
在调试界面查看改地址的值为0x2000和FreeMASTER显示一致,如下图,说明cal_var_red_led修改后的值掉电不丢失。
Tips:如果标定时候对于变量的修改非常频繁,两次变量的修改间隔小于1ms,则不建议使用此方法。否则会导致芯片进入Hard Fault。