AUTOSAR-Fls模块

AUTOSAR-Fls模块

0 前言

>>返回AUTOSAR系列文章目录<<

Fls模块全称Flash Driver Module,属于微控制器抽象层(MCAL)

Fls模块与底层硬件直接相关,硬件改变,相应代码也会改变。本文中使用的Fls模块是专门针对AURIX TC389芯片,API和变量以采用Fls_17_Dmu开头

Fls模块最精简任务包括:

  • 提供一个常量配制指针,供EcuM模块对其进行初始化
  • 提供一个状态指针,供Fee模块了解其内部信息
  • 收到Fee模块指令后,根据数据地址和数据长度,执行Flash的Read, Write, Erase操作
  • 完成一个操作后,通过回调函数自动向Fee模块报告

在这里插入图片描述

1 TC389中的Data Flash基础知识

1.1 Data Flash操作区域

英飞凌AURIX TC389中的数据闪存模块(Data Flash,DFLASH)中部分存储空间用于模拟EEPROM并存储用户数据,AUTOSAR中的Fls模块(Flash driver)是这部分存储空间的驱动模块

与PFLASH相比,DFLASH读取访问相对较慢

数据存储单元(Data Memory Unit,DMU)控制执行在PFLASH和DFLASH上的命令序列(command sequences)

闪存标准接口(Flash Standard Interface,FSI)负责在在PFLASH和DFLASH上的擦除、编程和验证操作(erase, program and verify)。同时FSI中的DFlash Read Write Buffer (DFRWB) 区域为DFLASH提供读写缓存

DFLASH分为2个bank,分别为DF0和DF1

DF0分为3个区域,负责模拟EEPROM的DF0_EEPROM区域,负责存储配置数据的数据配制块(User Configuration Blocks ,UCB)和用户无法访问的配制扇区(Configuration Sector,CFS)

DF1全部是负责模拟EEPROM的DF1_EEPROM区域

DF0_EEPROM也称为CPU_EEPROM,用于user application data
DF1_EEPROM也称为HSM_EEPROM,用于security application data
AUTOSAR的NvM模块操作的就是DF0_EEPROM部分

在这里插入图片描述

TC389的DF0_EEPROM区域地址从0xAF00'00000xAF07'FFFF,共512Kbyte。
在这里插入图片描述

1.2 Data Flash操作指令

闪存单元(Flash cell)的已擦除状态为逻辑0。强迫一个单元进入这种状态称为擦除(erase
闪存可以擦除的最小单元是逻辑扇区(Logical Sector),DF0_EEPROM的Logical Sector == 4K byte

闪存单元的编程状态为逻辑1。将已擦除的闪存单元更改为这种状态称为编程(program)或者写(write
闪存可以编程的最小数据量是页(Page),DF0_EEPROM的Page == 8 byte

每个闪存单元的最大编程/擦除周期数称为耐久性(endurance

Logical SectorBase AddressOffset AddressSizeTotal
EEPROM00xAF00'00000x0000'00004K byte4K byte
EEPROM10x0000'10004K byte8K byte
EEPROM20x0000'20004K byte12K byte
EEPROM1270x0007'F0004K byte512K byte

>>返回AUTOSAR系列文章目录<<


2 Fls模块的设计原理

2.1 Flash Emulation EEPROM

TC389使用便宜的Flash模仿EEPROM,让只能按Logical Sector擦除的Flash具有按Byte擦除的能力。

Flash仿EEPROM,首先将Flash空间分为几个独立作业的FlsSector,通常将Flash分为1个FlsSector就够了

将每个FlsSector等分为2个Physical Sector,分别为PhysicalSector0和PhysicalSector1。

Write Job

如果要求在32位地址0x0000'0AFF写入16位数据0x0032,则在PhysicalSector0中现有数据后面写入0x0032'0000'0AFF。这里约定数据为16位,地址为32位,每次需要写入48位。数据后面要跟着写入这个数据的地址,这个地址0x0000'0AFF并不是数据在Flash中的实际地址,所以是虚拟地址

如果再次要求在同一地址0x0000'0AFF更新数据为0x2220,则在PhysicalSector0现有数据后面写入0x2220'0000'0AFF,上次写的的数据0x0032'0000'0AFF还留在原处。

如果写入数据时,发现PhysicalSector0没有空间了,则把PhysicalSector0的所有有效数据复制进PhysicalSector1。有效数据是指所有相同虚拟地址的数据只保留最后一个数据。此时PhysicalSector1不满,则之后新数据写入PhysicalSector1。PhysicalSector0数据被擦除。

Read Job

要求在Flash中读取地址为0x0000'0AFF的数据,则从当前有效PhysicalSector中从后往前搜索,搜索到的第一个虚拟地址为0x0000'0AFF的数据被读取出来。如上面PhysicalSector0的0x2220被读取出来,0x0032永远不会被检索到。

Erase Job

当PhysicalSector0被写满时,有效数据被复制到PhysicalSector1,PhysicalSector0整个被统一擦除为0。Flash Cell的擦除寿命约10000次,这种方式可大幅提高使用寿命

2.2 地址、长度和数据块

Fls模块的Read操作就是将Flash中的数据块(Blcok)复制进RAM里,Write操作就是将RAM里的数据块复制进Flash中

Fls模块的Read、Write操作需要知道3个参数:

  • 数据块在Flash中的首地址Fls_Address,Fls_Address是相对于DF0_EEPROM首地址的偏移量,程序使用时会自动计算Fls_Address + DF0_EEPROM_Base_Address
  • 数据块在RAM中的首地址BufferPtr
  • 数据块长度Fls_Length

由上面章节可以知道,Fls模块如果每次只写一个16位数据,都会花费32位空间来存放虚拟地址,太浪费了,所以实际使用中,Fls模块都是按数据块(Blcok)操作数据的。数据块是在NvM模块定义的,到Fls模块这层只要知道Fls_Length通常都很大就行了

2.3 轮询模式和回调模式

Fls模块与上层Fee模块通信方式分为轮询模式(Polling Mode)和回调模式(Callback Mode)

  • 轮询模式:Fee模块周期调用Fls模块提供的API,如Fls_17_Dmu_GetStatusFls_17_Dmu_GetJobResult等获得Fls模块的状态信息
  • 回调模式:Fls模块的状态发生变更时,自动调用Fee模块提供的callback function如Fee_JobEndNotificationFee_JobErrorNotification等,向Fee模块报告新的状态

通常使用回调模式,关闭轮训模式

2.4 同步和异步,处理模式

操作指令有同步(synchronous)和异步(asynchronous)两种方式:

  • 同步方式,既指令下达后一直处理指令,直到指令完成
  • 异步方式,既指令下达后首先处于等待(pending)状态,等到周期任务Fls_17_Dmu_MainFunction激活后开始处理指令。Fls_17_Dmu_MainFunction有一个单周期处理的数据上限,上限一旦到达,本次操作就会停止,等待下个周期Fls_17_Dmu_MainFunction激活后继续处理。这样做是为了防止CPU处理大量周期任务时发生堵车

由于Flash的Read、Write、Erase操作很耗时,如果采用同步方式,CPU将长期被占用,所以Fls模块Read/Write/Erase操作采用异步方式,其他指令采用同步方式

根据Fls_17_Dmu_MainFunction每个周期处理的数据量大小,Fls模块可以选择两种处理模式(Processing Mode)

  • Fast Mode
  • Slow Mode

2.5 访问代码

Flash访问代码(Access Code)不能存储在被操作的Flash物理块中,例如我要擦除一个Flash中某一个扇区内容,这个擦除动作的代码不能存在这个Flash物理块中(Flash中代码运行时,相当于读操作,此时不能擦写)

PFlash的访问代码在Fls_17_Dmu_ac.c文件中,而该文件的代码又被烧写进PFlash中,所以,PFlash不能直接进行Write/Erase操作

解决方案就是PFlash进行Write/Erase操作前,将Write/Erase访问代码存储到RAM中,函数实际上是在RAM中执行

在AUTOSAR的负责范围内,DF0_EEPROM不会存放任何访问代码,所以不需要关心这个问题,相关配制都可以关闭

2.6 配置指针和状态指针

Fls模块作为MCAL层的模块,需要在Startup Code后初始化

Fls模块需要一个用const修饰的静态外部变量Fls_17_Dmu_Config存放模块初始化时所需的配置参数,Fls_17_Dmu_Config保存在数据段(.data)

Fls模块需要一个静态外部变量FlsStateVar存放模块状态参数,FlsStateVar保存在未初始化段(.bss)。Fls模块每一个操作中都需要读取或修改FlsStateVar


3 Fls模块的C语言实现

3.1 C文件架构

静态文件描述
Fls_17_Dmu.h包含API所需的状态枚举常量、类定义、状态指针FlsStateVar声明
Fls_17_Dmu.cAPI代码
Fls_17_Dmu_ac.hFlash操作代码头文件
Fls_17_Dmu_ac.cFlash操作代码
动态文件描述
StartApplication_Fls_ecuc.arxmlConfigurator生成的本地配置文件
Fls_17_Dmu_Bswmd.arxml
Fls_17_Dmu_Cfg.h包含项目所需的常量宏定义、开关宏定义
Fls_17_Dmu_PBcfg.h包含配制指针Fls_17_Dmu_Config声明
Fls_17_Dmu_PBcfg.c包含配制指针Fls_17_Dmu_Config赋值

3.2 使用到的类定义和状态枚举

Fls定义的类描述定义来源
Fls_17_Dmu_AddressType相对于Flash base address 的offset addressFls_17_Dmu.h
Fls_17_Dmu_LengthType数据块的长度,byteFls_17_Dmu.h
MemIf定义的类描述定义来源
MemIf_StatusType描述Fls模块的Module Status
1.MEMIF_UNINIT
模块未初始化
2.MEMIF_IDLE
没有需要处理的job
3.MEMIF_BUSY
模块正在处理job,不接受新job
MemIf_Types.h
MemIf_JobResultType描述Fls模块的Job Result
1.MEMIF_JOB_OK
job处理成功
2.MEMIF_JOB_FAILED
job处理以error结束
3.MEMIF_JOB_PENDING
job正在处理
4.MEMIF_JOB_CANCELLED
job已经取消
MemIf_Types.h
MemIf_ModeType描述Fls模块的Processing Mode
1.MEMIF_MODE_SLOW
Slow模式
2.MEMIF_MODE_FAST
Fast模式
MemIf_Types.h
Std定义的类描述定义来源
Std_ReturnType描述Job Request结果
1.E_OK
对同步指令,表示指令执行成功
对异步指令,表示指令被队列接受
2.E_NOT_OK
对同步指令,表示指令执行失败
对异步指令,表示指令被队列拒绝
Std_Type.h

3.3 配置指针和状态指针

  • 配置指针Fls_17_Dmu_ConfigFls_17_Dmu_PBcfg.c中赋值,示例如下:
const Fls_17_Dmu_ConfigType Fls_17_Dmu_Config =
{
  /* State结构体指针,未赋值 */
  .FlsStateVarPtr = &(Fls_17_Dmu_StateType)FlsStateVar,
  /* Maximum number of bytes to Read in one cycle for Fast Mode */
  .Fls_FastRead = (Fls_17_Dmu_LengthType)1024U, 
  /* Maximum number of bytes to Read in one cycle for Slow Mode */
  .Fls_SlowRead = (Fls_17_Dmu_LengthType)512U,
  /* Job End Notification */
  .FeeJobEndNotificationPtr = &(Fls_17_Dmu_NotificationPtrType)Fee_JobEndNotification,
  /* Job Error Notification */
  .FeeJobErrorNotificationPtr = &(Fls_17_Dmu_NotificationPtrType)Fee_JobErrorNotification,
  /* EVER Notification */
  .FlsEraseVerifyErrNotifPtr = (Fls_17_Dmu_NotificationPtrType)NULL_PTR, 
  /* PVER Notification */
  .FlsProgVerifyErrNotifPtr = (Fls_17_Dmu_NotificationPtrType)NULL_PTR,
  /* Illegal State Notification */
  .FlsIllegalStateNotificationPtr = (Fls_17_Dmu_NotificationPtrType)NULL_PTR,
  /* 用于寄存器DMU_HF_DWAIT初始化 */
  .FlsWaitStates = ((uint32)(FLS_17_DMU_WAIT_STATE_READACCESS9))|
  ((uint32)(FLS_17_DMU_WAIT_STATE_ERRORCORRECTION1 << 16U)),
  /* Default mode of FLS driver */
  .FlsDefaultMode = (MemIf_ModeType )MEMIF_MODE_FAST
}
  • 状态指针FlsStateVarFls_17_Dmu.h中定义类型,在Fls_17_Dmu_PBcfg.c中声明
typedef struct
{
  /* Source address for read job */
  Fls_17_Dmu_AddressType FlsReadAddress;
  /* Destination address for write job */
  Fls_17_Dmu_AddressType FlsWriteAddress;
  /* DFlash physical address for erase job */
  Fls_17_Dmu_AddressType FlsEraseAddress;
  
  /* Number of bytes to read */
  Fls_17_Dmu_LengthType FlsReadLength;
  /* Number of bytes to write */
  Fls_17_Dmu_LengthType FlsWriteLength;
  
  /* Destination pointer for read job */  
  uint8* FlsReadBufferPtr;
  /* Sourcce pointer for write job */
  uint8* FlsWriteBufferPtr;
  
  /* Job result of Flash */
  MemIf_JobResultType FlsJobResult;
  /* Processing Mode - Fast or Slow */
  MemIf_ModeType FlsMode;
  
  /* 哪个Job给的Notificition,Fee会查看 */
  Fls_17_Dmu_Job_Type NotifCaller;
  /* Status to indicate if the job has been started */
  Fls_17_Dmu_JobStartType JobStarted;
  
  /* Number of sectors to be erased */
  uint16 FlsEraseNumSectors;
  /* Number of sectors to be erased in 1 command cycle */
  uint16 FlsEraseNumSecPerCmd;

  /* 正在处理哪种Job,Read/Write/Erase等等,没有Job则为None */
  Fls_17_Dmu_Job_Type FlsJobType;

  /* EVER error status */
  uint8 FlsEver;
  /* Command Sequence Timeout error status */
  uint8 FlsTimeoutErr;
}Fls_17_Dmu_StateType;
Fls_17_Dmu_StateType FlsStateVar;

3.4 Fls模块提供的API

在这里插入图片描述

Fls_17_Dmu_Init

void Fls_17_Dmu_Init(Fls_17_Dmu_ConfigType* Fls_17_Dmu_Config)
BrsMain EcuM EcuM_Callout_Stubs Os Fls EcuM_Init EcuM_AL_DriverInitOne Fls_17_Dmu_Init Fls_17_Dmu_Init EcuM_AL_DriverInitOne EcuM_StartOs StartOS StartOS EcuM_StartOs EcuM_Init BrsMain EcuM EcuM_Callout_Stubs Os Fls
  • Startup Code结束后,由EcuM模块调用Fls_17_Dmu_Init完成对Fls模块的初始化
  • 初始化所需参数在配置指针Fls_17_Dmu_Config中,初始化包括对DMU寄存器的初始化和对状态指针FlsStateVar的初始化
  • 初始化后,Fls模块Module Status==MEMIF_IDLEJob Result=MEMIF_JOB_OK

Fls_17_Dmu_MainFunction

void Fls_17_Dmu_Mainfunction (void)
SchM Default_BSW_Async_Task_Core0 Fls ActivateTask Fls_17_Dmu_MainFunction switch JobType Fls_17_Dmu_MainFunction loop SchM Default_BSW_Async_Task_Core0 Fls
  • Fls_17_Dmu_MainFunction在Task中以10ms周期被调用,负责执行异步job
  • Fls_17_Dmu_MainFunction根据FlsStateVar->FlsJobType确定当前任务,FlsStateVar->FlsJobType有以下状态
FlsJobType
FLS_17_DMU_NONE
FLS_17_DMU_WRITE
FLS_17_DMU_ERASE
FLS_17_DMU_READ
FLS_17_DMU_COMPARE
FLS_17_DMU_READSYNC
FLS_17_DMU_CANCEL
FLS_17_DMU_COMPARESYNC
FLS_17_DMU_VERIFYERASE
FLS_17_DMU_BLANKCHECK
  • Fls_17_Dmu_MainFunction在一次周期中处理的数据量取决于配置的Processing Mode = Fast Mode / Slow Mode
  • Fls_17_Dmu_MainFunction在处理完一个job后,将调用Job End Notification,或者如果发生错误,将执行Job Error Notification

Fls_17_Dmu_Read

Std_ReturnType Fls_17_Dmu_Read
(
Fls_17_Dmu_AddressType SourceAddress,
uint8* TargetAddressPtr,
Fls_17_Dmu_LengthType Length
)
  • 将Flash中首地址FlashBaseAddress + SourceAddress,长度为Length的数据块复制进RAM中首地址TargetAddressPtr的区域里
  • 异步job,在Fls_17_Dmu_MainFunction中执行
  • 此job只有在Module Status==MEMIF_IDLE才能请求

Fls_17_Dmu_Write

Std_ReturnType Fls_17_Dmu_Write
(
Fls_17_Dmu_AddressType TargetAddress,
const uint8* SourceAddressPtr,
Fls_17_Dmu_LengthType Length
)
  • 将RAM中首地址SourceAddressPtr,长度为Length的数据块复制进Flash中首地址FlashBaseAddress + TargetAddress的区域里
  • 异步job,在Fls_17_Dmu_MainFunction中执行
  • 此job只有在Module Status==MEMIF_IDLE才能请求

Fls_17_Dmu_Erase

Std_ReturnType Fls_17_Dmu_Erase
(
Fls_17_Dmu_AddressType TargetAddress,
Fls_17_Dmu_LengthType Length
)
  • 将首地址FlashBaseAddress + SourceAddress,长度为Length的Flash区域擦除
  • 异步job,在Fls_17_Dmu_MainFunction中执行
  • 此job只有在Module Status==MEMIF_IDLE才能请求

Fls_17_Dmu_Cancel

void Fls_17_Dmu_Cancel (void)
  • 取消当前job
  • 同步job,立即执行
  • Cancel Api决定是否启用API

Fls_17_Dmu_GetStatus

MemIf_StatusType Fls_17_Dmu_GetStatus (void)
  • 返回Fls模块Module Status
  • 同步job,立即执行
  • Get Status Api决定是否启用API

Fls_17_Dmu_GetJobResult

MemIf_StatusType Fls_17_Dmu_GetJobResult (void)
  • 返回最近或当前处理的Job Result
  • 同步job,立即执行
  • Get Job Result决定是否启用API

Fls_17_Dmu_SetMode

void Fls_17_Dmu_SetMode (MemIf_ModeType Mode)
  • 设置Processing Mode,Fast Mode 或者 Slow Mode
  • 同步job,立即执行
  • 此job只有在Module Status==MEMIF_IDLE才能请求
  • Set Mode Api决定是否启用API

3.5 Fls模块使用的外部API

https://img-blog.csdnimg.cn/20210524211543967.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwNzk2MTM=,size_16,color_FFFFFF,t_70


Det_ReportError

Std_ReturnType Det_ReportError
(
uint16 ModuleId,
uint8 InstanceId,
uint8 ApiId,
uint8 ErrorId
)
  • 来自Det模块的API,检测并报告开发错误,由Dev Error Detect启用

  • ModuleId==FLS_MODULE_ID092

  • InstanceId==Driver Index

  • ApiId如下
    在这里插入图片描述

  • 开发错误包括:
    1、API服务调用时发生参数错误,包括(配置、地址、长度、数据)
    2、API服务调用时模块未初始化
    3、API服务调用时模块busy
    4、API服务调用了空指针
    5、擦除验证失败(空白检查),需要启用Bank Check Api,可触发Erase Verify Err Notif
    6、写验证失败(比较),需要启用Compare Api,可触发Prog Verify Err Notification
    7、超时

  • ErrorId如下
    在这里插入图片描述
    在这里插入图片描述


Det_ReportRuntimeError

Std_ReturnType Det_ReportRuntimeError
(
uint16 ModuleId,
uint8 InstanceId,
uint8 ApiId,
uint8 ErrorId
)
  • 来自Det模块的API,检测并报告运行错误,由Run Time Error Detect启用
  • ModuleIdInstanceIdApiIdDet_ReportError
  • 运行错误包括各API执行失败,ErrorId
    FLS_17_DMU_E_ERASE_FAILED
    FLS_17_DMU_E_WRITE_FAILED
    FLS_17_DMU_E_READ_FAILED

Mcal_ReportSafetyError

Std_ReturnType Mcal_ReportSafetyError
(
uint16 ModuleId,
uint8 InstanceId,
uint8 ApiId,
uint8 ErrorId
)
  • 来自MCAL的API,检测并报告安全错误,由Safety Enable启用
  • 安全错误是指DMU寄存器中记录的错误,由内联函数读取,其中部分错误和开发错误相同
  • ModuleIdInstanceIdApiIdDet_ReportError
  • 硬件错误有11个,ErrorId如下
    FLS_17_DMU_SE_PARAM_ADDRESS
    FLS_17_DMU_SE_PARAM_LENGTH
    FLS_17_DMU_SE_PARAM_DATA
    FLS_17_DMU_SE_BUSY
    FLS_17_DMU_SE_PARAM_INVLD
    FLS_17_DMU_SE_INIT_FAILED
    FLS_17_DMU_SE_ILLGL_OPERTN
    FLS_17_DMU_SE_HW_BUSY
    FLS_17_DMU_SE_SUSPENDERASE_FAIL
    FLS_17_DMU_SE_INVALID_ISR

3.6 Fls模块使用的外部Callback


Fee_JobEndNotification

void Fee_JobEndNotification (void)
  • 来自Fee模块的API
  • Fls模块成功处理一个Job时,向Fee模块返回此回调函数
  • Fee_JobEndNotification会调用Fls_17_Dmu_GetNotifCaller,获取状态&FlsStateVar->NotifCaller,从而知道哪个Job返回此Callback Function

Fee_JobErrorNotification

void Fee_JobErrorNotification (void)
  • 来自Fee模块的API
  • Fls模块处理一个Job失败时,向Fee模块返回此回调函数
  • Fee_JobErrorNotification会调用Fls_17_Dmu_GetNotifCaller,获取状态&FlsStateVar->NotifCaller,从而知道哪个Job返回此Callback Function

>>返回AUTOSAR系列文章目录<<


4 Fls模块的DaVinci Configurator配制

4.1 Fls\FlsConfigSet\FlsSectorList_0\FlsSectors\FlsSector

DF0_EEPROM要分为几个FlsSector,每个FlsSector有一个对应FlsSector页面。通常我们只会将DF0_EEPROM分为1个FlsSector

1个FlsSector又要分为1个或2个Physical Sector


Number Of Sectors

配制Configurator选项Number Of Sectors -> [1, 2]
  • Flash仿EEPROM通常将DF0_EEPROM化为一个FlsSector,再将FlsSector分为2个Physical Sector,一个Physical Sector用于write,一个Physical Sector用于erase,交替进行。此处Sector是Physical Sector,不是Flash说明中的Logical Sector,所以此处通常填2

Sector Size

配制Configurator选项Sector Size [kByte] -> [4, 512]
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_NVMSECTOR_SIZE
  • 指定每个Physical Sector的大小,由于DF0_EEPROM共512 kByte,又分为2个Physical Sector,此处只能填256

Sector Startaddress

配制Configurator选项Sector Startaddress -> [0, 524287]
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_NVMSECTOR0_STARTADDRESS
  • 指定当前FlsSector相对于DF0_EEPROM的地址偏移
  • 由于我们只有一个FlsSector,此处只能填0

Page Size

配制Configurator选项Page Size [Byte] -> [8]
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_PAGE_SIZE
  • TC389的DF0_EEPROM区域1Page = 8 byte是固定的,此处只能填8

4.2 Fls\FlsConfigSet

FlsConfigSet部分主要对 Fls_17_Dmu_PBcfg.c 文件中的Fls_17_Dmu_Config结构体进行赋值,该结构体用于Fls模块的Fls_17_Dmu_Init


Ac Erase

配制Configurator选项Ac Erase -> [0, :]
  • 将Erase Flash Access Code加载到RAM的地址中
  • Ac Load On Job Start启用时,Ac Erase才有意义

Ac Write

配制Configurator选项Ac Write -> [0, :]
  • 将Write Flash Access Code加载到RAM的地址中
  • Ac Load On Job Start启用时,Ac Write才有意义

Call Cycle

配制Configurator选项Call Cycle[s] -> [0.0001, 1]
  • Fls_17_Dmu_MainFunction调用周期,要和NvM_MainFunction一致,通常为0.01

Default Mode

配制Configurator选项Default Mode -> enum:
MEMIF_MODE_FAST
MEMIF_MODE_SLOW
影响StartApplication_Fls_ecuc.arxmlFlsDefaultMode
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Fls_17_Dmu_Config.FlsDefaultMode 赋值

Max Read Fast Mode

配制Configurator选项Max Read Fast Mode -> [1, :]
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Fast Mode下一个cycle最大Read byte数
  • Fls_17_Dmu_Config.Fls_FastRead 赋值,可以填1024

Max Read Normal Mode

配制Configurator选项Max Read Normal Mode -> [1, :]
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Slow Mode下一个cycle最大Read byte数
  • Fls_17_Dmu_Config.Fls_SlowRead 赋值,可以填512

Max Write Fast Mode

配制Configurator选项Max Write Fast Mode -> [32]
  • Fast Mode下一个cycle最大Write byte数
  • 被TC389硬件限制只能填32

Max Write Normal Mode

配制Configurator选项Max Write Normal Mode -> [32]
  • Slow Mode下一个cycle最大Write byte数
  • 被TC389硬件限制只能填32

Job End Notification

配制Configurator选项Job End Notification -> Fee_JobEndNotification 或 不填
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Fee模块提供Fee_JobEndNotification回调函数
  • 不填则给Fls_17_Dmu_Config.FeeJobEndNotificationPtr 赋值NULL_PTR

Job Error Notification

配制Configurator选项Job Error Notification -> Fee_JobErrorNotification 或 不填
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Fee模块提供Fee_JobErrorNotification回调函数
  • 不填则给Fls_17_Dmu_Config.FeeJobErrorNotificationPtr 赋值NULL_PTR

Erase Verify Err Notif

配制Configurator选项Erase Verify Err Notif -> 不填
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Fee模块并没有提供Fee_EraseVerifyErrNotification回调函数,如果要用,需要自己手动写
  • 不填则给Fls_17_Dmu_Config.FlsEraseVerifyErrNotifPtr 赋值NULL_PTR

Prog Verify Err Notification

配制Configurator选项Prog Verify Err Notification -> Fee_17_JobProgErrorNotification 或 不填
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Fee模块提供Fee_17_JobProgErrorNotification回调函数
  • 不填则给Fls_17_Dmu_Config.FlsProgVerifyErrNotifPtr 赋值NULL_PTR

Protection

配制Configurator选项Protection -> [0, :]
  • Erase/Write Protection,需要硬件支持此功能
  • TC389不支持此功能,默认给0

Wait State Error Correction

配制Configurator选项Wait State Error Correction -> enum:
FLS_17_DMU_STATE_ERRORCORRECTION0

FLS_17_DMU_STATE_ERRORCORRECTION7
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Wait State Error CorrectionWait State Read共同给Fls_17_Dmu_Config.FlsWaitStates赋值,Fls_17_Dmu_Config.FlsWaitStates用于在Fls模块初始化时写入DMU_HF_DWAIT寄存器
  • Wait State Error Correction定义每次Error Correction需要花费的fFSI 时钟周期数
  • 通常使用FLS_17_DMU_STATE_ERRORCORRECTION1

Wait State Read

配制Configurator选项Wait State Read -> enum:
FLS_17_DMU_STATE_READACCESS0

FLS_17_DMU_STATE_READACCESS255
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Wait State Error CorrectionWait State Read共同给Fls_17_Dmu_Config.FlsWaitStates赋值,Fls_17_Dmu_Config.FlsWaitStates用于在Fls模块初始化时写入DMU_HF_DWAIT寄存器
  • Wait State Read定义每次Read Access需要花费的fFSI 时钟周期数
  • 通常使用FLS_17_DMU_STATE_READACCESS9

4.3 Fls\FlsGeneral

FlsGeneral部分主要对应Fls_17_Dmu_Cfg.h文件中的常量宏定义开关宏定义


Driver Index

配制Configurator选项Driver Index -> [0, 254]
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_INSTANCE_ID
  • Fee模块下的Fls模块0开始编号

Ac Load On Job Start

配制Configurator选项Ac Load On Job Start -> True/False
  • 宏定义开关,是否在Job开始时将Access Code载入RAM里
  • Ac Load On Job Start启用时,Ac EraseAc Write才有意义
  • 对于DFlash不需要此功能,选择False

Base Address

配制Configurator选项Base Address -> [0xAF00’0000]
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_BASE_ADDRESS
  • 宏定义常量,对于TC389芯片,只能输入0xAF00'0000

Total Size

配制Configurator选项Total Size -> [0x8’0000]
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_TOTAL_SIZE
  • 宏定义常量,对于TC389芯片,只能填0x8'0000

Bank Check Api

配制Configurator选项Bank Check Api -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_BANK_CHECK_API
  • 宏定义开关,是否启用API Fls_17_Dmu_BlankCheck,验证给定的存储区是否全部为0
  • 选择False

Cancel Api

配制Configurator选项Cancel Api -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_CANCEL_API
  • 宏定义开关,是否启用API Fls_17_Dmu_Cancel
  • 选择False

Compare Api

配制Configurator选项Compare Api -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_COMPARE_API
  • 宏定义开关,是否启用API Fls_17_Dmu_Compare,比较flash的一个区域和应用数据buffer中的内容
  • 选择False

Get Job Result

配制Configurator选项Get Job Result -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_GET_JOB_RESULT_API
  • 宏定义开关,是否启用API Fls_17_Dmu_GetJobResult
  • 选择False

Get Status Api

配制Configurator选项Get Status Api -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_GET_STATUS_API
  • 宏定义开关,是否启用API Fls_17_Dmu_GetStatus
  • 选择False

Init Check Api

配制Configurator选项Init Check Api -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_INITCHECK_API
  • 宏定义开关,是否启用API Fls_17_Dmu_InitCheck,返回Fls模块是否完成初始化
  • 选择False

Set Mode Api

配制Configurator选项Set Mode Api -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_SET_MODE_API
  • 宏定义开关,是否启用API Fls_17_Dmu_SetMode
  • 选择False

Version Info Api

配制Configurator选项Version Info Api -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_VERSION_INFO_API
  • 宏定义开关,是否启用APIFls_17_Dmu_GetVersionInfo
  • 选择False

Ifx Fee Use

配制Configurator选项Ifx Fee Use -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_IFX_FEE_USED
  • 宏定义开关,Ifx Fee Use是启用英飞凌的Fee模块
  • 英飞凌的Fee模块对英飞凌的芯片当然支持的更好,但是是收费业务,根据本公司具体情况选择
  • 选择True

Use Interrupt

配制Configurator选项Use Interrupt -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_USE_INTERRUPTS
  • 宏定义开关,是否使用中断
  • 如果启用,则Erase和Write操作不在Fls_17_Dmu_MainFunction中进行,改为在中断函数Fls_17_Dmu_Isr中进行,Erase和Write变为立即Erase和立即Write
  • 选择False

Dev Error Detect

配制Configurator选项Dev Error Detect -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_DEV_ERROR_DETECT
  • 宏定义开关,是否启用Det模块检测开发错误
  • 如果启用Dev Error Detect,则添加#include Det.h并启用APIDet_ReportError
  • 选择False

Run Time Error Detect

配制Configurator选项Run Time Error Detect -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_RUNTIME_ERROR_DETECT
  • 宏定义开关,是否启用Det模块的检测运行错误
  • 如果启用Run Time Error Detect,则添加#include Det.h并启用APIDet_ReportRuntimeError
  • 选择False

Safety Enable

配制Configurator选项Safety Enable -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_SAFETY_ENABLE
  • 宏定义开关,是否启用MCAL层检测安全错误
  • 如果使用Safety Enable,则模块添加#include Mcal_SafetyError.h,启用APIMcal_ReportSafetyError
  • 选择False

Init Api Mode

配制Configurator选项Init Api Mode -> enum:
FLS_17_DMU_MACAL_SUPERVISOR
FLS_17_DMU_MACAL_USER1
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_INIT_API_MODE
  • 使用FlexRay Initialization时的操作模式
  • 不使用FlexRay Initialization时无影响

Runtime Api Mode

配制Configurator选项Runtime Api Mode -> enum:
FLS_17_DMU_MACAL_SUPERVISOR
FLS_17_DMU_MACAL_USER1
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_RUNTIME_API_MODE
  • 选择FlexRay Initialization时的操作模式
  • 不使用FlexRay Initialization时无影响

4.4 Fls\FlsIfxSpecificConfig

此页操作英飞凌特有的配制信息


Use Erase Suspend

配制Configurator选项Use Erase Suspend -> True/False
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_USE_INTERRUPTS
  • 宏定义开关,是否使用erase suspend 和erase resume功能
  • Use Erase Suspend不选中时,Erase Suspend Timeout无意义
  • 选择False

Erase Suspend Timeout

配制Configurator选项Erase Suspend Timeout -> [12000, 65535]
影响Fls_17_Dmu_Cfg.h#define FLS_17_DMU_VERSION_INFO_API
  • 宏定义常量,当Use Erase Suspend不选中时无意义

Illegal State Notification

配制Configurator选项Illegal State Notification -> Fee_17_IllegalStateNotification 或 不填
影响Fls_17_Dmu_PBcfg.cconst Fls_17_Dmu_ConfigType Fls_17_Dmu_Config
{

}
  • Fee模块提供Fee_17_IllegalStateNotification回调函数
  • 不填则给Fls_17_Dmu_Config.FlsIllegalStateNotificationPtr 赋值NULL_PTR
  • 不般选False

State Var Struct

配制Configurator选项State Var Struct -> FlsStateVar
影响Fls_17_Dmu_PBcfg.cstatic Fls_17_Dmu_StateType FlsStateVar
  • 定义Fls模块状态指针名称,默认的就够用了

>>返回AUTOSAR系列文章目录<<


  • 72
    点赞
  • 364
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值