Files
autosar_standard_spec_v4.4/Memory/AUTOSAR_SWS_FlashDriver.md
T

20 KiB

Flash 驱动规范

文档标题: Specification of Flash Driver AUTOSAR CP Release: 4.4.0 文档编号: 025 文档类型: SWS (Software Specification)


文档标识

项目 内容
Document Title Specification of Flash Driver
Document Owner AUTOSAR
Document Responsibility AUTOSAR
Document Identification No 025
Document Status Final
Part of AUTOSAR Standard Classic Platform
Part of Standard Release 4.4.0

文档变更历史

日期 版本 变更者 变更描述
2018-10-31 4.4.0 AUTOSAR Release Management 添加对 MCALMulticoreDistribution 的支持
2017-12-08 4.3.1 AUTOSAR Release Management 移除 HIS 引用;将"default error"重命名为"development error";引入运行时错误;实例化模块的实例 ID 配置
2016-11-30 4.3.0 AUTOSAR Release Management 更新追溯信息;澄清内部缓冲区对齐;细化错误处理,新增配置参数
2015-07-31 4.2.2 AUTOSAR Release Management 调试支持标记为过时;错误分类重做;移除 DEM 引用;澄清 FlsUseInterrupts 配置参数描述
2014-10-31 4.2.1 AUTOSAR Release Management 需求与特性和 BSW 需求关联
2014-03-31 4.1.3 AUTOSAR Release Management 移除 Fls_Init 期间 NULL 指针检查需求;小幅格式更改
2013-10-31 4.1.2 AUTOSAR Release Management 移除模块主函数的时序需求;Fls_GetStatus 在模块未初始化时返回 MEMIF_UNINIT
2013-03-15 4.1.1 AUTOSAR Administration 按新的 SWS_BSWGeneral 重做;生产错误改为扩展生产错误
2011-12-22 4.0.3 AUTOSAR Administration 更正 HW 特定错误的引用;适配配置参数范围;模块短名变更
2010-09-30 3.1.5 AUTOSAR Administration 新增 FlsDefaultMode 配置参数;新增带 SPI 引用的容器;新增 NULL 指针检查
2010-02-02 3.1.4 AUTOSAR Administration 新增 AUTOSAR 标准错误引用;通知例程多重性更正
2008-08-13 3.1.1 AUTOSAR Administration 法律免责声明修订
2008-02-01 3.0.2 AUTOSAR Administration 表格格式更正
2007-12-21 3.0.1 AUTOSAR Administration Fls_Compare 新增 NULL 指针检查
2007-01-24 2.1.15 AUTOSAR Administration 文件包含结构更新;类型使用更正
2006-05-16 2.0 AUTOSAR Administration 文档结构适配 Release 2.0 SWS 模板;新功能:Read、Compare 和 SetMode 函数;可伸缩性:功能可配置(开/关);适配新 MemHwA 架构
2005-05-31 1.0 AUTOSAR Administration 初始版本发布

目录

  1. 介绍与功能概述
  2. 缩略语
  3. 相关文档
  4. 约束与假设
  5. 模块依赖
  6. 需求追溯
  7. 功能规范
  8. API 规范
  9. 时序图
  10. 配置规范
  11. 不适用需求

1 介绍与功能概述

本规范描述 Flash 驱动(FLS)的功能和 API。本规范同时适用于内部和外部 Flash 驱动。

Flash 驱动提供对 Flash 存储器进行读、写、擦除和比较的服务。

服务行为是异步的(写、擦、读、比较)。

内部 Flash 驱动直接访问微控制器硬件,位于微控制器抽象层(MCAL)。外部 Flash 驱动使用处理程序(如 SPI Handler/Driver)或驱动访问外部 Flash 设备,位于 ECU 抽象层。

两种类型驱动的功能需求和功能范围相同。


2 缩略语

缩略语 描述
Flash sector 一次可擦除的最小 Flash 内存量
Flash page 一次可写入的最小 Flash 内存量
FLS Flash 驱动模块缩写
FEE Flash EEPROM Emulation
Fls 模块名
MemIf Memory Abstraction Interface
NvM NVRAM Manager
EcuM ECU State Manager
DEM Diagnostic Event Manager
DET Default Error Tracer

3 相关文档

3.1 AUTOSAR 交付物

  • Layered Software Architecture
  • General Requirements on Basic Software Modules
  • Specification of Memory Abstraction Interface
  • Specification of SPI Handler/Driver
  • Requirements on Flash Driver — AUTOSAR_SRS_FlashDriver.pdf
  • Specification of Default Error Tracer
  • Specification of MCU Driver
  • List of Basic Software Modules
  • General Specification of Basic Software Modules

3.2 相关规范

AUTOSAR 提供基础软件模块通用规范(SWS BSW General),也适用于 Flash 驱动。


4 约束与假设

4.1 限制

Flash 驱动不提供数据完整性机制(如校验和、冗余存储等)。

4.2 适用车型领域

无限制。


5 模块依赖

5.1 系统时钟

内部 Flash 可能依赖系统时钟、预分频器和 PLL。

5.2 通信或 I/O 驱动

外部 Flash 驱动依赖所使用板载通信处理程序(如 SPI Handler/Driver)的 API 和能力。

Flash 驱动是内存抽象架构的一部分,因此某些类型依赖 Memory Interface (MemIf) 模块。


6 需求追溯

(主要追溯,完整表见原文 PDF)

需求 满足者
SRS_BSW_00101 SWS_Fls_00014
SRS_BSW_00323 SWS_Fls_00015, 00020, 00021, 00026, 00027 等多个参数检查需求
SRS_BSW_00337 SWS_Fls_00310, 00312-00319
SRS_BSW_00406 SWS_Fls_00065, 00066, 00268 等
SRS_Fls_12107 (Flash 类型检查) SWS_Fls_00144
SRS_Fls_12132 (静态配置) SWS_Fls_00048, 00208, 00209, 00216, 00217
SRS_Fls_12134 (异步读) SWS_Fls_00001, 00035, 00097, 00098 等
SRS_Fls_12135 (异步写) SWS_Fls_00001, 00026, 00027, 00035 等
SRS_Fls_12136 (异步擦除) SWS_Fls_00001, 00020, 00021, 00035 等
SRS_Fls_12137 (同步取消) SWS_Fls_00033, 00035, 00183, 00229 等
SRS_Fls_12138 (同步状态) SWS_Fls_00034, 00184, 00253
SRS_Fls_12141 (数据验证) SWS_Fls_00056, 00200
SRS_Fls_12143 (单作业) SWS_Fls_00002, 00003, 00023, 00030, 00033, 00036 等
SRS_Fls_12144 (作业处理函数) SWS_Fls_00037, 00038, 00039 等
SRS_Fls_12158 (写前擦除检查) SWS_Fls_00055
SRS_Fls_12159 (地址参数检查) SWS_Fls_00020, 00021, 00026, 00027 等
SRS_Fls_12160 (擦后验证) SWS_Fls_00022
SRS_Fls_12193 (代码加载到 RAM) SWS_Fls_00137, 00140, 00141, 00214
SRS_Fls_12194 (从 RAM 执行) SWS_Fls_00211, 00212, 00213, 00215
SRS_Fls_13300 (从 RAM 卸载) SWS_Fls_00143
SRS_Fls_13301 (异步比较) SWS_Fls_00001, 00150-00153, 00186 等
SRS_Fls_13302 (同步选择/模式) SWS_Fls_00155, 00156, 00187, 00258

完整追溯表见原文 PDF。


7 功能规范

7.1 通用设计规则

[SWS_Fls_00001] ⌈FLS 模块应为 Flash 存储器操作(读/擦/写)提供异步服务。⌋ (SRS_Fls_12134, SRS_Fls_12135, SRS_Fls_12136, SRS_Fls_13301)

[SWS_Fls_00002] ⌈FLS 模块不应缓存数据。FLS 模块应使用通过 API 传递指针引用的应用数据缓冲区。⌋

[SWS_Fls_00003] ⌈FLS 模块不应保证给定应用缓冲区的数据一致性。⌋

[SWS_Fls_00205] ⌈FLS 模块应静态(最晚在编译时)检查静态配置参数的正确性。⌋

[SWS_Fls_00208] ⌈FLS 模块应将所有可用 Flash 内存区域组合为一个线性地址空间(由 FlsBaseAddressFlsTotalSize 参数表示)。⌋

[SWS_Fls_00209] ⌈FLS 模块应根据 Flash 内存区域的物理结构将读、写、擦除和比较函数的地址和长度参数作为"虚拟"地址映射到物理地址。⌋

[SWS_Fls_00389] ⌈FLS 模块应在内部处理数据缓冲区对齐,将传入指针视为按字节对齐。⌋

[SWS_Fls_00390] ⌈如果在 ECU 中使用 Flash 驱动的多个实例,每个实例必须有唯一的实例 ID。该实例 ID 应配置为参数 FlsDriverIndex。如果 ECU 中只使用一个实例,该实例的 FlsDriverIndex 应配置为 0。⌋

7.2 错误处理

7.2.1 开发错误

[SWS_Fls_00004] ⌈

错误类型 相关错误代码 值[hex]
用错误参数调用 API 服务 FLS_E_PARAM_CONFIG 0x01
FLS_E_PARAM_ADDRESS 0x02
FLS_E_PARAM_LENGTH 0x03
FLS_E_PARAM_DATA 0x04
模块未初始化调用 API 服务 FLS_E_UNINIT 0x05
驱动繁忙时调用 API 服务 FLS_E_BUSY 0x06
用 NULL 指针调用 API 服务 FLS_E_PARAM_POINTER 0x0a

7.2.2 运行时错误

错误类型 相关错误代码 值[hex]
擦除验证(空白检查)失败 FLS_E_VERIFY_ERASE_FAILED 0x07
写验证(比较)失败 FLS_E_VERIFY_WRITE_FAILED 0x08
超时 FLS_E_TIMEOUT 0x09

7.2.3 瞬态故障

错误类型 相关错误代码 值[hex]
Flash 擦除失败(HW) FLS_E_ERASE_FAILED 0x01
Flash 写失败(HW) FLS_E_WRITE_FAILED 0x02
Flash 读失败(HW) FLS_E_READ_FAILED 0x03
Flash 比较失败(HW) FLS_E_COMPARE_FAILED 0x04
期望硬件 ID 不匹配 FLS_E_UNEXPECTED_FLASH_ID 0x05

7.2.4 扩展生产错误与生产错误

本模块未规定任何生产错误。

7.3 外部 Flash 驱动

[SWS_Fls_00144] ⌈外部 Flash 驱动初始化期间,FLS 模块应将外部 Flash 设备的硬件 ID 与相应已发布参数对比。如硬件 ID 不匹配,FLS 模块应将错误代码 FLS_E_UNEXPECTED_FLASH_ID 报告给 Default Error Tracer (DET),将 FLS 模块状态设为 FLS_E_UNINIT,且不应初始化自身。⌋

7.4 Flash 访问代码的加载、执行和移除

技术背景:Flash 技术或 Flash 内存分段可能要求访问 Flash 硬件的例程(内部擦除和写入例程)从 RAM 执行,因为在编程 Flash 时无法读取 Flash(用于代码执行所需的指令获取)。

[SWS_Fls_00137] ⌈FLS 模块的实现者应将 Flash 访问例程的代码放在单独的 C 模块 Fls_ac.c 中。⌋

[SWS_Fls_00215] ⌈FLS 模块的 Flash 访问例程应仅在必要时禁用中断并等待擦除/写命令完成。⌋

[SWS_Fls_00140] [SWS_Fls_00141] ⌈如果 FLS 模块配置为在作业启动时将 Flash 访问代码加载到 RAM,Flash 擦除/写入例程应将相应 Flash 访问代码加载到由配置集中函数指针指向的 RAM 位置。⌋

[SWS_Fls_00143] ⌈擦除或写入作业完成或取消后,如 Flash 驱动已将 Flash 访问代码加载到 RAM,FLS 模块的主处理例程应从 RAM 卸载(即覆盖)Flash 访问代码。⌋

[SWS_Fls_00214] ⌈FLS 模块仅在 Flash ROM 中无法执行访问代码时才应将访问代码加载到 RAM。⌋


8 API 规范

8.1 导入的类型

[SWS_Fls_00248] ⌈

模块 头文件 导入类型
MemIf MemIf.h MemIf_JobResultType, MemIf_ModeType, MemIf_StatusType
Std_Types StandardTypes.h Std_ReturnType, Std_VersionInfoType

8.2 类型定义

8.2.1 Fls_ConfigType

内容
Name Fls_ConfigType
Type Structure
Range Hardware dependend structure — 初始化数据结构内容为 Flash 内存硬件特定
Description 保存 Flash 驱动配置集的结构。指向此结构的指针提供给 Flash 驱动初始化例程。
Available via Fls.h

8.2.2 Fls_AddressType

内容
Name Fls_AddressType
Type uint(8/16/32 位,取决于目标平台和 Flash 设备)
Description 用作从已配置 Flash 基地址访问特定 Flash 内存区域的地址偏移。

[SWS_Fls_00216] ⌈Fls_AddressType 的下限应为 0。⌋ [SWS_Fls_00217] ⌈如有必要,FLS 模块应添加设备特定基地址。⌋

8.2.3 Fls_LengthType

内容
Name Fls_LengthType
Type 与 Fls_AddressType 相同
Description 指定要读/写/擦/比较的字节数。

8.3 函数定义

8.3.1 Fls_Init

void Fls_Init(const Fls_ConfigType* ConfigPtr)
内容
Service ID[hex] 0x00
Sync/Async Synchronous
Reentrancy Non Reentrant
Description 初始化 Flash 驱动。

[SWS_Fls_00014] ⌈Fls_Init 函数应使用给定配置集中的参数初始化 FLS 模块(软件)和所有 Flash 内存相关寄存器(硬件)。⌋

[SWS_Fls_00323] ⌈完成初始化后,应将 FLS 模块状态设为 MEMIF_IDLE。⌋ [SWS_Fls_00324] ⌈完成初始化后,应将 Flash 作业结果设为 MEMIF_JOB_OK。⌋ [SWS_Fls_00048] ⌈如硬件支持,应按配置集设置 Flash 内存擦除/写保护。⌋

8.3.2 Fls_Erase

Std_ReturnType Fls_Erase(
    Fls_AddressType TargetAddress,
    Fls_LengthType Length
)
内容
Service ID[hex] 0x01
Sync/Async Asynchronous
Description 擦除 Flash 扇区。
Return E_OK: 擦除命令已接受;E_NOT_OK: 未接受

[SWS_Fls_00218] ⌈Fls_Erase 作业应擦除一个或多个完整 Flash 扇区。⌋ [SWS_Fls_00220] [SWS_Fls_00221] ⌈应在 FLS 模块主函数内异步执行,从 FlsBaseAddress + TargetAddress 起擦除大小为 Length 的 Flash 内存块。Length 将四舍五入到下一个完整扇区边界。⌋

参数检查:

  • [SWS_Fls_00020] 擦除起始地址必须对齐到 Flash 扇区边界,在指定地址边界内,否则报 FLS_E_PARAM_ADDRESS
  • [SWS_Fls_00021] 擦除长度必须大于 0,擦除结束地址对齐到 Flash 扇区边界,在上边界内,否则报 FLS_E_PARAM_LENGTH

8.3.3 Fls_Write

Std_ReturnType Fls_Write(
    Fls_AddressType TargetAddress,
    const uint8* SourceAddressPtr,
    Fls_LengthType Length
)
内容
Service ID[hex] 0x02
Sync/Async Asynchronous
Description 写入一个或多个完整 Flash 页。

[SWS_Fls_00223] ⌈Fls_Write 作业应向 Flash 设备写入一个或多个完整 Flash 页。⌋ [SWS_Fls_00226] ⌈从 FlsBaseAddress + TargetAddress 起,使用 SourceAddressPtr 提供的数据编程大小为 Length 的 Flash 内存块。⌋

参数检查:

  • [SWS_Fls_00026] 写起始地址对齐到 Flash 页边界,否则报 FLS_E_PARAM_ADDRESS
  • [SWS_Fls_00027] 写长度 > 0,结束地址对齐到 Flash 页边界,否则报 FLS_E_PARAM_LENGTH
  • [SWS_Fls_00157] 检查 DataBuffer 指针非 NULL,否则报 FLS_E_PARAM_DATA

8.3.4 Fls_Cancel

void Fls_Cancel(void)
内容
Service ID[hex] 0x03
Sync/Async Synchronous
Description 取消正在进行的作业。

[SWS_Fls_00229] ⌈应取消正在进行的 Flash 读、写、擦除或比较作业。⌋ [SWS_Fls_00033] / [SWS_Fls_00335] ⌈同步中止作业,将模块状态设为 MEMIF_IDLE。⌋ [SWS_Fls_00336] ⌈如作业结果为 MEMIF_JOB_PENDING,设为 MEMIF_JOB_CANCELED。⌋

8.3.5 Fls_GetStatus

MemIf_StatusType Fls_GetStatus(void)
内容
Service ID[hex] 0x04
Sync/Async Synchronous
Reentrancy Reentrant
Description 同步返回 Flash 状态。

8.3.6 Fls_GetJobResult

MemIf_JobResultType Fls_GetJobResult(void)
内容
Service ID[hex] 0x05
Sync/Async Synchronous
Reentrancy Reentrant
Description 同步返回上次作业的结果。

8.3.7 Fls_Read

Std_ReturnType Fls_Read(
    Fls_AddressType SourceAddress,
    uint8* TargetAddressPtr,
    Fls_LengthType Length
)
内容
Service ID[hex] 0x07
Sync/Async Asynchronous
Description 从 Flash 内存读取一个或多个字节。

8.3.8 Fls_Compare

Std_ReturnType Fls_Compare(
    Fls_AddressType SourceAddress,
    const uint8* TargetAddressPtr,
    Fls_LengthType Length
)
内容
Service ID[hex] 0x08
Sync/Async Asynchronous
Description 将 Flash 中数据与给定数据缓冲区进行比较。

8.3.9 Fls_SetMode

void Fls_SetMode(MemIf_ModeType Mode)
内容
Service ID[hex] 0x09
Description 设置 Flash 操作模式。

8.3.10 Fls_GetVersionInfo

void Fls_GetVersionInfo(Std_VersionInfoType* VersioninfoPtr)
内容
Service ID[hex] 0x10
Reentrancy Reentrant

8.4 回调通知

无,FLS 是基础模块。

8.5 调度函数

8.5.1 Fls_MainFunction

void Fls_MainFunction(void)
内容
Service ID[hex] 0x06
Description 执行 Flash 作业(读/写/擦/比较)的处理。
Available via SchM_Fls.h

执行作业处理、超时监视、报告硬件错误(FLS_E_ERASE/WRITE/READ/COMPARE_FAILED)。

8.6 期望接口

8.6.1 强制接口

API 函数 头文件 描述
Det_ReportRuntimeError Det.h 报告运行时错误

8.6.2 可选接口

API 函数 头文件 描述
Det_ReportError Det.h 报告开发错误
Dem_ReportErrorStatus Dem.h 报告 DEM 状态(如硬件错误)

8.6.3 可配置接口

作业结束通知
void Fls_JobEndNotification(void)

作业成功完成时调用。

作业错误通知
void Fls_JobErrorNotification(void)

作业被取消或以负结果结束时调用。


9 时序图

类似 EEPROM 驱动:

  • 初始化:EcuM → Fls:Fls_Init
  • 读/写/擦/比较:NvM → Fee → Fls → 周期 Fls_MainFunction → JobEndNotification 回调
  • 取消运行中作业:Fls_Cancel 同步,状态变为 MEMIF_IDLE,作业结果 MEMIF_JOB_CANCELED

10 配置规范

10.1 容器与配置参数

10.1.1 Fls

内容
SWS Item ECUC_Fls_00200
Module Name Fls
Module Description Flash 驱动配置
Post-Build Variant Support true
Supported Config Variants VARIANT-POST-BUILD, VARIANT-PRE-COMPILE

10.1.2 FlsGeneral

参数 描述
FlsDevErrorDetect 开发错误检测开关
FlsVersionInfoApi 版本信息 API 启用开关
FlsCancelApi Cancel API 启用
FlsCompareApi Compare API 启用
FlsGetJobResultApi GetJobResult API 启用
FlsGetStatusApi GetStatus API 启用
FlsSetModeApi SetMode API 启用
FlsUseInterrupts 中断/轮询作业处理选择
FlsEraseVerificationEnabled 擦除验证启用
FlsWriteVerificationEnabled 写验证启用
FlsTimeoutSupervisionEnabled 超时监视启用
FlsDriverIndex 驱动实例 ID(多实例时唯一)

10.1.3 FlsConfigSet

参数 描述
FlsBaseAddress Flash 基地址
FlsTotalSize Flash 总大小
FlsDefaultMode 默认模式
FlsMaxReadFastMode 快速模式最大读块大小
FlsMaxReadNormalMode 普通模式最大读块大小
FlsMaxWriteFastMode 快速模式最大写块大小
FlsMaxWriteNormalMode 普通模式最大写块大小
FlsCallCycle 作业调用周期
FlsAcLoadOnJobStart 作业启动时加载访问代码到 RAM 开关
FlsAcErase 擦除访问代码函数指针
FlsAcWrite 写访问代码函数指针
FlsJobEndNotification 作业结束通知回调
FlsJobErrorNotification 作业错误通知回调

10.1.4 FlsSectorList / FlsSector

每个 Flash 扇区配置:

  • FlsNumberOfSectors
  • FlsPageSize
  • FlsSectorSize
  • FlsSectorStartaddress

10.1.5 FlsPublishedInformation

已发布参数:

  • 已擦除 Flash 单元值
  • Flash 单元大小

10.2 SPI 特定扩展(外部 Flash)

引用 SPI 配置参数。


11 不适用需求

[SWS_Fls_00366] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 和 SRS_SPAL_* 需求,详见原文 PDF。


翻译说明

  • 本文档完整翻译自 AUTOSAR_SWS_FlashDriver v4.4.0(Document ID 025,67 页)。
  • 保留所有需求 ID(SWS_Fls_xxxxx、SRS_Fls_xxxxx、ECUC_Fls_xxxxx)。
  • 保留 AUTOSAR 方框符 ⌈⌋。
  • 模块缩写(Fls、Fee、Ea、NvM、MemIf、SPI、DEM、DET、EcuM 等)和 API 函数名保持英文。
  • 完整配置参数详细描述请参考原文 PDF 第 10 章。