41 KiB
OCU 驱动规范(Specification of OCU Driver)
AUTOSAR CP Release 4.4.0
文档元信息
| 字段 | 内容 |
|---|---|
| 文档标题 | OCU 驱动规范(Specification of OCU Driver) |
| 文档所有者 | AUTOSAR |
| 文档责任方 | AUTOSAR |
| 文档标识号 | 615 |
| 文档状态 | Final(最终版) |
| 所属 AUTOSAR 标准 | Classic Platform(经典平台) |
| 所属标准版本 | 4.4.0 |
文档变更历史(Document Change History)
| 日期 | 版本 | 变更人 | 变更描述 |
|---|---|---|---|
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 移除 OcuGroup(ECUC_Ocu_00161、ECUC_Ocu_00162、ECUC_Ocu_00163);更新头文件结构;多核特性(SWS_Ocu_00170、SWS_Ocu_CONSTR_00001、SWS_Ocu_CONSTR_00002) |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | OcuGroup 设为过时(ECUC_Ocu_00161、ECUC_Ocu_00162 和 ECUC_Ocu_00163);将"默认错误检测"重命名为"开发错误检测" |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 移除 SWS_Ocu_00134 和 SWS_Ocu_00135;将"SRS_BSW_000386"重命名为"SRS_BSW_00386";移除 SRS_BSW_00157、SRS_BSW_00326、SRS_BSW_00329、SRS_BSW_00338、SRS_BSW_00355、SRS_BSW_00370、SRS_BSW_00376、SRS_BSW_00434、SRS_BSW_0431;将"SRS_SPAL12448"更改为"SRS_SPAL_12448" |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | DET 已重命名;SWS_Ocu_00041 和 SWS_Ocu_00042 需求已移除;OCU_E_PARAM_CONFIG 已移除;新增 OCU_E_INIT_FAILED;无效的需求 ID:已更新 SWS_Ocu_156、SWS_Ocu_169 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 将 postBuildVariantValue 和 postBuildVariantMultiplicity 设置为 false,并将所有变体的 valueConfigClass 和 multiplicityConfigClass 设置为 preCompile;移除自动支持的 BSW 需求;对 SWS_BSW_00380 的引用已移除 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 文档结构的细微更新;编辑性变更;移除了关于变更文档的章节 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 初始发布 |
目录(Table of Contents)
- 引言与功能概述(Introduction and functional overview)
- 缩略语与缩写(Acronyms and abbreviations)
- 相关文档(Related documentation)
- 约束与假设(Constraints and assumptions)
- 对其他模块的依赖(Dependencies to other modules)
- 需求可追溯性(Requirements traceability)
- 功能规范(Functional specification)
- API 规范(API specification)
- 序列图与时序图(Sequence and Timing diagrams)
- 配置规范(Configuration specification)
- 不适用需求(Not applicable requirements)
1 引言与功能概述(Introduction and functional overview)
本规范规定了 AUTOSAR 基础软件模块 OCU 驱动的功能、API 和配置。
每个 OCU 软件通道链接到属于微控制器的硬件 OCU 外设。可以选择性地将输出引脚附加到此通道。
驱动提供用于初始化和控制微控制器内部 OCU 功能(输出比较单元)的功能。OCU 驱动允许在计数器值与定义的阈值匹配时自动比较和执行动作。OCU 驱动为以下提供服务和配置参数:
- 启动和停止比较过程
- 设置比较阈值
- 启用和禁用通知机制
- 获取计数器值
- 更改输出引脚状态
- 触发某些硬件资源(如果可用,包括 ADC、DMA)
通道计数器的 tick 持续时间取决于通道特定设置(OCU 驱动的一部分)以及由 MCU 模块控制的系统时钟和时钟树设置。本规范不限制 tick 持续时间。
某些微控制器没有专用的 OCU 硬件单元,而是具有可配置的通用定时器模块,可提供 OCU 功能以及其他定时器功能。本规范不假设硬件架构。相反,它定义了参数和 API,以便可以在任何合适的硬件架构上实现。下图显示了 OCU 通道的典型表示:
Free running counter(自由运行计数器)
OUTPUT
Comparison threshold(比较阈值)
图 1:OCU 通道的抽象视图
"output" 是在比较匹配时实际执行的动作。
2 缩略语与缩写(Acronyms and abbreviations)
| 缩略语/缩写 | 描述 |
|---|---|
| OCU | 输出比较单元(Output Compare Unit) |
| DMA | 直接内存访问(Direct Memory Access) |
| MCAL | 微控制器抽象层(Microcontroller Abstraction Layer) |
| MCU | 微控制器单元(Microcontroller Unit) |
| DEM | 诊断事件管理器(Diagnostic Event Manager) |
| DET | 默认错误跟踪器(Default Error Tracer) |
| SPAL | 标准外设抽象层(Standard Peripheral Abstraction Layer) |
| ISR | 中断服务例程(Interrupt Service Routine) |
术语定义:
| 术语 | 描述 |
|---|---|
| OCU channel | 表示由自由运行计数器、比较阈值以及作为比较过程结果所执行的动作组成的逻辑实体。 |
| Compare threshold(比较阈值) | 每次计数器增加一个单位时与计数器内容进行比较的目标值。 |
| Free running counter(自由运行计数器) | 从最小值(或最大值)运行到最大值(或最小值)的计数器,并在达到最大值(或最小值)后自动从最小值(或最大值)重新启动的计数器。 |
| Reference Interval(参考间隔) | Ocu_SetAbsolutThreshold API 调用方以 ticks 为单位给定的间隔,用作计算返回信息的基础。 |
3 相关文档(Related documentation)
3.1 输入文档(Input documents)
- [1] 分层软件架构,AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
- [2] SPAL 的一般需求,AUTOSAR_SRS_SPALGeneral.pdf
- [3] 基础软件模块的一般需求,AUTOSAR_SRS_BSWGeneral.pdf
- [4] 默认错误跟踪器规范,AUTOSAR_SWS_DefaultErrorTracer.pdf
- [5] MCU 驱动规范,AUTOSAR_SWS_MCUDriver.pdf
- [6] ECU 配置规范,AUTOSAR_TPS_ECUConfiguration.pdf
- [7] 基础软件模块描述模板,AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
- [8] 基础软件模块列表,AUTOSAR_TR_BSWModuleList.pdf
4 约束与假设(Constraints and assumptions)
4.1 假设(Assumptions)
4.1.1 时钟(Clock)
驱动不支持时钟的动态更改。
由于系统时钟完全由 MCU 模块管理,因此系统时钟设置中的任何动态更改都会影响此模块。
该模块不在睡眠模式下运行。
4.1.2 资源(Resources)
资源分配仅由 SW 或 HW 完成,以避免共享资源问题。
例如:API Ocu_SetPinState 的使用。不能对处于 RUNNING 状态的通道调用此 API 来更改引脚状态,否则硬件在比较匹配时自动设置的状态与 API 设置的状态之间可能存在冲突。
4.1.3 计数与比较(Counting and comparing)
假设运行此驱动的硬件具有以下计数器抽象模型(以八位计数器为例):
Free running up 0 1 2 3 … 253 254 255
counter
图 2:此驱动自由运行计数器的抽象模型
- 最小值为 0
- 最大值为 255
- 当计数器超过最大值时,它将重新加载为 0。这意味着它有 256 个计数步骤。
由于计数的量化,在将计数器内容与阈值进行比较时存在两种不同的情况。比较可以在进入计数器状态时发生,也可以在退出状态时发生,如下图所示:
Free running counter … 34 35 36 37 38 39
…
Compare threshold 35
Or
Free running counter … 34 35 36 37 38 39
…
Compare threshold 35
图 3:驱动中预期的比较过程抽象模型
此驱动的预期行为是在进入由阈值表示的状态时进行比较。
4.2 限制(Limitations)
无限制。
4.3 对汽车领域的适用性(Applicability to car domains)
无限制。
5 对其他模块的依赖(Dependencies to other modules)
模块 DET
如果为 OCU 驱动启用了开发错误检测,则每当此模块遇到开发错误时,驱动应将错误报告给默认错误跟踪器(DET)。
模块 DEM
OCU 驱动应将生产错误报告给诊断事件管理器(DEM)。
模块 MCU 驱动
微控制器单元驱动(MCU 驱动)主要负责初始化和控制芯片内部时钟源和时钟预分频器。OCU 依赖于系统时钟。因此,系统时钟的更改(例如 PLL on → PLL off)也会影响 OCU 硬件的时钟设置。
MCU 驱动将设置全局预分频器和 OCU 时钟。OCU 驱动不会在其初始化函数中负责设置配置全局时钟、全局预分频器和 PLL 的寄存器。这必须由 MCU 模块完成。OCU 驱动仅配置本地(OCU 外设特定)资源。
文档 [6] AUTOSAR_TPS_ECUConfiguration 包含章节"4.8 - 时钟树配置",详细说明了向外设提供参考时钟信号的机制。
模块 PORT
用作 OCU 输出的端口引脚的配置由 PORT 驱动完成。因此,PORT 驱动必须在使用 OCU 功能之前进行初始化。
5.1 文件结构(File structure)
5.1.1 代码文件结构(Code file structure)
[SWS_Ocu_00001] ⌈代码文件结构不应在本规范中完全定义。在这一点上,应指出代码文件结构应包括以下文件:
- Ocu_Lcfg.c – 用于链接时可配置参数
- Ocu_PBcfg.c – 用于后构建时可配置参数
这些文件应包含所有链接时和后构建时可配置参数。⌋ (SRS_BSW_00419, SRS_BSW_00346, SRS_BSW_00158, SRS_BSW_00314)
5.1.2 头文件结构(Header file structure)
[SWS_Ocu_00006] ⌈Ocu.c 应包含 Ocu.h 和 Det.h。⌋ ()
6 需求可追溯性(Requirements traceability)
摘要说明: 本节列出 BSW 和 SPAL 通用需求与 OCU 驱动特定需求(SWS_Ocu_xxxxx)的对应关系。完整可追溯性表见原文 PDF(第 12-21 页)。
关键映射:
- SWS_Ocu_00012(版本检查宏)← SRS_BSW_00004
- SWS_Ocu_00036(Init 函数)← SRS_BSW_00344, SRS_BSW_00404, SRS_BSW_00101, SRS_SPAL_12057
- SWS_Ocu_00045(DeInit 函数)← SRS_Ocu_00005
- SWS_Ocu_00051(StartChannel 函数)← SRS_Ocu_00008
- SWS_Ocu_00058(StopChannel 函数)← SRS_Ocu_00008
- SWS_Ocu_00066(SetPinState 函数)← SRS_Ocu_00011
- SWS_Ocu_00076(SetPinAction 函数)← SRS_Ocu_00012
- SWS_Ocu_00085(GetCounter 函数)← SRS_Ocu_00009
- SWS_Ocu_00091(SetAbsoluteThreshold 函数)← SRS_Ocu_00010
- SWS_Ocu_00094(SetAbsoluteThreshold 可配置 On/Off)← SRS_BSW_00171
- SWS_Ocu_00103(SetRelativeThreshold 可配置 On/Off)
- SWS_Ocu_00111(DisableNotification 可配置 On/Off)
- SWS_Ocu_00118(EnableNotification 可配置 On/Off)
- SWS_Ocu_00049(DeInit 可配置 On/Off)← SRS_BSW_00171
- SWS_Ocu_00070(SetPinState 可配置 On/Off)← SRS_BSW_00171
- SWS_Ocu_00079(SetPinAction 可配置 On/Off)← SRS_BSW_00171
- SWS_Ocu_00088(GetCounter 可配置 On/Off)← SRS_BSW_00171
- SWS_Ocu_00136(DeInit 停止所有自由运行计数器)← SRS_SPAL_12125
- SWS_Ocu_00137(DeInit 错误检测:RUNNING 状态)
- SWS_Ocu_00138(Ocu_ReturnType 定义)
- SWS_Ocu_00156(模块文档/标识)← SRS_BSW_xxxxx 系列
- SWS_Ocu_00170(多核特性约束)
- SWS_Ocu_CONSTR_00001 / 00002(多核约束)
错误检测需求(SWS_Ocu_00043、00050、00055、00056、00057、00064、00065、00071、00072、00073、00074、00075、00080、00081、00082、00083、00089、00090、00095、00096 等)实现 OCU_E_UNINIT、OCU_E_BUSY、OCU_E_PARAM_INVALID_CHANNEL、OCU_E_PARAM_NO_PIN、OCU_E_PARAM_INVALID_STATE、OCU_E_PARAM_INVALID_ACTION 等开发错误。
7 功能规范(Functional specification)
7.1 一般行为(General behavior)
[SWS_Ocu_00010] ⌈如果 OCU 单元的自由运行计数器可被另一个定时器模块使用,则 Ocu 驱动不得启动或停止该自由运行计数器。⌋ (SRS_SPAL_12125)
[SWS_Ocu_00011] ⌈API Ocu_Init 应启动专由此驱动使用的所有自由运行计数器。⌋ (SRS_SPAL_12125)
[SWS_Ocu_00018] ⌈开发错误的检测在预编译时是可配置的(ON/OFF)。开关 OcuDevErrorDetectApi 应激活或取消激活所有开发错误的检测。⌋ (SRS_BSW_00369, SRS_BSW_00386)
[SWS_Ocu_00019] ⌈如果启用了开关 OcuDevErrorDetectApi,则启用 API 参数检查。有关检测错误的详细说明可以在错误分类和 API 规范章节中找到。⌋ (SRS_BSW_00386, SRS_BSW_00369, SRS_BSW_00339)
[SWS_Ocu_00020] ⌈生产错误的检测无法关闭。⌋ (SRS_BSW_00339)
7.2 版本检查(Version check)
7.2.1 背景与原理(Background & Rationale)
有关版本检查的详细信息,请参阅 SWS_BSWGeneral 中的第 5.1.8"版本检查"章节。
7.3 时间单位 Ticks(Time Unit Ticks)
7.3.1 背景与原理(Background & Rationale)
要从寄存器值中获取时间,必须知道振荡器频率、预分频器等。由于这些设置是在 MCU 和/或其他模块中进行的,因此无法计算此类时间。
因此,时间与 ticks 之间的转换应属于上层。
7.3.2 需求(Requirements)
摘要: OCU 驱动 API 服务中使用的所有时间单位应为 ticks。物理单位与 ticks 之间的转换由 ECU 抽象层负责。
7.4 错误分类(Error classification)
7.4.1 开发错误(Development Errors)
[SWS_Ocu_00013] ⌈开发错误类型:OCU_E_PARAM_INVALID_CHANNEL(当使用无效的通道号调用 API 时报告)。⌋
[SWS_Ocu_00014] ⌈开发错误类型:OCU_E_PARAM_NO_PIN(当通道未配置关联引脚时报告)。⌋
[SWS_Ocu_00015] ⌈开发错误类型:OCU_E_PARAM_INVALID_STATE(当 API 在无效状态下调用时报告)。⌋
[SWS_Ocu_00016] ⌈开发错误类型:OCU_E_PARAM_INVALID_ACTION(当 Ocu_SetPinAction 的动作参数无效时报告)。⌋
[SWS_Ocu_00017] ⌈开发错误类型:OCU_E_BUSY(当对正在运行的通道调用 Ocu_StartChannel 时报告)。⌋
[SWS_Ocu_00173] ⌈开发错误类型:OCU_E_UNINIT(当 API 在 OCU 驱动未初始化时调用时报告)。⌋
[SWS_Ocu_00174] ⌈开发错误类型:OCU_E_ALREADY_INITIALIZED(当 Ocu_Init 在 OCU 驱动和硬件已初始化时调用时报告)。⌋
[SWS_Ocu_00175] ⌈开发错误类型:OCU_E_INIT_FAILED(当 OCU 驱动初始化失败时报告)。⌋
7.4.2 运行时错误(Runtime Errors)
无。
7.4.3 瞬态故障(Transient Faults)
无。
7.4.4 生产错误(Production Errors)
本模块不指定任何生产错误。
7.5 错误检测(Error Detection)
参见 SWS_Ocu_00018、SWS_Ocu_00019、SWS_Ocu_00020。
7.6 错误通知(Error Notification)
[SWS_Ocu_00021] ⌈检测到的开发错误应使用默认错误跟踪器(DET)的服务 Det_ReportError 进行报告(如果设置了预处理器开关 OcuDevErrorDetectApi)。⌋ (SRS_BSW_00339)
7.7 调试支持(Debug Support)
[SWS_Ocu_00023] ⌈AUTOSAR 调试可访问的每个变量应定义为全局变量。⌋ ()
[SWS_Ocu_00024] ⌈应调试的变量的所有类型定义应可通过头文件 Ocu.h 访问。⌋ ()
[SWS_Ocu_00025] ⌈头文件中变量的声明应使得可以通过 C "sizeof" 计算变量的大小。⌋ ()
[SWS_Ocu_00026] ⌈可用于调试的变量应在相应的 OCU 驱动描述中描述。⌋ ()
8 API 规范(API specification)
8.1 导入类型(Imported types)
[SWS_Ocu_00027] ⌈
| 模块 | 头文件 | 导入类型 |
|---|---|---|
| Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType |
⌋ ()
8.2 类型定义(Type definitions)
8.2.1 Ocu_ChannelType
[SWS_Ocu_00028] ⌈
| 字段 | 内容 |
|---|---|
| Name | Ocu_ChannelType |
| Type | uint |
| Range | 8 / 16 / 32 位(实现特定) |
| Description | OCU 通道的数字标识符。 |
| Available via | Ocu.h |
⌋ ()
8.2.2 Ocu_ValueType
[SWS_Ocu_00029] ⌈
| 字段 | 内容 |
|---|---|
| Name | Ocu_ValueType |
| Type | uint |
| Range | 8 / 16 / 32 位(实现特定) |
| Description | 用于读取计数器和写入阈值值的类型(以 ticks 数表示)。 |
| Available via | Ocu.h |
⌋ (SRS_SPAL_12063)
8.2.3 Ocu_PinStateType
[SWS_Ocu_00031] ⌈
| 字段 | 内容 |
|---|---|
| Name | Ocu_PinStateType |
| Type | Enumeration |
| Range | OCU_HIGH(OCU 通道关联的引脚处于高状态) OCU_LOW(OCU 通道关联的引脚处于低状态) |
| Description | OCU 通道链接的引脚的输出状态。 |
| Available via | Ocu.h |
⌋ ()
8.2.4 Ocu_PinActionType
[SWS_Ocu_00032] ⌈
| 字段 | 内容 |
|---|---|
| Name | Ocu_PinActionType |
| Type | Enumeration |
| Range | OCU_SET_HIGH(比较匹配时通道引脚将设置为 HIGH) OCU_SET_LOW(比较匹配时通道引脚将设置为 LOW) OCU_TOGGLE(比较匹配时通道引脚将设置为当前电平的反相 HIGH) OCU_DISABLE(比较匹配时通道引脚将保持当前电平) |
| Description | 在 OCU 通道关联的引脚上自动执行的动作(由硬件)。 |
| Available via | Ocu.h |
⌋ ()
8.2.5 Ocu_ConfigType
[SWS_Ocu_00033] ⌈
| 字段 | 内容 |
|---|---|
| Name | Ocu_ConfigType |
| Type | Structure(硬件特定的初始化数据结构) |
| Description | 包含 OCU 驱动初始化数据的数据结构类型。 |
| Available via | Ocu.h |
⌋ (SRS_Ocu_00002, SRS_SPAL_12263, SRS_BSW_00405, SRS_BSW_00438)
[SWS_Ocu_00034] ⌈Ocu_ConfigType 是包含 OCU 驱动初始化数据的数据结构类型。
强制参数:
- 通道/通道 ID 的符号名称
- 计数器的最大值
- 以 ticks 数表示的时间分辨率
- 通知函数
- 阈值的默认值
- 计数器的最小值
可选参数(如果硬件支持):
- 计数方向
- 输出引脚(电平以及可能的自动动作)
- 硬件触发事件(ADC 或 DMA)
- 微控制器 OCU 特定的 HW 属性(如果硬件支持,可选预分频器、时钟设置)
⌋ (SRS_Ocu_00002, SRS_SPAL_12461)
8.2.6 Ocu_ReturnType
[SWS_Ocu_00138] ⌈
| 字段 | 内容 |
|---|---|
| Name | Ocu_ReturnType |
| Type | Enumeration |
| Range | OCU_CM_IN_REF_INTERVAL(比较匹配将发生在当前参考间隔内) OCU_CM_OUT_REF_INTERVAL(比较匹配将不会发生在当前参考间隔内) |
| Description | 设置新阈值后的返回信息。 |
| Available via | Ocu.h |
⌋ ()
8.3 函数定义(Function definitions)
8.3.1 Ocu_Init
[SWS_Ocu_00035] ⌈
| 字段 | 内容 |
|---|---|
| Service name | Ocu_Init |
| Syntax | void Ocu_Init(const Ocu_ConfigType* ConfigPtr) |
| Service ID[hex] | 0x00 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | ConfigPtr - 指向配置集的指针 |
| Description | OCU 初始化服务。 |
| Available via | Ocu.h |
⌋ ()
[SWS_Ocu_00036] ⌈Ocu_Init 函数应初始化所有内部变量和微控制器的已使用 Ocu 结构,根据由 ConfigPtr 引用的配置集。⌋ (SRS_BSW_00344, SRS_BSW_00404, SRS_BSW_00101, SRS_SPAL_12057)
注意: 所有通道均由 API Ocu_Init 一次性初始化。没有单独初始化每个通道的 API。
[SWS_Ocu_00037] ⌈Ocu_Init 函数应仅初始化已配置的资源,并且不应触及配置文件中未配置的资源。⌋ (SRS_SPAL_12057, SRS_SPAL_12125)
[SWS_Ocu_00038] ⌈如果硬件只允许寄存器的一种用途(寄存器专用于 OCU 资源),则 OCU 驱动负责初始化该寄存器。⌋ (SRS_SPAL_12461)
注释 1: 如果寄存器可以影响多个硬件模块,并且它不是 I/O 寄存器,则应由 MCU 驱动对其进行初始化。
注释 2: 复位后需要直接初始化的一次性可写寄存器应由启动代码初始化。
注释 3: 所有其他寄存器应由启动代码初始化。
注释 4: 如果寄存器可以影响多个硬件模块,并且它是 I/O 寄存器,则应由 PORT 驱动对其进行初始化。
[SWS_Ocu_00039] ⌈Ocu_Init 函数应停止所有通道。⌋ (SRS_SPAL_12057)
[SWS_Ocu_00040] ⌈Ocu_Init 函数应禁用所有通知。⌋ (SRS_SPAL_12057)
原因是这些通知的用户可能尚未准备好。他们可以调用 Ocu_EnableNotification() 来开始接收通知。
[SWS_Ocu_00043] ⌈如果为 OCU 驱动启用了开发错误检测,并且当 OCU 驱动和硬件已初始化时调用了函数 Ocu_Init,则函数 Ocu_Init 应引发开发错误 OCU_E_ALREADY_INITIALIZED 并返回而不执行任何操作。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00044] ⌈通过执行函数 Ocu_Init 重新初始化 OCU 驱动需要先通过执行函数 Ocu_DeInit 进行反初始化。⌋ ()
8.3.2 Ocu_DeInit
[SWS_Ocu_00045] ⌈
| 字段 | 内容 |
|---|---|
| Service name | Ocu_DeInit |
| Syntax | void Ocu_DeInit(void) |
| Service ID[hex] | 0x01 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Description | 此函数反初始化 OCU 模块。 |
| Available via | Ocu.h |
⌋ (SRS_Ocu_00005)
[SWS_Ocu_00046] ⌈Ocu_DeInit 函数应将由 Ocu_Init 初始化的 OCU 变量和寄存器反初始化到与上电复位状态相当的状态。不可写的寄存器的值不包括在内。⌋ (SRS_BSW_00336, SRS_SPAL_12163)
注意: 由硬件设计负责该状态不会导致 µC 中未定义的活动。
[SWS_Ocu_00047] ⌈Ocu_DeInit 函数应禁用所有使用的中断和通知。⌋ (SRS_SPAL_12163)
[SWS_Ocu_00048] ⌈Ocu_DeInit 函数应仅影响由静态配置和/或先前调用 Ocu_Init() 传递的运行时配置集分配的外设。⌋ ()
[SWS_Ocu_00136] ⌈API Ocu_DeInit 应停止专由此驱动使用的所有自由运行计数器。⌋ (SRS_SPAL_12125)
注意: 为防止反初始化期间的未定义行为,用户必须在调用 API Ocu_DeInit 之前停止所有 RUNNING 通道(通过调用函数 Ocu_StopChannel)。
[SWS_Ocu_00137] ⌈如果为 OCU 驱动启用了开发错误检测:如果在调用函数 Ocu_DeInit 时通道仍处于 RUNNING 状态,则函数应引发开发错误 'OCU_E_PARAM_INVALID_STATE' 并返回而不执行任何操作。⌋ ()
[SWS_Ocu_00049] ⌈Ocu_DeInit 函数应通过配置参数 OcuDeInitApi {OCU_DE_INIT_API} 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171)
[SWS_Ocu_00050] ⌈如果为 OCU 驱动启用了开发错误检测:如果驱动未初始化,则函数 Ocu_DeInit 应引发错误 OCU_E_UNINIT。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_SPAL_12448)
8.3.3 Ocu_StartChannel
[SWS_Ocu_00051] ⌈
| 字段 | 内容 |
|---|---|
| Service name | Ocu_StartChannel |
| Syntax | void Ocu_StartChannel(Ocu_ChannelType ChannelNumber) |
| Service ID[hex] | 0x02 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant for different channel numbers |
| Parameters (in) | ChannelNumber - OCU 的数字标识符 |
| Description | 启动 OCU 通道的服务。 |
| Available via | Ocu.h |
⌋ (SRS_Ocu_00008)
[SWS_Ocu_00052] ⌈Ocu_StartChannel 函数应通过允许执行所有比较匹配已配置的动作来启动 OCU 通道。⌋ (SRS_Ocu_00008)
[SWS_Ocu_00053] ⌈Ocu_StartChannel 函数应在为不同通道调用时可重入。⌋ ()
[SWS_Ocu_00054] ⌈如果成功执行函数 Ocu_StartChannel,所选通道的状态应设置为"RUNNING"。⌋ ()
[SWS_Ocu_00055] ⌈如果为 OCU 驱动启用了开发错误检测:如果在处于"RUNNING"状态的通道上调用函数 Ocu_StartChannel,则函数应引发错误 OCU_E_BUSY 并返回而不执行任何操作。⌋ (SRS_BSW_00406, SRS_SPAL_12448)
[SWS_Ocu_00056] ⌈如果为 OCU 驱动启用了开发错误检测:如果参数 ChannelNumber 无效(不在配置指定的范围内),函数 Ocu_StartChannel 应引发错误 OCU_E_PARAM_INVALID_CHANNEL 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00057] ⌈如果为 OCU 驱动启用了开发错误检测:如果驱动未初始化,函数 Ocu_StartChannel 应引发错误 OCU_E_UNINIT 并返回而不执行任何操作。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_SPAL_12448)
8.3.4 Ocu_StopChannel
[SWS_Ocu_00058] ⌈
| 字段 | 内容 |
|---|---|
| Service name | Ocu_StopChannel |
| Syntax | void Ocu_StopChannel(Ocu_ChannelType ChannelNumber) |
| Service ID[hex] | 0x03 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant for different channel numbers |
| Parameters (in) | ChannelNumber - OCU 的数字标识符 |
| Description | 停止 OCU 通道的服务。 |
| Available via | Ocu.h |
⌋ (SRS_Ocu_00008)
[SWS_Ocu_00059] ⌈Ocu_StopChannel 函数应通过停止此通道的比较匹配已配置的动作来停止 OCU 通道。⌋ (SRS_Ocu_00008)
[SWS_Ocu_00060] ⌈Ocu_StopChannel 函数不应停止与通道关联的自由运行计数器。⌋ ()
注意: 这是因为自由运行计数器可以与多个 Ocu 通道关联。因此,停止该计数器会损害其他通道的操作。
[SWS_Ocu_00061] ⌈Ocu_StopChannel 函数应在为不同通道调用时可重入。⌋ ()
[SWS_Ocu_00062] ⌈如果成功执行函数 Ocu_StopChannel,所选通道的状态应设置为"STOPPED"。⌋ ()
[SWS_Ocu_00063] ⌈如果在处于"STOPPED"状态的通道上调用函数 Ocu_StopChannel,则函数应不执行任何操作离开(不更改通道状态),并且不应引发开发错误。⌋ ()
[SWS_Ocu_00064] ⌈如果为 OCU 驱动启用了开发错误检测:如果参数 ChannelNumber 无效,函数 Ocu_StopChannel 应引发错误 OCU_E_PARAM_INVALID_CHANNEL 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00065] ⌈如果为 OCU 驱动启用了开发错误检测:如果驱动未初始化,函数 Ocu_StopChannel 应引发错误 OCU_E_UNINIT 并返回而不执行任何操作。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_SPAL_12448)
8.3.5 Ocu_SetPinState
[SWS_Ocu_00066] ⌈
| 字段 | 内容 |
|---|---|
| Service name | Ocu_SetPinState |
| Syntax | void Ocu_SetPinState(Ocu_ChannelType ChannelNumber, Ocu_PinStateType PinState) |
| Service ID[hex] | 0x04 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant for different channel numbers |
| Parameters (in) | ChannelNumber - OCU 的数字标识符 PinState - OCU_LOW 或 OCU_HIGH |
| Description | 立即设置 OCU 通道关联引脚电平的服务。 |
| Available via | Ocu.h |
⌋ (SRS_Ocu_00011)
[SWS_Ocu_00067] ⌈Ocu_SetPinState 函数应将与通道关联的引脚设置为"PinState"指示的电平。⌋ (SRS_Ocu_00011)
[SWS_Ocu_00068] ⌈Ocu_SetPinState 函数应在为不同通道调用时可重入。⌋ ()
[SWS_Ocu_00069] ⌈Ocu_SetPinState 函数应仅在通道不处于 RUNNING 状态时使用。⌋ ()
注意: 前面的要求还意味着可以通过此 API 更改 STOPPED 通道的状态。
[SWS_Ocu_00070] ⌈Ocu_SetPinState 函数应通过配置参数 OcuSetPinStateApi {OCU_SET_PIN_STATE_API} 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171)
[SWS_Ocu_00071] ⌈如果为 OCU 驱动启用了开发错误检测:如果参数 ChannelNumber 无效,函数 Ocu_SetPinState 应引发错误 OCU_E_PARAM_INVALID_CHANNEL 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00072] ⌈如果为 OCU 驱动启用了开发错误检测:如果通道未关联引脚(未在通道配置中定义),函数 Ocu_SetPinState 应引发错误 OCU_E_PARAM_NO_PIN 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00073] ⌈如果为 OCU 驱动启用了开发错误检测:如果参数 PinState 无效,函数 Ocu_SetPinState 应引发错误 OCU_E_PARAM_INVALID_STATE 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00074] ⌈如果为 OCU 驱动启用了开发错误检测:如果驱动未初始化,函数 Ocu_SetPinState 应引发错误 OCU_E_UNINIT 并返回而不执行任何操作。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00075] ⌈如果为 OCU 驱动启用了开发错误检测:如果通道处于 RUNNING 状态,函数 Ocu_SetPinState 应引发错误 OCU_E_PARAM_INVALID_STATE 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
8.3.6 Ocu_SetPinAction
[SWS_Ocu_00076] ⌈
| 字段 | 内容 |
|---|---|
| Service name | Ocu_SetPinAction |
| Syntax | void Ocu_SetPinAction(Ocu_ChannelType ChannelNumber, Ocu_PinActionType PinAction) |
| Service ID[hex] | 0x05 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant for different channel numbers |
| Parameters (in) | ChannelNumber - OCU 的数字标识符 PinAction - OCU_SET_LOW、OCU_SET_HIGH、OCU_TOGGLE、OCU_DISABLE |
| Description | 指示驱动在比较匹配时由硬件自动执行什么操作的服务(如果支持)。 |
| Available via | Ocu.h |
⌋ (SRS_Ocu_00012)
[SWS_Ocu_00077] ⌈Ocu_SetPinAction 函数应设置在相应 OCU 通道的下一次比较匹配时由硬件自动执行的动作。⌋ (SRS_Ocu_00012)
[SWS_Ocu_00078] ⌈Ocu_SetPinAction 函数应在为不同通道调用时可重入。⌋ ()
[SWS_Ocu_00079] ⌈Ocu_SetPinAction 函数应通过配置参数 OcuSetPinActionApi {OCU_SET_PIN_ACTION_API} 进行预编译时间配置。⌋ (SRS_BSW_00171)
[SWS_Ocu_00080] ⌈如果为 OCU 驱动启用了开发错误检测:如果参数 ChannelNumber 无效,函数 Ocu_SetPinAction 应引发错误 OCU_E_PARAM_INVALID_CHANNEL 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00081] ⌈如果为 OCU 驱动启用了开发错误检测:如果通道未关联引脚,函数 Ocu_SetPinAction 应引发错误 OCU_E_PARAM_NO_PIN 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00082] ⌈如果为 OCU 驱动启用了开发错误检测:如果参数 PinAction 无效(不在类型指定的范围内),函数 Ocu_SetPinAction 应引发错误 OCU_E_PARAM_INVALID_ACTION 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00083] ⌈如果为 OCU 驱动启用了开发错误检测:如果驱动未初始化,函数 Ocu_SetPinAction 应引发错误 OCU_E_UNINIT 并返回而不执行任何操作。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00084] ⌈如果引脚与通道关联,则应在比较匹配时执行与此引脚相关的动作。⌋ ()
8.3.7 Ocu_GetCounter
[SWS_Ocu_00085] ⌈
| 字段 | 内容 |
|---|---|
| Service name | Ocu_GetCounter |
| Syntax | Ocu_ValueType Ocu_GetCounter(Ocu_ChannelType ChannelNumber) |
| Service ID[hex] | 0x06 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (in) | ChannelNumber - OCU 通道的数字标识符 |
| Return value | Ocu_ValueType - 计数器内容(以 ticks 为单位) |
| Description | 读取计数器当前值的服务。 |
| Available via | Ocu.h |
⌋ (SRS_Ocu_00009)
[SWS_Ocu_00086] ⌈Ocu_GetCounter 函数应读取并返回由 ChannelNumber 指示的通道的计数器值。⌋ (SRS_Ocu_00009)
[SWS_Ocu_00087] ⌈Ocu_GetCounter 函数应是可重入的。⌋ ()
[SWS_Ocu_00088] ⌈Ocu_GetCounter 函数应通过配置参数 OcuGetCounterApi {OCU_GET_COUNTER_API} 进行预编译时间配置。⌋ (SRS_BSW_00171)
[SWS_Ocu_00089] ⌈如果为 OCU 驱动启用了开发错误检测:如果参数 ChannelNumber 无效,函数 Ocu_GetCounter 应引发错误 OCU_E_PARAM_INVALID_CHANNEL 并返回值"0"。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00090] ⌈如果为 OCU 驱动启用了开发错误检测:如果驱动未初始化,则函数 Ocu_GetCounterValue 应引发错误 OCU_E_UNINIT 并返回值"0"。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_SPAL_12448)
8.3.8 Ocu_SetAbsoluteThreshold
[SWS_Ocu_00091] ⌈
| 字段 | 内容 |
|---|---|
| Service name | Ocu_SetAbsoluteThreshold |
| Syntax | Ocu_ReturnType Ocu_SetAbsoluteThreshold(Ocu_ChannelType ChannelNumber, Ocu_ValueType ReferenceValue, Ocu_ValueType AbsoluteValue) |
| Service ID[hex] | 0x07 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant for different channel numbers |
| Parameters (in) | ChannelNumber - OCU 通道的数字标识符 ReferenceValue - 由上层给定的值,用作确定是否在函数退出之前调用通知的基础 AbsoluteValue - 与计数器内容进行比较的值(以 ticks 为单位) |
| Return value | Ocu_ReturnType - 告知调用者由于设置新的阈值,比较匹配是否会发生(或已经发生)在当前参考间隔内 |
| Description | 使用绝对输入数据设置通道阈值的服务。 |
| Available via | Ocu.h |
⌋ (SRS_Ocu_00010)
[SWS_Ocu_00092] ⌈Ocu_SetAbsoluteThreshold 函数应将通道阈值(比较值)设置为由 AbsoluteValue 给定的值。⌋ (SRS_Ocu_00010)
[SWS_Ocu_00093] ⌈Ocu_SetAbsoluteThreshold 函数应在为不同通道调用时可重入。⌋ ()
[SWS_Ocu_00094] ⌈Ocu_SetAbsoluteThreshold 函数应通过配置参数 OcuSetAbsoluteThresholdApi {OCU_SET_ABSOLUTE_THRESHOLD_API} 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171)
[SWS_Ocu_00095] ⌈如果为 OCU 驱动启用了开发错误检测:如果驱动未初始化,函数 Ocu_SetAbsoluteThreshold 应引发错误 OCU_E_UNINIT 并返回而不执行任何操作。⌋ (SRS_BSW_00406, SRS_BSW_00386, SRS_SPAL_12448)
[SWS_Ocu_00096] ⌈如果为 OCU 驱动启用了开发错误检测:如果参数 ChannelNumber 无效,函数 Ocu_SetAbsoluteThreshold 应引发错误 OCU_E_PARAM_INVALID_CHANNEL 并返回而不执行任何操作。⌋ (SRS_BSW_00323, SRS_BSW_00386, SRS_SPAL_12448)
关于 ReferenceValue: ReferenceValue 是来自上层的信息。通过组合 ReferenceValue 和 AbsoluteValue 提供了一个间隔(定义为"参考间隔",下图中的绿色区域)以考虑计数器连续运行以及调用方更新比较阈值的请求与阈值的实际修改之间可能存在延迟的事实。
情况 1:阈值在实际比较匹配发生之前写入
Free running counter 29 30 31 32 33 34 35 36 37 38 39
…
Reference Value 30
Compare threshold 35
(Absolute value)
相等性将在写入阈值后发生。中断将被触发,通知函数应由驱动调用。
图 6:阈值在实际比较匹配发生之前写入
情况 2:阈值在实际比较匹配发生之后写入
Free running counter 29 30 31 32 33 34 35 36 37 38 39
…
Reference Value 30
35
Compare threshold
在此周期内不会发生相等性,因为所使用的计数器值已经大于阈值。
图 7:阈值在实际比较匹配发生之后写入
参考间隔定义(含计数器回绕):
… …
Free running counter 69 70 71 255 0 19 20 21 22
…
Reference Value 70
Compare threshold 20
图 8:参考间隔的定义
8.3.9 Ocu_SetRelativeThreshold
摘要说明: Ocu_SetRelativeThreshold 允许相对于当前计数器值或当前阈值值设置新阈值。
[SWS_Ocu_00103] ⌈Ocu_SetRelativeThreshold 函数应通过配置参数 OcuSetRelativeThresholdApi {OCU_SET_RELATIVE_THRESHOLD_API} 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171)
详细函数签名与需求见原文 PDF(第 41-43 页)。
8.3.10 Ocu_DisableNotification
摘要说明: Ocu_DisableNotification 禁用 OCU 通道的通知。
[SWS_Ocu_00111] ⌈Ocu_DisableNotification 函数应通过配置参数 OcuNotificationSupported {OCU_NOTIFICATION_SUPPORTED} 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171)
8.3.11 Ocu_EnableNotification
摘要说明: Ocu_EnableNotification 启用 OCU 通道的通知。
[SWS_Ocu_00118] ⌈Ocu_EnableNotification 函数应通过配置参数 OcuNotificationSupported {OCU_NOTIFICATION_SUPPORTED} 进行预编译时间 On/Off 配置。⌋ (SRS_BSW_00171)
8.3.12 Ocu_GetVersionInfo
摘要说明: Ocu_GetVersionInfo 返回此驱动版本的详细信息(vendor ID、module ID、vendor specific version numbers)。通过 Std_VersionInfoType 指针返回。
8.4 回调通知(Callback notifications)
无。
8.5 计划函数(Scheduled functions)
无。
8.6 预期接口(Expected Interfaces)
8.6.1 强制接口(Mandatory Interfaces)
Det_ReportError(来自 Det)
8.6.2 可选接口(Optional Interfaces)
无。
8.6.3 可配置接口(Configurable interfaces)
Ocu_DeInitOcu_StartChannelOcu_StopChannelOcu_SetPinStateOcu_SetPinActionOcu_GetCounterOcu_SetAbsoluteThresholdOcu_SetRelativeThresholdOcu_DisableNotificationOcu_EnableNotificationOcu_GetVersionInfo
9 序列图与时序图(Sequence and Timing diagrams)
摘要说明: 本节包含以下序列图:
- 初始化(Ocu_Init 调用流程)
- 反初始化(Ocu_DeInit 调用流程)
- 使用 OCU 通知(启用/禁用通知流程)
- Ocu_SetPinState(设置引脚状态流程)
- Ocu_SetPinAction(设置引脚动作流程)
- 设置新的比较阈值(SetAbsoluteThreshold/SetRelativeThreshold 流程)
完整序列图见原文 PDF(第 48-52 页)。
10 配置规范(Configuration specification)
10.1 如何阅读本章(How to read this chapter)
10.1.1 配置和配置参数(Configuration and configuration parameters)
容器和参数定义遵循 AUTOSAR 配置规范。
10.1.2 容器(Containers)
10.1.3 配置参数的规范模板(Specification template for configuration parameters)
10.2 容器和配置参数(Containers and configuration parameters)
10.2.1 Ocu
Ocu 是顶层容器,包含所有 OCU 驱动配置。
10.2.2 OcuGeneral
摘要: OcuGeneral 包含全局 OCU 配置:
OcuConfigSetPointer- 配置集指针OcuDevErrorDetectApi- 启用/禁用开发错误检测OcuDeInitApi- 启用/禁用 DeInit APIOcuSetPinStateApi- 启用/禁用 SetPinState APIOcuSetPinActionApi- 启用/禁用 SetPinAction APIOcuGetCounterApi- 启用/禁用 GetCounter APIOcuSetAbsoluteThresholdApi- 启用/禁用 SetAbsoluteThreshold APIOcuSetRelativeThresholdApi- 启用/禁用 SetRelativeThreshold APIOcuNotificationSupported- 启用/禁用通知OcuGetVersionInfoApi- 启用/禁用版本信息 APIOcuIndex- OCU 驱动实例索引完整参数定义见原文 PDF(第 56-58 页)。
10.2.3 OcuConfigurationOfOptionalApis
摘要: 包含每个可选 API 的配置:
OcuSetPinStateApiOcuSetPinActionApiOcuGetCounterApiOcuSetAbsoluteThresholdApiOcuSetRelativeThresholdApiOcuNotificationSupportedOcuGetVersionInfoApiOcuDeInitApi完整参数定义见原文 PDF(第 58-61 页)。
10.2.4 OcuConfigSet
OcuConfigSet 容器包含一组 OcuChannel 配置。
10.2.5 OcuChannel
摘要: OcuChannel 包含每个 OCU 通道的配置:
OcuChannelId- 通道 IDOcuCounterMaxValue- 计数器最大值OcuCounterMinValue- 计数器最小值OcuDefaultThreshold- 默认阈值OcuChannelNotification- 通道通知OcuHardwareChannel- 已分配的硬件通道OcuHwUsed- 是否使用硬件OcuPinAction- 引脚动作OcuPinState- 引脚状态OcuOutputPinUsed- 是否使用输出引脚OcuHardwareTriggered- 是否硬件触发(ADC/DMA)OcuHwResourceId- 硬件资源 IDOcuHwResource- 硬件资源数量OcuExpectedHardwareTrigger- 预期的硬件触发OcuCountDirection- 计数方向OcuMcuClockReferencePoint- MCU 时钟参考点OcuPrescaler- 预分频器完整参数定义见原文 PDF(第 63-69 页)。
10.2.6 OcuHWSpecificSettings
摘要: 包含每个 OCU 通道的硬件特定设置。
10.3 发布信息(Published Information)
摘要说明: 发布信息参数定义了由 OCU 驱动模块发布给其他模块的信息,例如版本号、供应商 ID 等。
11 不适用需求(Not applicable requirements)
摘要说明: 本节列出了不适用于 OCU 驱动的需求,包括:
- 与特定 BSW 通用规范条目相关的限制
- 多核分发相关需求的适用性说明
翻译说明
本文档为 AUTOSAR 4.4.0 版本 OCU 驱动软件规范的中文翻译。保留了所有需求 ID(SWS_Ocu_xxxxx)、参考标识符及模块缩写。原始文档共 72 页,本翻译涵盖了全部主要章节,并对大型可追溯性表和详细配置参数表采用了"重点翻译+摘要"策略,标注"完整表见原文 PDF"的位置以便用户查阅原文。OCU(输出比较单元)驱动提供计数器与阈值比较、自动引脚动作、通知和硬件触发等关键功能。