基于旗芯微FC4150系列的FLS详解

目录

1.概述

2.术语定义

2.1 DET

2.2 DEM

2.3 Fls

2.4 AC

2.5 Flash Sector

2.6 Flash Page

3.使用限制

4.对其他模块的依赖

5.旗芯微对于FLS的MCAL设计

6.主要接口函数介绍

6.1 Fls_Init

6.2 同步机制的API

6.3 异步机制API

6.4 取消正在运行的作业

7.EB配置解析


1.概述

主要提供对Flash的读,写,擦相关服务操作;旗芯微的MCAL代码目前未提供配置接口来设置擦/写保护功能

ECU的应用程序模式下,Flash驱动程序仅供FEE模块用于写入数据使用。Flash驱动程序并未打算在应用程序模式下把程序代码写入闪存的服务,此部分应在AUTOSAR范围之外的引导模式下完成,比如在Flash Bootloader中实现

旗芯微4150系列的芯片均是内置Flash,所以都是内部闪存驱动程序可以直接访问微控制器,它位于MCAL微控制器的抽象层(位于MCAL驱动代码目录的Fls_Flash.c中)

2.术语定义

2.1 DET

默认错误跟踪器(Default Error Tracer),实现报告开发错误的模块。

2.2 DEM

诊断事件管理器(Diagnostic Event Manager).

2.3 Fls

Autosar闪存驱动程序的官方缩写

2.4 AC

闪存访问代码(access code)的缩写,被片内FLASH驱动的主函数(用于处理任务/JOB的服务)调用的一段特殊代码,以用于擦/写FLASH硬件。简称AC

2.5 Flash Sector

闪存扇区,一次可以擦除的最小闪存量(一个最小可擦除单元定义为一个区),旗芯微4150系列的最小Sector的大小按型号分如下所示:

FC4150F512:1KB;   FC4150F2M:8KB;   FC4150F1M_A:8KB;   FC4150F1M_B:2KB

2.6 Flash Page

闪存页面,一次可以编程的最小闪存量(一次最小可编程/写单元定义为一个页),旗芯微4150系列的最小Page的大小按型号分如下所示:

FC4150F512:8Bytes;   FC4150F2M:8Bytes;   FC4150F1M_A:8Bytes;   FC4150F1M_B:8Bytes

3.使用限制

FLASH驱动只能擦除完整的区,编写完整的页。不提供任何类型的重写机制,因为其内部没有任何缓存,所有API都是通过指针的方式直接使用应用层的缓存数据。

FLASH驱动也不提供数据完整性检查机制(比如:Checksum/校验和,冗余存储)。读/写过程中的数据完整性通常由上层模块负责实现。

4.对其他模块的依赖

旗芯微FC4150系列的NVM闪存模块依赖于内部快速时钟和慢速时钟,具体的配置请参考下图:

寄存器中显示可以配置为FIRC或者SIRCMCAL代码中配置固定为使用SIRC,如下图所示:

5.旗芯微对于FLS的MCAL设计

5.1 FLS模块为闪存操作(包括 读/写/擦除)提供异步(asynchronous)服务

5.2 FLS模块模块没有对数据进行额外的缓存,所有API都是通过指针的方式直接使用应用层的缓存数据,FLS模块没有对应用程序缓冲区数据的一致性做确保,但对于闪存读取和写入操作器件的闪存数据一致性性做了确保(驱动内部实现了譬如FLS_WRITE_VERIFY_CHECK == STD_ON宏开关来选择是否校验数据写入源和目标地址的一致性)

5.3 FLS模块设计了静态检查检查静态配置参数是否正确(FLS_DEV_ERROR_DETECT需要选择打开)

5.4 FLS模块需将所有可用的闪存区域组成一个线性地址空间(通过参数FlsBaseAddressFlsTotalSize表示)NOTE:旗芯微的FLS MCAL代码中没有设计FlsTotalSize的配置;需要注意的是旗芯微的FC4150系列FLS模块操作的DFLASH本身就是连续的线性空间(地址是连续的)

5.5 FLS驱动内部会处理缓存对齐问题,对外面传进来的Buff没有地址对齐要求,参数都是uint8 *类型的。

5.6 一个ECU里面允许存在多个FLASH驱动实例,每个实例有唯一的编号(FlsDriverIndex),编号以0开始。旗芯微的FLS EB配置里面通过配置Fls Driver Index来确定ID

5.7 前面提到的闪存访问代码(AC),这些代码比较特殊,旗芯微的做法是这部分代码是保存在ROM里面的,无需拷贝到RAM里面执行(有些需要拷贝到RAM是考虑到存放这部分代码在FLASH区域和编程/擦除的代码属于同一个Partition,受硬件限制),所以EB配置中的Fls Load Access Code On Job Start不可配置。

6.主要接口函数介绍

6.1 Fls_Init

初始化会有EcuM调用Fls_Init实现,旗芯微提供的DEMO例程中是手动调用该API进行初始化

6.2 同步机制的API

FLS模块中,以下服务操作使用同步机制调用:

Fls_GetJobResult

Fls_GetStatus

Fls_SetMode

下面的时序图显示了函数Fls_GetJobResult作为该模块的同步操作的示例。同样的顺序也适用于函数Fls_GetStatusFls_SetMode

从图中可以看出这是一个同步函数,用于它用于获取最近一次任务的结果状态。读,写,擦,比较这四种任务是共享一个任务结果的(假设发起多个任务请求,它只会获取最后任务请求的结果),如下是旗芯微的驱动代码,可以看到没有传参,获取的是一个全局变量的值

6.3 异步机制API

在FLS模块中,以下服务操作使用同步机制调用:

Fls_Erase

Fls_Write

Fls_Read

Fls_Compare

以下时序图显示了闪存写入功能作为该模块异步操作的示例(图中设置了配置选项FlsAcLoadOnJobStart,但是实际旗芯微的驱动中没有该过程)。相同的顺序适用于擦除、读取和比较作业

Fls_Write函数的起始地址及长度参数要求以page大小对齐。否则会出错。建议将DET功能打开。旗芯微FC4150系列芯片page大小为8字节。但是传入的参数为写入100字节用户数据。这种情况只有前面96字节(8的整数倍)可以正常写入,而最后4字节(100-96)无法写入。这是因为多余的4字节不满足对齐要求,如果贸然写入势必会将另外的4字节(8-4)给误覆盖了。因为每次写入都是page大小或page大小的整数倍写入的

Fls_Erase函数可以擦除一个或多个Sectors。它的两个参数分别为起始地址和长度,需要注意的是他是根据你的起始地址以及长度信息来计算这个地址范围属于哪(几)个Sectors,然后会根据计算结果自动一次性擦除所有归属的Sectors(这就是前面提到擦除多个Sectors的原因)。这里就需要注意,以旗芯微FC4150F2M的Sector参数(8KB)为例,假如你现在调用这个函数,参数分别为1,8096。这样调用会实际擦除两个Sectors。因为起始地址1归属于Sector 0,结束地址8096(8096+1-1),这个地址已经是下一个Sector的地址空间了。所有需要特别注意,防止误擦。但是如果你打开了开发错误检查开关,起始地址和长度参数有对齐要求,需要和sector边界对齐。比如上述的例子就会报错。

6.4 取消正在运行的作业

以下时序图显示了如何取消正在运行的作业的示例

注意: FLS模块在运行Fls_MainFunction调用期间,函数Fls_Cancel是不允许调用的。

Fls_Cancel函数只针对后面四种任务:读、写、擦、比较。它可以取消前述4种正在运行的任务。这个函数是同步类型的。因为是同步函数,返回后即代表取消这个动作执行完了。这个函数会将内部的一些状态复位以准备进行新的任务请求。比如读/写函数开始时会设置状态为BUSY/PENDING。执行Cancel函数后会设置状态为IDLE。由于很多函数(比如:擦、写)都是异步类型的。并且像擦这种任务是比较费时的,假如我已经发起擦的请求给硬件,但是还没完成,这个过程中又发起了Cancel请求,这种情况其实是取消不了的。

7.EB配置解析

Fls Base Address :Dflash的起始地址

Fls Blank Check Api  :Fls_BlankCheck将验证给定的存储区域是否已被擦除,并还未被编程。 该函数应将每个主函数周期的最大检查闪存单元数分别限制为配置值FlsMaxReadNormalModeFlsMaxReadFastMode

Fls Cancel Api  :取消正在进行的作业。 

Fls Compare Api  :将闪存区域的内容与应用程序数据缓冲区的内容进行比较。

Fls Development Error Detect :Det开关,用于开发阶段错误检测

Fls Driver Index (0 -> 254) :一个ECU可以有多个FLS驱动实例,默认配置为0.

Fls Erase Verification :打开会使erase事件变长

Fls Get Job Result Api:返回上一个作业的结果。

Fls Get Status Api  :返回驱动程序状态。

Fls Set Mode Api  :设置闪存驱动程序的操作模式。MEMIF_MODE_SLOW:缓慢的读取访问。MEMIF_MODE_FAST:快速读取访问(Burst Access)

Fls Timeout Supervision  :当超时监督功能开启并且读、写、擦除或比较作业(在硬件中)的超时失败时,会报告运行时错误代码FLS_E_TIMEOUT

Fls Total Size  :不可配置。

Fls Use Interrupts :不可配置

Fls Version Info Api  :返回此模块的版本信息。

Fls Write Verification :打开会是write事件变长

FlsFlushCache : 如果使能可Flash Cache,需要打开

Fls Access Code Erase:不可配置,无需加载AC代码到RAM执行

Fls Access Code Write :不可配置,无需加载AC代码到RAM执行

Fls Call Cycle :目前驱动不支持该功能

Fls Default Mode :工作模式,快速或者慢速

Fls Job End Notification :必须开启,用于通知FEE模块当前FLS操作结果

Fls Job Error Notification :必须开启,用于通知FEE模块当前FLS操作结果

Fls Max Read FastMode:Fast模式下最大读取字节数目

Fls Max Read Normal Mode:Normal模式下最大读取字节数目

Fls Max Write Fast Mode  :Fast模式下最大写入字节数目

Fls Max Write Normal Mode  :Normal模式下最大写入字节数目

Fls Protection:目前驱动不支持该功能

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值