3、NvM配置工具入门:Vector DaVinci Configurator中NvM模块的创建与基本配置
好,咱们进入实战环节。前面聊了那么多NvM的理论和概念,说实话,不亲手点几下配置工具,总觉得心里没底。这一章我就带大家走一遍Vector DaVinci Configurator,看看NvM模块到底是怎么创建和配置的。
我个人习惯把配置工具比作「搭积木」。你想想看,AUTOSAR架构把各个功能模块都封装好了,你要做的就是把这些模块拖进来,设置好参数,然后生成代码。NvM模块也不例外。
3.1 创建NvM模块实例
打开DaVinci Configurator,第一步是创建一个新的配置工程。嗯,这里要注意,不同版本的DaVinci界面可能略有差异,但核心逻辑是一样的。
- 新建工程:选择File → New → Configuration Project。给工程起个名字,比如「NvM_Demo_Project」。
- 导入基础模块:在模块列表里,确保你已经导入了
EcuC(ECU配置)、MemIf(内存接口)、Fee(Flash EEPROM模拟)和NvM模块。这些模块是NvM运行的基础依赖。 - 激活NvM模块:在模块树中找到
NvM,右键选择「Activate Module」。激活后,NvM的配置项才会出现在编辑区。
3.2 NvM模块的基本配置项
激活NvM模块后,你会看到一大堆配置参数。别慌,咱们挑核心的讲。我一般把配置项分成三类:通用参数、块配置和回调函数。
3.2.1 通用参数(NvMGeneral)
这部分是NvM模块的全局设置。双击NvMGeneral,你会看到以下关键参数:
| 参数名 | 说明 | 推荐值 |
|---|---|---|
NvMDevErrorDetect |
是否开启开发错误检测。开启后,参数错误会触发断言。 | 开发阶段:TRUE;量产阶段:FALSE |
NvMMaxNumOfCrcBytes |
CRC校验的最大字节数。用于检测数据完整性。 | 4(32位CRC) |
NvMPollingMode |
轮询模式还是中断模式。轮询模式简单,但会阻塞CPU。 | 根据项目需求,一般选POLLING |
NvMWriteBlockMode |
写块模式:立即写还是延迟写。 | IMMEDIATE(立即写) |
NvMDevErrorDetect,结果客户现场报了一堆断言错误,搞得我连夜打补丁。量产前一定要把这个参数改成FALSE,切记!
3.2.2 NvM块配置(NvMBlockDescriptor)
这是NvM配置的核心。每个NvM块对应一个需要持久化的数据对象。比如你要存一个校准参数集,那就创建一个NvM块。
创建块的步骤:
- 在
NvMBlockDescriptor上右键,选择「New NvMBlockDescriptor」。 - 给块起个名字,比如
NvMBlock_Calibration。 - 配置以下关键参数:
| 参数名 | 说明 | 示例值 |
|---|---|---|
NvMBlockSize |
块的大小,单位是字节。 | 256 |
NvMBlockNumOfCopies |
冗余备份数量。建议至少2份,防止写入时掉电。 | 2 |
NvMBlockCrcType |
CRC类型。可选NVM_CRC8、NVM_CRC16、NVM_CRC32。 |
NVM_CRC32 |
NvMBlockWriteProtection |
写保护。开启后,只有特定函数才能写该块。 | FALSE(开发阶段) |
NvMBlockRomBlockAddress |
默认值所在的ROM地址。如果块有默认值,这里填地址。 | 0x8000A000 |
NvMBlockNumOfCopies这个参数,我建议至少设成2。为什么?因为写Flash的时候如果突然掉电,至少还有一份备份可以恢复。我在一个车载项目中吃过这个亏,单副本配置,掉电后数据全丢,客户直接投诉。
3.2.3 回调函数配置
NvM支持多种回调函数,用于通知上层模块操作完成。常用的有:
NvMJobEndCallback:NvM操作(读/写/擦除)完成后的回调。NvMErrorCallback:操作出错时的回调。NvMBlockCrcCheckFailedCallback:CRC校验失败时的回调。
配置方法很简单:在NvMBlockDescriptor里找到对应的回调参数,填上你定义的函数名。比如:
/* 在代码中定义回调函数 */
void NvM_JobEndCallback(NvM_RequestResultType result)
{
/* 操作完成,可以通知上层任务 */
if (result == NVM_REQ_OK)
{
/* 成功处理 */
}
}
printf("NvM job end, result: %d\n", result);。别小看这个打印,调试阶段能省你不少时间。
3.3 生成代码与验证
配置完成后,点击「Generate Code」按钮。DaVinci会生成一堆文件,包括:
NvM.c/NvM.h:NvM模块的驱动代码。NvM_Cfg.h/NvM_Cfg.c:根据你的配置生成的配置代码。MemIf.c/Fee.c:底层接口代码。
生成后,我建议你打开NvM_Cfg.h看一眼。里面会定义每个NvM块的ID和大小。比如:
/* NvM_Cfg.h 中的块ID定义 */
#define NvMConf_NvMBlockDescriptor_NvMBlock_Calibration 0
#define NvMConf_NvMBlockDescriptor_NvMBlock_DTC 1
/* 块大小定义 */
#define NVM_BLOCK_SIZE_NvMBlock_Calibration 256
#define NVM_BLOCK_SIZE_NvMBlock_DTC 64
这些宏定义,你在应用层代码里会频繁用到。比如调用NvM_ReadBlock()时,第一个参数就是块ID。
NvM_Cfg.c和NvM_Cfg.h。这些文件是工具自动生成的,你改了,下次重新生成就会被覆盖。正确的做法是:在DaVinci里修改配置,然后重新生成。
3.4 本章知识体系
说了这么多,我画了一张图,帮你理清NvM配置的核心逻辑。你看一眼就明白了。
这张图把NvM配置的六个步骤串起来了。你按照这个顺序走,基本不会出错。我个人习惯是先配通用参数,再配块,最后配回调。顺序搞反了,有时候参数会互相依赖,导致配置报错。
好了,这一章的内容就到这里。你打开DaVinci Configurator,按照上面的步骤操作一遍,很快就能上手。记住,配置工具只是个工具,真正重要的是理解每个参数背后的含义。下一章咱们会深入聊NvM块的读写操作和错误处理,到时候你会用上今天配置的这些参数。
可可精品资料库