# ICU 驱动规范(Specification of ICU Driver)
| 字段 | 内容 |
|---|---|
| **文档标题** | ICU 驱动规范(Specification of ICU Driver) |
| **文档所有者** | AUTOSAR |
| **文档责任方** | AUTOSAR |
| **文档标识号** | 023 |
| **文档状态** | Final(正式发布) |
| **所属 AUTOSAR 标准** | Classic Platform(经典平台) |
| **所属标准版本** | 4.4.0 |
---
## 文档变更历史(Document Change History)
| 日期 | 版本 | 变更人 | 变更描述 |
|---|---|---|---|
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | MCAL 多核分布(草案);头文件清理 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 移除 `SWS_Icu_00116` 和 `SWS_Icu_00190`;将 `SRS_BSW_00450` 添加到不适用的需求列表;将"default error"重命名为"development error";`SWS_Icu_00201`:`Icu_StartTimestamp` 的参数 `(IN): Icu_ValueType* BufferPtr` 更改为 `(out)` 类型;将 `ICU_E_NOT_STARTED` 从开发错误变更为运行时错误;编辑性变更 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 移除第 10.2.1 章"Variants";将 ICU_EcuModuleDef 的上多重性更改为 1;移除配置参数 `IcuIndex`(`ECUC_Icu_00221`);为附加测试 "EcuM_WakeupSourceType shall be imported from EcuM_Types.h" 提供需求 ID `SWS_Icu_00383`;移除需求 `SWS_Icu_00346`;编辑性变更 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 编辑性变更;DET 从"Development Error Tracer"重命名为"Default Error Tracer";从文档中移除对过时的 `SWS_Icu_00048` 的所有引用 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | `IcuChannelId`:`postBuildVariantValue` 设置为 false;移除关于 `Icu_Init()` 的 NULL_PTR 检查的 SWS ID;将 `ICU_E_PARAM_POINTER` 和 `ICU_E_INIT_FAILED` 添加到错误分类;移除 `ICU_E_PARAM_CONFIG` 和 `ICU_E_PARAM_BUFFER_PTR` |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | ICU00354 - 检查有效通知间隔的重新表述;ICU078 - 从注意事项中删除句子"This is done by the hardware.";ICU295 - 从枚举 `Icu_SignalMeasurementPropertyType` 的范围中移除 `ICU_ACTIVE_TIME`;编辑性变更;删除变更文档章节 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 将参数范围从 ECU/Module 修改为 local;根据新的 SWS_BSWGeneral 重新修订;将 `MemMap.h` 更改为 `Icu_MemMap.h` |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 修正类型错误;更新 `Icu_IndexType` 的描述 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | 新增服务 `Icu_DisableEdgeDetection` 和 `Icu_EnableEdgeDetection`;新增配置参数 `IcuEdgeDetectApi` 和 `IcuWakeupFunctionalityApi`;修正'duty cycle'的定义;修正参数 `Icu_SignalMeasurementPropertyType` 的值 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律声明修订 |
| 2008-02-01 | 3.0.2 | AUTOSAR Administration | 重新处理模块的代码文件结构;新增需求 `SWS_Icu_00088`、`SWS_Icu_00220`、`SWS_Icu_00221`、`SWS_Icu_00228` 和 `SWS_Icu_00229`;与 ECU 唤醒相关的流程图移至 ECU 状态管理器的 SWS 文档;扩展文档元信息;小幅布局调整 |
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | 默认启动边现在用于边沿配置;启用和禁用通知现在可用于时间戳功能;边沿检测功能现在在预编译时可配置 On/Off;法律声明修订;新增发布说明;"Advice for users"修订;"Revision Information"新增 |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 新增服务:`Icu_SetActivationCondition`、`Icu_StartTimeStamp`、`Icu_StopTimeStamp`、`Icu_GetTimestampIndex`、`Icu_ResetEdgeCount`、`Icu_EnableEdgeCount`、`Icu_DisableEdgeCount`、`Icu_GetEdgeNumbers`、`Icu_GetTimeElapsed`、`Icu_GetDutyCycleValues`、`Icu_GetVersionInfo` |
| 2005-05-31 | 1.0 | AUTOSAR Administration | 初始发布 |
---
## 目录(Table of Contents)
1. [引言与功能概述](#1-引言与功能概述)
2. [缩略语与缩写](#2-缩略语与缩写)
3. [相关文档](#3-相关文档)
4. [约束与假设](#4-约束与假设)
5. [与其他模块的依赖关系](#5-与其他模块的依赖关系)
6. [需求可追溯性](#6-需求可追溯性)
7. [功能规范](#7-功能规范)
8. [API 规范](#8-api-规范)
9. [序列图](#9-序列图)
10. [配置规范](#10-配置规范)
11. [不适用的需求](#11-不适用的需求)
---
## 1 引言与功能概述
本规范规定了 AUTOSAR 基础软件模块 **ICU 驱动** 的功能、API 和配置。
ICU 驱动是使用**输入捕获单元(ICU)** 进行 PWM 信号解调、脉冲计数、频率和占空比测量、生成简单中断以及唤醒中断的模块。
**ICU 驱动提供的服务**:
- **信号边沿通知(Signal edge notification)**
- **控制唤醒中断(Controlling wakeup interrupts)**
- **周期性信号时间测量(Periodic signal time measurement)**
- **边沿时间戳(Edge time stamping)**,可用于获取非周期性信号
- **边沿计数(Edge counting)**
---
## 2 缩略语与缩写
**缩写 / 首字母缩略词**
| 缩写 | 描述 |
|---|---|
| DEM | Diagnostic Event Manager(诊断事件管理器) |
| DET | Default Error Tracer(默认错误跟踪器) |
| EcuM | ECU State Manager(ECU 状态管理器) |
| ICU | Input Capture Unit(**输入捕获单元**,非重症监护病房) |
| PWM | Pulse Width Modulation(脉宽调制) |
| ISR | Interrupt Service Routine(中断服务例程) |
| API | Application Programming Interface(应用程序接口) |
| BSW | Basic Software(基础软件) |
| ECU | Electronic Control Unit(电子控制单元) |
| MCU | Microcontroller Unit(微控制器单元) |
| OS | Operating System(操作系统) |
**关键术语**
| 术语 | 描述 |
|---|---|
| **Active Time** | 这取决于要捕获的信号的起始边:
- 起始边 = 下降沿 => Active Time = Low Time
- 起始边 = 上升沿 => Active Time = High Time
- 起始边 = 双边沿 => Active Time = High Time(如果上升沿最初出现)
- 起始边 = 双边沿 => Active Time = Low Time(如果下降沿最初出现) |
| **ICU Channel** | 表示绑定到一个输入信号和用于配置的测量模式的硬件资源的逻辑 ICU 实体 |
| **ICU State** | ICU 通道的逻辑输入状态。可以是 `ICU_ACTIVE` 或 `ICU_IDLE` |
| **ICU_ACTIVE** | ICU 通道的输入状态,已检测到激活边 |
| **ICU_IDLE** | ICU 通道的输入状态,自上次调用 `Icu_GetInputState()` 或 `Icu_Init()` 以来未检测到激活边 |
| **Symbolic name for a channel** | 用名称替换句柄的符号名称。使用此句柄,每个通道及其相关属性都可以在配置结构中找到 |
| **Wakeup event** | 唤醒事件被理解为边沿模式,将导致此驱动器的唤醒。但是,该模式是否有效的决定不是由该驱动执行的。这应由上层执行 |
---
## 3 相关文档
### 3.1 输入文档
- **[1]** General Requirements on Basic Software Modules — `AUTOSAR_SRS_BSWGeneral.pdf`
- **[2]** General Requirements on SPAL — `AUTOSAR_SRS_SPALGeneral.pdf`
- **[3]** Specification of Standard Types — `AUTOSAR_SWS_StandardTypes.pdf`
- **[4]** List of Basic Software Modules — `AUTOSAR_TR_BSWModuleList.pdf`
- **[5]** Specification of Diagnostics Event Manager (DEM) — `AUTOSAR_SWS_DiagnosticEventManager.pdf`
- **[6]** Specification of Default Error Tracer — `AUTOSAR_SWS_DefaultErrorTracer.pdf`
- **[7]** Requirements on ICU Driver — `AUTOSAR_SRS_ICUDriver.pdf`
- **[8]** Specification of ECU Configuration — `AUTOSAR_TPS_ECUConfiguration.pdf`
- **[9]** Layered Software Architecture — `AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf`
- **[10]** Specification of ECU State Manager — `AUTOSAR_SWS_ECUStateManager.pdf`
- **[11]** Basic Software Module Description Template — `AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf`
- **[12]** General Specification of Basic Software Modules — `AUTOSAR_SWS_BSWGeneral.pdf`
### 3.2 相关标准与规范
- **[13]** IEC 7498-1 The Basic Model, IEC Norm, 1994
### 3.3 相关规范
AUTOSAR 提供了关于基础软件模块的通用规范 [12](SWS BSW General),该规范对 ICU 驱动同样有效。因此,SWS BSW General 应被视为 ICU 驱动的附加且必需的规范。
---
## 4 约束与假设
### 4.1 限制
**无限制。**
### 4.2 对汽车领域的适用性
**无限制。**
---
## 5 与其他模块的依赖关系
### 5.1 模块 DET(默认错误跟踪器)
检测到的错误的详细描述可在第 7.2 章和第 8 章中找到。
### 5.2 模块 MCU
ICU 驱动**依赖于系统时钟、预分频器和 PLL**。因此,ICU 计时器滴答的长度取决于 MCU 模块中所做的时钟设置。
ICU 驱动**不会负责在其 Init 函数中配置全局时钟、全局预分频器和 PLL 的寄存器**。这必须由 MCU 模块完成。ICU 驱动仅配置本地(ICU 外设特定)时钟、预分频器等。
### 5.3 OS(操作系统)
ICU 驱动使用中断,因此**依赖于配置中断源的 OS**。它仅提供回调函数。
ICU 驱动**不会负责在其 Init 函数中设置中断关联的寄存器**。中断系统的总体分配和激活由操作系统完成。
### 5.4 模块 PORT
用于 ICU 作为输入的端口引脚的配置由 PORT 驱动完成。因此,**PORT 驱动必须在使用 ICU 函数之前初始化**。否则 ICU 函数将表现出未定义行为。
### 5.5 模块 EcuM
> **[SWS_Icu_00244]** ⌈ICU 驱动将向 EcuM 报告唤醒中断。⌋
---
## 6 需求可追溯性
> **翻译说明**:本节包含一个大型参考表,将 SRS 需求映射到 SWS 需求(涉及 `SRS_Icu_xxxxx`、`SRS_BSW_xxxxx` 和 `SRS_SPAL_xxxxx`)。下表列出前 10 行代表性映射;完整表(包含约 130+ 项映射)请参见原文 PDF 第 16-25 页。
| 需求 | 描述 | 由以下需求满足 |
|---|---|---|
| `SRS_BSW_00005` | MCAL 模块不得有硬编码的水平接口 | `SWS_Icu_00380` |
| `SRS_BSW_00006` | MCAL 之上的软件模块的源代码不应依赖于处理器和编译器 | `SWS_Icu_00380` |
| `SRS_BSW_00007` | C 语言编写的所有基础软件模块应符合 MISRA C 2012 标准 | `SWS_Icu_00380` |
| `SRS_BSW_00101` | 基础软件模块应能在单独的初始化函数中初始化 | `SWS_Icu_00006` |
| `SRS_BSW_00161` | AUTOSAR 基础软件应提供微控制器抽象层 | `SWS_Icu_00380` |
| `SRS_BSW_00167` | 所有 AUTOSAR 基础软件模块应提供配置规则和约束 | `SWS_Icu_00380` |
| `SRS_BSW_00300` | 所有 AUTOSAR 基础软件模块应由明确的名称标识 | `SWS_Icu_00380` |
| `SRS_BSW_00306` | AUTOSAR 基础软件模块应独立于编译器和平台 | `SWS_Icu_00380` |
| `SRS_BSW_00312` | 共享代码应是可重入的 | `SWS_Icu_00380` |
| `SRS_BSW_00323` | 所有 AUTOSAR 基础软件模块应检查传入 API 参数的有效性 | `SWS_Icu_00022`, `SWS_Icu_00024`, `SWS_Icu_00043`, `SWS_Icu_00125` |
> **摘要标记**:本表共约 130+ 行;上表列出前 10 行代表性映射。完整表涵盖 `SRS_Icu_12305` 至 `SRS_Icu_13100`、`SRS_BSW_00005` 至 `SRS_BSW_00450`、`SRS_SPAL_00157` 至 `SRS_SPAL_12463`,详情见原文 PDF。
---
## 7 功能规范
### 7.1 通用行为
#### 7.1.1 背景与基本原理
为了确保数据一致性,**应提供可重入的代码**。
#### 7.1.2 需求
> **[SWS_Icu_00050]** ⌈Icu 模块对不同通道号的函数应是可重入的,**除了**:
> - `Icu_Init()`
> - `Icu_DeInit()`
> - `Icu_SetMode()`
> - `Icu_GetVersionInfo()`
> ⌋
> **[SWS_Icu_00149]** ⌈如果在运行时在不同任务或 ISR 中对同一 ICU 通道使用多个调用,Icu 模块的环境应检查完整性。⌋
> **[SWS_Icu_00150]** ⌈如果在运行时在不同任务或 ISR 中对同一 ICU 通道使用多个调用,Icu 模块不应检查完整性。⌋
> **[SWS_Icu_00258]** ⌈Icu 模块具有 2 种模式:
> - `ICU_MODE_NORMAL`(正常模式)
> - `ICU_MODE_SLEEP`(睡眠模式)
> ⌋
**在 `ICU_MODE_NORMAL` 模式下,所有通知都可用**:
- **[SWS_Icu_00011]** ⌈由服务 `Icu_SetActivationCondition()` 或 `IcuDefaultStartEdge` 配置。⌋(`SRS_SPAL_12067`)
- **[SWS_Icu_00259]** ⌈由 `Icu_DisableNotification()` 和 `Icu_EnableNotification()` 服务在调用 `Icu_SetMode()` 之前或之后选择。⌋
**在 `ICU_MODE_SLEEP` 模式下**:
- **[SWS_Icu_00012]** ⌈只有那些被配置为可唤醒的、在 `Icu_Init()` 后通过 `Icu_EnableWakeup()` 启用的、未通过 `Icu_DisableWakeup()` 禁用的唤醒事件可用。⌋(`SRS_SPAL_12067`)
- **[SWS_Icu_00260]** ⌈此模块处理的所有其他中断应被禁用,并且如果事件发生,不应导致 MCU 退出降低功率模式状态(例如 idle、halt)。⌋
- **[SWS_Icu_00261]** ⌈所有通道已停止,除了:
- 被配置为可唤醒的通道,并且
- 通过调用 `Icu_EnableWakeup` 显式启用的通道
> ⌋
> **[SWS_Icu_00088]** ⌈Icu 模块应允许在每个通道上配置周期开始边的定义。⌋(`SRS_Icu_12425`)
#### 7.1.3 时间单位 Ticks
##### 7.1.3.1 背景与基本原理
要从寄存器值中获取时间,必须知道振荡器频率、预分频器等。由于这些设置是在 MCU 模块和/或其他模块中进行的,因此**不可能计算此类时间**。
因此,**时间和 ticks 之间的转换应是上层的一部分**。
##### 7.1.3.2 需求
ICU 驱动 API 服务中使用的所有时间单位都是**单位 ticks**。
### 7.2 错误分类
#### 7.2.1 开发错误
> **[SWS_Icu_00382]** ⌈开发错误类型
| 类型或错误 | 相关性 | 相关错误代码 | 值 [十六进制] |
|---|---|---|---|
| 使用无效指针调用 API | Development | `ICU_E_PARAM_POINTER` | `0x0A` |
| 使用无效的通道标识符或通道未配置为调用 API 的功能 | Development | `ICU_E_PARAM_CHANNEL` | `0x0B` |
| 使用无效或不可行的激活调用 API | Development | `ICU_E_PARAM_ACTIVATION` | `0x0C` |
| Init 函数失败 | Development | `ICU_E_INIT_FAILED` | `0x0D` |
| 使用无效缓冲区大小调用 API | Development | `ICU_E_PARAM_BUFFER_SIZE` | `0x0E` |
| API 服务 `Icu_SetMode` 使用无效模式 | Development | `ICU_E_PARAM_MODE` | `0x0F` |
| 在模块初始化之前使用 API 服务 | Development | `ICU_E_UNINIT` | `0x14` |
| 在运行操作时调用 `Icu_SetMode` | Development | `ICU_E_BUSY_OPERATION` | `0x16` |
| 当 ICU 驱动和硬件已初始化时调用 `Icu_Init` | Development | `ICU_E_ALREADY_INITIALIZED` | `0x17` |
| `Icu_StartTimeStamp` 的参数 `NotifyInterval` 无效 | Development | `ICU_E_PARAM_NOTIFY_INTERVAL` | `0x18` |
| `Icu_GetVersionInfo` 的参数 `versioninfo` 无效 | Development | `ICU_E_PARAM_VINFO` | `0x19` |
#### 7.2.2 运行时错误
| 类型或错误 | 相关性 | 相关错误代码 | 值 [十六进制] |
|---|---|---|---|
| API 服务 `Icu_StopTimestamp` 在未启动或已停止的通道上调用 | Runtime | `ICU_E_NOT_STARTED` | `0x15` |
#### 7.2.3 瞬态故障
无瞬态故障。
#### 7.2.4 生产错误
无生产错误。
#### 7.2.5 扩展生产错误
无扩展生产错误。
### 7.3 错误检测
> **[SWS_Icu_00022]** ⌈如果 Icu 模块的开发错误检测已启用:所有 Icu 模块函数(除了 `Icu_Init` 和 `Icu_GetVersionInfo`)在未调用 `Icu_Init` 函数时应引发开发错误 `ICU_E_UNINIT`。⌋(`SRS_BSW_00323`、`SRS_BSW_00406`)
---
## 8 API 规范
### 8.1 导入类型
> **[SWS_Icu_00276]** ⌈
> | 模块 | 头文件 | 导入类型 |
> |---|---|---|
> | EcuM | `EcuM.h` | `EcuM_WakeupSourceType` |
> | Std_Types | `StandardTypes.h` | `Std_ReturnType` |
> | | `StandardTypes.h` | `Std_VersionInfoType` |
> ⌋
### 8.2 类型定义
#### 8.2.1 Icu_ModeType
> **[SWS_Icu_00277]** ⌈
> - **名称**:`Icu_ModeType`
> - **类型**:Enumeration
> - **范围**:
> - `ICU_MODE_NORMAL` — 正常运行,根据通知请求启用所有使用的中断
> - `ICU_MODE_SLEEP` — 降低功率操作。在睡眠模式下,只有那些被配置为可唤醒的通知可用
> - **描述**:允许启用/禁用 ECU 唤醒不需要的所有中断
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.2 Icu_ChannelType
> **[SWS_Icu_00278]** ⌈
> - **名称**:`Icu_ChannelType`
> - **类型**:uint
> - **范围**:实现特定,但类型内并非所有值都有效
> - **描述**:ICU 通道的数字标识符
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.3 Icu_InputStateType
> **[SWS_Icu_00279]** ⌈
> - **名称**:`Icu_InputStateType`
> - **类型**:Enumeration
> - **范围**:
> - `ICU_ACTIVE` — 已检测到激活边
> - `ICU_IDLE` — 自上次调用 `Icu_GetInputState()` 或 `Icu_Init()` 以来未检测到激活边
> - **描述**:ICU 通道的输入状态
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.4 Icu_ConfigType
> **[SWS_Icu_00280]** ⌈
> - **名称**:`Icu_ConfigType`
> - **类型**:Structure
> - **描述**:此类型包含初始化数据
> - **可用通过**:`Icu.h`
> ⌋
> **[SWS_Icu_00281]** ⌈`Icu_ConfigType` 应包含:
> **可选参数**:
> - 所用 HW 单元的 MCU 相关属性
> - 带可选预分频器的时钟源(如果由 HW 提供)
> ⌋
> **[SWS_Icu_00039]** ⌈`Icu_ConfigType` 中每个通道的定义应包含:
> **公共参数**:
> - 默认启动边
> - 每个通道的硬件特定设置
> - 测量模式:
> - 信号边沿检测/通知
> - 信号测量
> - 时间戳
> - 边沿计数器
> **特定参数**
> ⌋(`SRS_Icu_12368`、`SRS_Icu_12425`、`SRS_Icu_12455`、`SRS_Icu_12456`)
> **[SWS_Icu_00283]** ⌈如果 `Icu_ConfigType` 中每个通道的测量模式配置为"信号边沿检测",则应可配置信号通知的通知函数。⌋
> **[SWS_Icu_00284]** ⌈如果 `Icu_ConfigType` 中每个通道的测量模式配置为"信号测量",则应可配置可以测量的属性。值应如 `SWS_Icu_00295` 中规定。⌋
> **[SWS_Icu_00285]** ⌈如果 `Icu_ConfigType` 中每个通道的测量模式配置为"时间戳测量",则应可配置缓冲区处理。值应如 `SWS_Icu_00296` 中规定。⌋
> **[SWS_Icu_00378]** ⌈如果 `Icu_ConfigType` 中每个通道的测量模式配置为"时间戳测量",则应可配置用于通知所请求时间戳数量的通知函数。⌋
> **[SWS_Icu_00286]** ⌈如果 `Icu_ConfigType` 中每个通道的测量模式配置为"边沿计数器",则应可配置计数模式(激活边)。值应如 `SWS_Icu_00289` 中规定。⌋
> **[SWS_Icu_00287]** ⌈如果在 `Icu_ConfigType` 中每个通道的定义中将通道配置为可唤醒,则唤醒原因验证的调用函数应为 `EcuM_CheckWakeup`。⌋
> **[SWS_Icu_00288]** ⌈如果在 `Icu_ConfigType` 中每个通道的定义中将通道配置为可唤醒,则应可配置传输到 EcuM 的值。⌋
#### 8.2.5 Icu_ActivationType
> **[SWS_Icu_00289]** ⌈
> - **名称**:`Icu_ActivationType`
> - **类型**:Enumeration
> - **范围**:
> - `ICU_RISING_EDGE` — 当 ICU 输入信号上发生上升沿时执行适当的操作
> - `ICU_FALLING_EDGE` — 当 ICU 输入信号上发生下降沿时执行适当的操作
> - `ICU_BOTH_EDGES` — 当 ICU 输入信号上发生上升沿或下降沿时执行适当的操作
> - **描述**:ICU 通道激活类型的定义
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.6 Icu_ValueType
> **[SWS_Icu_00290]** ⌈
> - **名称**:`Icu_ValueType`
> - **类型**:uint
> - **范围**:0 ... <定时器寄存器的宽度>
> - **描述**:时间戳 ticks 和测量的经过时间 ticks 的缓冲区宽度
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.7 Icu_DutyCycleType
> **[SWS_Icu_00291]** ⌈
> - **名称**:`Icu_DutyCycleType`
> - **类型**:Structure
> - **元素**:
> - `Icu_ValueType ActiveTime` — 通道上测量的相干活动时间
> - `Icu_ValueType PeriodTime` — 通道上测量的相干周期时间
> - **描述**:应包含计算占空比所需值的类型
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.8 Icu_IndexType
> **[SWS_Icu_00292]** ⌈
> - **名称**:`Icu_IndexType`
> - **类型**:uint
> - **描述**:抽象服务 `Icu_GetTimestampIndex()` 的返回值的类型。由于支持循环缓冲区处理且 `Icu_GetTimestampIndex` 可以返回 '0' 作为合法真值(不是根据 ICU107 和 ICU135 的错误),`Icu_IndexType` 可以实现为具有值 1..xyz
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.9 Icu_EdgeNumberType
> **[SWS_Icu_00293]** ⌈
> - **名称**:`Icu_EdgeNumberType`
> - **类型**:uint
> - **描述**:抽象服务 `Icu_GetEdgeNumbers()` 的返回值的类型
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.10 Icu_MeasurementModeType
> **[SWS_Icu_00294]** ⌈
> - **名称**:`Icu_MeasurementModeType`
> - **类型**:Enumeration
> - **范围**:
> - `ICU_MODE_SIGNAL_EDGE_DETECT` — 检测边的模式
> - `ICU_MODE_SIGNAL_MEASUREMENT` — 测量各种可配置边之间不同时间的模式
> - `ICU_MODE_TIMESTAMP` — 测量各种可配置边之间不同时间的模式,独立于 MCU 模式
> - `ICU_MODE_EDGE_COUNTER` — 在可配置激活边上对输入信号进行计数的模式
> - **描述**:通道的测量模式
> - **可用通过**:`Icu.h`
> ⌋
#### 8.2.11-8.2.12 其他类型
> **摘要标记**:8.2.11 `Icu_SignalMeasurementPropertyType` 和 8.2.12 `Icu_TimestampBufferType` 见原文 PDF 第 34 页。
### 8.3 函数定义
#### 8.3.1 Icu_Init
```c
/**
* 初始化 ICU 驱动
* @param ConfigPtr 指向配置的指针
*/
void Icu_Init(const Icu_ConfigType* ConfigPtr);
```
> **[SWS_Icu_00006]** ⌈`Icu_Init()` 应根据配置初始化所有 ICU 通道。⌋
#### 8.3.2 Icu_DeInit
```c
/**
* 反初始化 ICU 驱动
*/
void Icu_DeInit(void);
```
> **[SWS_Icu_00036]** ⌈`Icu_DeInit()` 应将所有 ICU 通道反初始化到其上电复位状态。⌋
#### 8.3.3 Icu_SetMode
```c
/**
* 设置 ICU 驱动模式
* @param Mode ICU_MODE_NORMAL 或 ICU_MODE_SLEEP
*/
void Icu_SetMode(Icu_ModeType Mode);
```
> **[SWS_Icu_00008]** ⌈`Icu_SetMode()` 应将 ICU 驱动切换到指定模式。⌋(`SRS_SPAL_12067`、`SRS_SPAL_12069`)
#### 8.3.4 Icu_DisableWakeup
```c
/**
* 禁用 ICU 通道的唤醒功能
* @param Channel 通道 ID
*/
void Icu_DisableWakeup(Icu_ChannelType Channel);
```
#### 8.3.5 Icu_EnableWakeup
```c
/**
* 启用 ICU 通道的唤醒功能
* @param Channel 通道 ID
*/
void Icu_EnableWakeup(Icu_ChannelType Channel);
```
#### 8.3.6 Icu_CheckWakeup
```c
/**
* 检查唤醒事件
* @param WakeupSource 唤醒源
*/
void Icu_CheckWakeup(EcuM_WakeupSourceType WakeupSource);
```
#### 8.3.7 Icu_SetActivationCondition
```c
/**
* 设置 ICU 通道的激活条件
* @param Channel 通道 ID
* @param Activation 激活条件
*/
void Icu_SetActivationCondition(Icu_ChannelType Channel, Icu_ActivationType Activation);
```
#### 8.3.8 Icu_DisableNotification
```c
/**
* 禁用 ICU 通道的通知
* @param Channel 通道 ID
*/
void Icu_DisableNotification(Icu_ChannelType Channel);
```
#### 8.3.9 Icu_EnableNotification
```c
/**
* 启用 ICU 通道的通知
* @param Channel 通道 ID
*/
void Icu_EnableNotification(Icu_ChannelType Channel);
```
#### 8.3.10 Icu_GetInputState
```c
/**
* 获取 ICU 通道的输入状态
* @param Channel 通道 ID
* @return ICU_ACTIVE 或 ICU_IDLE
*/
Icu_InputStateType Icu_GetInputState(Icu_ChannelType Channel);
```
> **[SWS_Icu_00030]** ⌈`Icu_GetInputState()` 应返回指定通道的输入状态。⌋(`SRS_Icu_12371`)
#### 8.3.11 Icu_StartTimestamp
```c
/**
* 启动 ICU 通道的时间戳测量(异步)
* @param Channel 通道 ID
* @param BufferPtr 结果缓冲区
* @param BufferSize 缓冲区大小
* @param NotifyInterval 通知间隔
*/
void Icu_StartTimestamp(Icu_ChannelType Channel, Icu_ValueType* BufferPtr, uint16 BufferSize, uint16 NotifyInterval);
```
> **[SWS_Icu_00063]** ⌈`Icu_StartTimestamp()` 应异步启动指定通道的时间戳测量。⌋
#### 8.3.12 Icu_StopTimestamp
```c
/**
* 停止 ICU 通道的时间戳测量
* @param Channel 通道 ID
*/
void Icu_StopTimestamp(Icu_ChannelType Channel);
```
#### 8.3.13 Icu_GetTimestampIndex
```c
/**
* 获取时间戳索引
* @param Channel 通道 ID
* @return 时间戳索引
*/
Icu_IndexType Icu_GetTimestampIndex(Icu_ChannelType Channel);
```
#### 8.3.14 Icu_ResetEdgeCount
```c
/**
* 重置 ICU 通道的边沿计数
* @param Channel 通道 ID
*/
void Icu_ResetEdgeCount(Icu_ChannelType Channel);
```
#### 8.3.15 Icu_EnableEdgeCount
```c
/**
* 启用 ICU 通道的边沿计数
* @param Channel 通道 ID
*/
void Icu_EnableEdgeCount(Icu_ChannelType Channel);
```
#### 8.3.16 Icu_EnableEdgeDetection
```c
/**
* 启用 ICU 通道的边沿检测
* @param Channel 通道 ID
*/
void Icu_EnableEdgeDetection(Icu_ChannelType Channel);
```
#### 8.3.17 Icu_DisableEdgeDetection
```c
/**
* 禁用 ICU 通道的边沿检测
* @param Channel 通道 ID
*/
void Icu_DisableEdgeDetection(Icu_ChannelType Channel);
```
#### 8.3.18 Icu_DisableEdgeCount
```c
/**
* 禁用 ICU 通道的边沿计数
* @param Channel 通道 ID
*/
void Icu_DisableEdgeCount(Icu_ChannelType Channel);
```
#### 8.3.19 Icu_GetEdgeNumbers
```c
/**
* 获取 ICU 通道的边沿数量
* @param Channel 通道 ID
* @return 边沿数量
*/
Icu_EdgeNumberType Icu_GetEdgeNumbers(Icu_ChannelType Channel);
```
#### 8.3.20 Icu_StartSignalMeasurement
```c
/**
* 启动信号测量
* @param Channel 通道 ID
*/
void Icu_StartSignalMeasurement(Icu_ChannelType Channel);
```
#### 8.3.21 Icu_StopSignalMeasurement
```c
/**
* 停止信号测量
* @param Channel 通道 ID
*/
void Icu_StopSignalMeasurement(Icu_ChannelType Channel);
```
#### 8.3.22 Icu_GetTimeElapsed
```c
/**
* 获取经过的时间
* @param Channel 通道 ID
* @return 经过的时间值
*/
Icu_ValueType Icu_GetTimeElapsed(Icu_ChannelType Channel);
```
> **摘要标记**:本函数根据配置的测量属性(High Time、Low Time、Period Time 等)返回相应的时间值。详细描述见原文 PDF 第 58 页。
#### 8.3.23 Icu_GetDutyCycleValues
```c
/**
* 获取占空比值
* @param Channel 通道 ID
* @param DutyCycle 指向 Icu_DutyCycleType 的指针
* @return E_OK 成功,E_NOT_OK 失败
*/
Std_ReturnType Icu_GetDutyCycleValues(Icu_ChannelType Channel, Icu_DutyCycleType* DutyCycle);
```
> **摘要标记**:本函数返回 ActiveTime 和 PeriodTime 用于计算占空比。详细描述见原文 PDF 第 62 页。
#### 8.3.24 Icu_GetVersionInfo
```c
/**
* 获取 ICU 驱动的版本信息
* @param versioninfo 指向版本信息结构体的指针
*/
void Icu_GetVersionInfo(Std_VersionInfoType* versioninfo);
```
#### 8.3.25 Icu_DisableNotificationAsync
```c
/**
* 异步禁用 ICU 通道的通知
* @param Channel 通道 ID
*/
void Icu_DisableNotificationAsync(Icu_ChannelType Channel);
```
> **摘要标记**:8.3.26 `Icu_EnableNotificationAsync` 是其对应的异步启用版本。详细描述见原文 PDF 第 66-67 页。
### 8.4 回调通知
ICU 驱动使用以下回调通知:
```c
/* 信号边沿通知 */
typedef void (*Icu_NotificationCallbackType)(void);
/* 时间戳通知 */
typedef void (*Icu_TimestampNotifyType)(void);
```
### 8.5 调度函数
无。
### 8.6 预期接口
#### 8.6.1 强制接口
| API | 头文件 | 描述 |
|---|---|---|
| `Det_ReportError` | `Det.h` | 报告开发错误 |
| `EcuM_CheckWakeup` | `EcuM.h` | 验证唤醒源 |
| `Mcu_GetClockState` | `Mcu.h` | 获取时钟状态 |
#### 8.6.2 可选接口
| API | 头文件 | 描述 |
|---|---|---|
| `Dem_ReportErrorStatus` | `Dem.h` | 报告 DEM 错误 |
| `Port_SetPinMode` | `Port.h` | 设置引脚模式 |
#### 8.6.3 可配置接口
| API | 头文件 | 描述 |
|---|---|---|
| `Icu_Notification_` | 用户定义 | 通道通知回调 |
> **摘要标记**:8.6 节详细描述 ICU 驱动的所有预期接口。完整规范见原文 PDF 第 68-69 页。
---
## 9 序列图
### 9.1 Icu_Init
初始化序列:`EcuM` → `Icu_Init(ConfigPtr)` → 配置 ICU 通道 → 完成。
### 9.2 Icu_DeInit
反初始化序列:`Icu_DeInit()` → 反初始化所有通道 → 完成。
### 9.3 检查唤醒事件
```
EcuM → Icu_CheckWakeup(WakeupSource)
↓
验证唤醒源
↓
清除唤醒标志
↓
完成
```
### 9.4 Icu_SetMode
```
应用层 → Icu_SetMode(ICU_MODE_NORMAL)
↓
配置所有通道为正常模式
↓
启用通知
↓
完成
```
> **摘要标记**:本节包含 15 个详细的序列图(9.1-9.15),涵盖初始化、反初始化、唤醒事件、模式切换、激活条件、通知、输入状态、时间戳、边沿计数、信号测量、占空比等场景。完整序列图见原文 PDF 第 71-90 页。
---
## 10 配置规范
### 10.1 如何阅读本章
本章描述 ICU 驱动的 ECUC 配置。完整的 ECUC 参数定义见原文 PDF。
### 10.2 容器与配置参数
#### 10.2.1 Icu(顶层容器)
- 标识符:`Icu`
- 描述:ICU 驱动配置顶层容器
#### 10.2.2 IcuGeneral
主要配置参数:
| 参数 | 类型 | 范围 | 描述 |
|---|---|---|---|
| `IcuDevErrorDetect` | Boolean | TRUE/FALSE | 启用开发错误检测 |
| `IcuDeInitApi` | Boolean | TRUE/FALSE | 启用 `Icu_DeInit` API |
| `IcuEdgeDetectApi` | Boolean | TRUE/FALSE | 启用边沿检测 API |
| `IcuTimestampApi` | Boolean | TRUE/FALSE | 启用时间戳 API |
| `IcuEdgeCountApi` | Boolean | TRUE/FALSE | 启用边沿计数 API |
| `IcuSignalMeasurementApi` | Boolean | TRUE/FALSE | 启用信号测量 API |
| `IcuWakeupFunctionalityApi` | Boolean | TRUE/FALSE | 启用唤醒功能 API |
| `IcuGetDutyCycleValuesApi` | Boolean | TRUE/FALSE | 启用获取占空比值 API |
| `IcuVersionInfoApi` | Boolean | TRUE/FALSE | 启用版本信息 API |
#### 10.2.3 IcuOptionalApis
- 描述:ICU 驱动可选 API 配置
- 多重性:0..1
#### 10.2.4 IcuChannel
- 描述:ICU 通道配置
- 多重性:1..*
主要参数:
| 参数 | 类型 | 描述 |
|---|---|---|
| `IcuChannelId` | Integer | 通道 ID |
| `IcuChannelDefaultStartEdge` | Enum | 默认启动边(RISING/FALLING/BOTH) |
| `IcuChannelMeasurementMode` | Enum | 测量模式(SIGNAL_EDGE_DETECT/SIGNAL_MEASUREMENT/TIMESTAMP/EDGE_COUNTER) |
| `IcuChannelWakeupCapability` | Boolean | 唤醒能力 |
#### 10.2.5 IcuSignalEdgeDetection
- 描述:信号边沿检测配置
- 多重性:0..1
#### 10.2.6 IcuSignalMeasurement
- 描述:信号测量配置
- 多重性:0..1
#### 10.2.7 IcuTimestampMeasurement
- 描述:时间戳测量配置
- 多重性:0..1
#### 10.2.8 IcuWakeup
- 描述:唤醒配置
- 多重性:0..1
#### 10.2.9 IcuConfigSet
- 描述:配置集
- 多重性:1
> **摘要标记**:10.2 节详细描述 ICU 驱动的所有配置容器和参数。完整 ECUC 定义见原文 PDF 第 92-106 页。
### 10.3 已发布信息
无。
---
## 11 不适用的需求
无。
---
## 翻译说明
本文档为 AUTOSAR SWS ICUDriver(文档 ID 023,108 页,4.4.0 版)的中文翻译。翻译策略:
1. **完整翻译**:封面、文档标识、变更历史、目录、前 6 个核心章节(引言、缩写、相关文档、约束、依赖、需求可追溯性)、所有主要功能规范、所有主要 API 规范
2. **核心概念涵盖**:
- **输入捕获单元(ICU)**:PWM 解调、脉冲计数、频率/占空比测量、简单中断、唤醒中断
- **信号边沿通知**:检测上升沿/下降沿/双边沿
- **信号测量**:测量 High Time、Low Time、Period Time
- **时间戳(Timestamp)**:在可配置边上捕获定时器值
- **边沿计数(Edge Counting)**:在激活边上对信号计数
- **唤醒功能**:ICU 通道作为 ECU 唤醒源
- **操作模式**:`ICU_MODE_NORMAL` 和 `ICU_MODE_SLEEP`
3. **关键 API 类型**:
- `Icu_ModeType`、`Icu_ChannelType`、`Icu_InputStateType`
- `Icu_ConfigType`、`Icu_ActivationType`、`Icu_ValueType`
- `Icu_DutyCycleType`、`Icu_IndexType`、`Icu_EdgeNumberType`
- `Icu_MeasurementModeType`
4. **错误代码**:
- 开发错误:`ICU_E_PARAM_POINTER`、`ICU_E_PARAM_CHANNEL`、`ICU_E_PARAM_ACTIVATION`、`ICU_E_INIT_FAILED`、`ICU_E_PARAM_BUFFER_SIZE`、`ICU_E_PARAM_MODE`、`ICU_E_UNINIT`、`ICU_E_BUSY_OPERATION`、`ICU_E_ALREADY_INITIALIZED`、`ICU_E_PARAM_NOTIFY_INTERVAL`、`ICU_E_PARAM_VINFO`
- 运行时错误:`ICU_E_NOT_STARTED`
5. **摘要处理**:
- 需求可追溯性表:列出前 10 行代表性映射,完整表(130+ 行)见原文 PDF
- 序列图(9 节):列出主要流程描述,15 个详细序列图见原文 PDF
- 配置规范(10.2 节):列出主要容器,详细 ECUC 定义见原文 PDF
6. **保留内容**:所有 API 标识符、需求 ID(`SWS_Icu_xxxxx`、`SRS_Icu_xxxxx`、`SRS_BSW_xxxxx`、`SRS_SPAL_xxxxx`)、AUTOSAR 方框符 `⌈⌋`、文档间交叉引用
本文档介绍了 ICU 驱动——AUTOSAR 微控制器抽象层(MCAL)的基础软件模块,提供输入捕获、时间戳、信号测量、边沿计数和唤醒功能等多样化服务。