AUTOSAR-Fls模块

AUTOSAR-Fls模块

  • 0 前言
  • 1 TC389中的Data Flash基础知识
    • 1.1 Data Flash操作区域
    • 1.2 Data Flash操作指令
  • 2 Fls模块的设计原理
    • 2.1 Flash Emulation EEPROM
    • 2.2 地址、长度和数据块
    • 2.3 轮询模式和回调模式
    • 2.4 同步和异步,处理模式
    • 2.5 访问代码
    • 2.6 配置指针和状态指针
  • 3 Fls模块的C语言实现
    • 3.1 C文件架构
    • 3.2 使用到的类定义和状态枚举
    • 3.3 配置指针和状态指针
    • 3.4 Fls模块提供的API
      • Fls_17_Dmu_Init
      • Fls_17_Dmu_MainFunction
      • Fls_17_Dmu_Read
      • Fls_17_Dmu_Write
      • Fls_17_Dmu_Erase
      • Fls_17_Dmu_Cancel
      • Fls_17_Dmu_GetStatus
      • Fls_17_Dmu_GetJobResult
      • Fls_17_Dmu_SetMode
    • 3.5 Fls模块使用的外部API
      • Det_ReportError
      • Det_ReportRuntimeError
      • Mcal_ReportSafetyError
    • 3.6 Fls模块使用的外部Callback
      • Fee_JobEndNotification
      • Fee_JobErrorNotification
  • 4 Fls模块的DaVinci Configurator配制
    • 4.1 Fls\FlsConfigSet\FlsSectorList_0\FlsSectors\FlsSector
      • Number Of Sectors
      • Sector Size
      • Sector Startaddress
      • Page Size
    • 4.2 Fls\FlsConfigSet
      • Ac Erase
      • Ac Write
      • Call Cycle
      • Default Mode
      • Max Read Fast Mode
      • Max Read Normal Mode
      • Max Write Fast Mode
      • Max Write Normal Mode
      • Job End Notification
      • Job Error Notification
      • Erase Verify Err Notif
      • Prog Verify Err Notification
      • Protection
      • Wait State Error Correction
      • Wait State Read
    • 4.3 Fls\FlsGeneral
      • Driver Index
      • Ac Load On Job Start
      • Base Address
      • Total Size
      • Bank Check Api
      • Cancel Api
      • Compare Api
      • Get Job Result
      • Get Status Api
      • Init Check Api
      • Set Mode Api
      • Version Info Api
      • Ifx Fee Use
      • Use Interrupt
      • Dev Error Detect
      • Run Time Error Detect
      • Safety Enable
      • Init Api Mode
      • Runtime Api Mode
    • 4.4 Fls\FlsIfxSpecificConfig
      • Use Erase Suspend
      • Erase Suspend Timeout
      • Illegal State Notification
      • State Var Struct

0 前言

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

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

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

Fls模块最精简任务包括:

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

AUTOSAR-Fls模块_第1张图片

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部分

AUTOSAR-Fls模块_第2张图片

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 Sector Base Address Offset Address Size Total
EEPROM0 0xAF00'0000 0x0000'0000 4K byte 4K byte
EEPROM1 0x0000'1000 4K byte 8K byte
EEPROM2 0x0000'2000 4K byte 12K byte
EEPROM127 0x0007'F000 4K byte 512K 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.c API代码
Fls_17_Dmu_ac.h Flash操作代码头文件
Fls_17_Dmu_ac.c Flash操作代码
动态文件 描述
StartApplication_Fls_ecuc.arxml Configurator生成的本地配置文件
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 address Fls_17_Dmu.h
Fls_17_Dmu_LengthType 数据块的长度,byte Fls_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

AUTOSAR-Fls模块_第3张图片

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如下
    AUTOSAR-Fls模块_第4张图片

  • 开发错误包括:
    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如下
    AUTOSAR-Fls模块_第5张图片
    在这里插入图片描述


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.arxml FlsDefaultMode
影响 Fls_17_Dmu_PBcfg.c const 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.c const 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.c const 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.c const 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.c const 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.c const 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.c const 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.c const 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.c const 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.c const 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.c static Fls_17_Dmu_StateType FlsStateVar
  • 定义Fls模块状态指针名称,默认的就够用了

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


你可能感兴趣的:(AUTOSAR,autosar,flash)