AUTOSAR-Fls模块
- 0 前言
- 1 TC389中的Data Flash基础知识
- 2 Fls模块的设计原理
- 3 Fls模块的C语言实现
- 4 Fls模块的DaVinci Configurator配制
0 前言
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'0000
到0xAF07'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 |
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_GetStatus
、Fls_17_Dmu_GetJobResult
等获得Fls模块的状态信息 - 回调模式:Fls模块的状态发生变更时,自动调用Fee模块提供的callback function如
Fee_JobEndNotification
、Fee_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_Config
在Fls_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
}
- 状态指针
FlsStateVar
在Fls_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 ) |
---|
- Startup Code结束后,由EcuM模块调用
Fls_17_Dmu_Init
完成对Fls模块的初始化 - 初始化所需参数在配置指针
Fls_17_Dmu_Config
中,初始化包括对DMU寄存器的初始化和对状态指针FlsStateVar
的初始化 - 初始化后,Fls模块的Module Status==
MEMIF_IDLE
,Job Result=MEMIF_JOB_OK
Fls_17_Dmu_MainFunction
void Fls_17_Dmu_Mainfunction (void) |
---|
Fls_17_Dmu_MainFunction
在Task中以10ms周期被调用,负责执行异步jobFls_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 ModeFls_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
Det_ReportError
Std_ReturnType Det_ReportError ( uint16 ModuleId ,uint8 InstanceId ,uint8 ApiId ,uint8 ErrorId ) |
---|
-
来自Det模块的API,检测并报告开发错误,由Dev Error Detect启用
-
ModuleId
==FLS_MODULE_ID
或092
-
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启用
ModuleId
,InstanceId
,ApiId
同Det_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寄存器中记录的错误,由内联函数读取,其中部分错误和开发错误相同
ModuleId
,InstanceId
,ApiId
同Det_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
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 Correction和Wait 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 Correction和Wait 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 Erase和Ac 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 |
- 宏定义开关,是否启用API
Fls_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模块状态指针名称,默认的就够用了