AUTOSAR图解==>AUTOSAR_SWS_ICUDriver_AUTOSAR_SWS_ICUDriver
AUTOSAR ICU驱动详解
目录
- 1. 概述
- 1.1 ICU驱动功能概述
- 1.2 ICU术语与定义
- 2. 架构与依赖
- 2.1 模块架构
- 2.2 模块依赖
- 3. 状态机模型
- 3.1 ICU状态定义
- 3.2 状态转换
- 4. 配置与数据结构
- 4.1 配置参数
- 4.2 数据类型
- 5. API与流程
- 5.1 初始化与去初始化
- 5.2 信号捕获与测量
- 5.3 时间戳功能
- 5.4 边沿计数功能
- 5.5 唤醒支持
- 6. 错误处理
- 7. 总结
1. 概述
1.1 ICU驱动功能概述
AUTOSAR ICU (Input Capture Unit) 驱动是AUTOSAR标准的基础软件模块之一,提供了微控制器输入捕获功能的标准化接口。ICU驱动模块提供多种信号处理功能,支持各种应用场景下的输入信号捕获与分析。
ICU驱动主要提供以下核心功能:
- 信号边沿通知:检测输入信号的上升沿、下降沿或双边沿,并触发通知
- 边沿计数:统计特定时间内的边沿数量
- 控制唤醒中断:支持在低功耗模式下的唤醒功能
- 周期信号时间测量:测量信号的周期、高电平时间、低电平时间等参数
- 边沿时间戳记录:捕获非周期信号的时间戳序列
ICU驱动可用于解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断和唤醒中断等应用场景。
1.2 ICU术语与定义
理解ICU驱动需要掌握以下关键术语:
- ICU (Input Capture Unit):输入捕获单元,用于捕获输入信号的时间信息
- 有效时间 (Active Time):根据配置的起始边沿类型确定的时间段
- 起始边沿为下降沿:有效时间为低电平时间
- 起始边沿为上升沿:有效时间为高电平时间
- 起始边沿为双边沿:根据首次检测到的边沿类型确定
- ICU通道 (ICU Channel):代表一个逻辑ICU实体,绑定到一个输入信号和对应的硬件资源
- ICU状态 (ICU State):ICU通道的逻辑输入状态,可以是激活状态(ICU_ACTIVE)或空闲状态(ICU_IDLE)
- ICU_ACTIVE:ICU通道检测到激活边沿
- ICU_IDLE:自上次调用Icu_GetInputState()或Icu_Init()后未检测到激活边沿
- 唤醒事件 (Wakeup event):一种特定的边沿模式,可触发驱动唤醒
2. 架构与依赖
2.1 模块架构
ICU驱动是AUTOSAR标准的微控制器抽象层(MCAL)的一部分,遵循分层架构设计。上图展示了ICU驱动在AUTOSAR架构中的位置及其与其他模块的关系。
ICU驱动架构的主要特点包括:
- 位于微控制器抽象层:作为MCAL的一部分,为上层提供硬件无关的标准化接口
- 通过RTE与应用通信:提供标准API供上层应用调用
- 支持多种测量模式:包括边沿检测、信号测量、时间戳和边沿计数
- 模块化结构:功能划分清晰,易于配置和扩展
所有微控制器特定的实现细节都被封装在ICU驱动内部,保证了应用层代码的硬件无关性和可移植性。
2.2 模块依赖
ICU驱动与以下AUTOSAR模块有依赖关系:
- DET (默认错误追踪器):用于报告和记录检测到的错误
- MCU模块:提供系统时钟、PLL和全局预分频器的配置
- OS (操作系统):配置中断源和提供中断处理支持
- PORT模块:负责ICU输入引脚的配置
- EcuM (ECU状态管理器):ICU驱动向EcuM报告唤醒中断
ICU驱动的主要依赖关系如下所示:
- ICU驱动依赖于MCU模块提供的系统时钟和预分频器配置
- ICU驱动不负责配置全局时钟、全局预分频器和PLL,这些由MCU模块负责
- ICU驱动仅配置特定于ICU外设的本地时钟和预分频器
- ICU驱动依赖操作系统进行中断配置和处理
- ICU使用的输入引脚由PORT驱动配置
- ICU需要在PORT驱动初始化后再初始化,否则可能导致未定义的行为
3. 状态机模型
3.1 ICU状态定义
ICU驱动实现了一个状态机模型,定义了模块和通道的不同状态及状态转换。
ICU驱动的主要状态包括:
-
模块级状态
- 未初始化状态(ICU_UNINIT):模块尚未调用Icu_Init(),此时不能使用任何API功能
- 已初始化状态(ICU_INIT):模块已调用Icu_Init(),可以使用所有API功能
-
通道级状态
- 空闲状态(ICU_IDLE):通道未检测到激活边沿
- 激活状态(ICU_ACTIVE):通道检测到激活边沿,直到下次调用Icu_GetInputState()前保持此状态
-
工作模式
- 正常模式(ICU_MODE_NORMAL):所有配置的功能都可用
- 睡眠模式(ICU_MODE_SLEEP):只有唤醒相关功能可用
-
测量模式
- 边沿检测模式:检测边沿并触发通知
- 信号测量模式:测量信号的周期、占空比等参数
- 时间戳模式:记录边沿事件的时间戳
- 边沿计数模式:统计边沿数量
3.2 状态转换
ICU驱动的状态转换由特定的API触发:
-
模块级转换
- Icu_Init():从未初始化状态转换为已初始化状态
- Icu_DeInit():从已初始化状态转换为未初始化状态
- Icu_SetMode():在正常模式和睡眠模式之间切换
-
通道级转换
- Icu_GetInputState():将激活状态重置为空闲状态(如果没有新的激活边沿)
- 硬件事件:当检测到激活边沿时,通道从空闲状态转换为激活状态
-
功能模式转换
- Icu_EnableNotification()/Icu_DisableNotification():启用/禁用边沿通知
- Icu_StartSignalMeasurement()/Icu_StopSignalMeasurement():启动/停止信号测量
- Icu_StartTimestamp()/Icu_StopTimestamp():启动/停止时间戳捕获
- Icu_EnableEdgeCount()/Icu_DisableEdgeCount():启用/禁用边沿计数
不同的边沿触发类型可以通过Icu_SetActivationCondition()API进行配置,支持上升沿(ICU_RISING_EDGE)、下降沿(ICU_FALLING_EDGE)和双边沿(ICU_BOTH_EDGES)三种模式。
4. 配置与数据结构
4.1 配置参数
ICU驱动的配置结构定义了驱动的行为特性。配置主要通过Icu_ConfigType及相关结构体实现。
ICU驱动的主要配置结构包括:
-
Icu_ConfigType:顶层配置结构
- 包含通道配置数组
- 包含通知函数指针数组
- 包含硬件单元配置
- 定义最大通道数
-
Icu_ChannelConfigType:通道级配置
- 通道ID
- 测量模式(边沿检测/信号测量/时间戳/边沿计数)
- 默认激活边沿类型
- 通知偏移量和周期
- 硬件单元ID
- 测量预分频值
- 唤醒能力标志
-
Icu_HwUnitType:硬件单元配置
- 硬件单元ID
- 时钟引用
- 中断优先级
-
配置枚举类型
- Icu_MeasurementModeType:定义测量模式
- Icu_ActivationType:定义激活边沿类型
- Icu_SignalMeasurementPropertyType:定义信号测量属性
4.2 数据类型
ICU驱动定义了多种数据类型用于API参数传递和结果返回:
-
基本类型
- Icu_ValueType:表示测量值
- Icu_EdgeNumberType:表示边沿计数值
- Icu_IndexType:表示时间戳索引
-
复合类型
- Icu_DutyCycleType:包含高电平时间和周期时间
- Icu_TimestampBufferType:包含时间戳缓冲区指针和大小
-
状态枚举
- Icu_ModeType:模块工作模式(正常/睡眠)
- Icu_InputStateType:通道输入状态(激活/空闲)
- Icu_StatusType:模块初始化状态
-
错误码
- Icu_ErrorCodeType:定义错误类型
- 例如:参数错误、未初始化错误、配置错误等
配置结构的设计遵循AUTOSAR标准的模块化原则,便于配置工具生成适合特定应用需求的配置数据。
5. API与流程
5.1 初始化与去初始化
ICU驱动的初始化和去初始化流程如下:
-
初始化流程
- 调用
Icu_Init(ConfigPtr)
初始化模块 - 函数首先进行参数有效性检查
- 无效参数通过DET报告错误
- 初始化模块内部状态变量
- 根据配置设置硬件寄存器
- 将模块状态设置为ICU_INITIALIZED
- 调用
-
去初始化流程
- 调用
Icu_DeInit()
去初始化模块 - 检查模块是否已初始化,未初始化则报告错误
- 重置所有硬件寄存器到默认状态
- 将模块状态设置为ICU_UNINITIALIZED
- 调用
初始化函数必须在使用任何其他API前调用,且必须在PORT驱动初始化后调用,以确保输入引脚配置正确。
5.2 信号捕获与测量
ICU驱动支持多种信号捕获和测量模式:
-
边沿检测功能
Icu_SetActivationCondition(Channel, Activation)
:设置边沿触发类型Icu_EnableNotification(Channel)
:启用边沿通知Icu_DisableNotification(Channel)
:禁用边沿通知Icu_GetInputState(Channel)
:获取通道当前状态
-
信号测量功能
Icu_StartSignalMeasurement(Channel, Mode)
:启动信号测量Icu_StopSignalMeasurement(Channel)
:停止信号测量Icu_GetTimeElapsed(Channel)
:获取已经过的时间Icu_GetDutyCycleValues(Channel, DutyCycleValues)
:获取占空比值
边沿检测流程:
- 应用设置激活边沿条件
- 启用边沿通知
- 硬件检测到边沿事件时触发中断
- ICU驱动处理中断并调用配置的通知回调函数
- 应用可以通过Icu_GetInputState获取当前状态
5.3 时间戳功能
时间戳功能用于捕获非周期信号的时间信息:
-
时间戳API
Icu_StartTimestamp(Channel, BufferPtr, BufferSize, NotifyInterval)
:启动时间戳捕获Icu_StopTimestamp(Channel)
:停止时间戳捕获Icu_GetTimestampIndex(Channel)
:获取当前时间戳索引
-
时间戳流程
- 应用提供时间戳缓冲区并设置通知间隔
- 启动时间戳捕获
- 硬件检测到边沿时触发中断
- ICU驱动记录时间戳到缓冲区
- 当达到通知间隔时调用通知函数
- 应用可以随时查询当前索引值
- 缓冲区满时会自动停止捕获或循环覆盖(取决于配置)
时间戳功能适用于需要精确记录信号时序的应用场景,如协议解码和信号分析。
5.4 边沿计数功能
边沿计数功能用于统计特定时间内的边沿数量:
-
边沿计数API
Icu_ResetEdgeCount(Channel)
:重置边沿计数器Icu_EnableEdgeCount(Channel)
:启用边沿计数Icu_DisableEdgeCount(Channel)
:禁用边沿计数Icu_GetEdgeNumbers(Channel)
:获取边沿计数值
-
边沿计数流程
- 应用重置边沿计数器
- 启用边沿计数
- 硬件检测到配置的边沿类型时增加计数器
- 应用可以随时查询当前计数值
- 计数器达到最大值时会溢出并从0重新开始
边沿计数功能可用于测量信号频率、检测特定事件数量等应用场景。
5.5 唤醒支持
ICU驱动支持ECU的低功耗模式和唤醒功能:
-
唤醒相关API
Icu_SetMode(Mode)
:设置模块工作模式(正常/睡眠)
-
唤醒流程
- 应用调用Icu_SetMode(ICU_MODE_SLEEP)进入睡眠模式
- ICU驱动配置唤醒中断并禁用非唤醒中断
- 硬件检测到唤醒事件时触发中断
- ICU驱动调用EcuM_SetWakeupEvent()通知ECU状态管理器
- 应用调用Icu_SetMode(ICU_MODE_NORMAL)恢复正常模式
唤醒功能对于需要低功耗运行但仍需响应特定输入事件的应用至关重要。
6. 错误处理
ICU驱动使用开发错误检测(DET)机制来处理错误,主要错误类型包括:
-
参数错误
- ICU_E_PARAM_CONFIG:配置指针无效
- ICU_E_PARAM_CHANNEL:通道参数无效
- ICU_E_PARAM_ACTIVATION:激活参数无效
- ICU_E_PARAM_BUFFER_PTR:缓冲区指针无效
- ICU_E_PARAM_BUFFER_SIZE:缓冲区大小无效
- ICU_E_PARAM_MODE:模式参数无效
- ICU_E_PARAM_NOTIFY:通知参数无效
-
状态错误
- ICU_E_UNINIT:模块未初始化
- ICU_E_NOT_STARTED:功能未启动
- ICU_E_ALREADY_INITIALIZED:模块已初始化
- ICU_E_INIT_FAILED:初始化失败
错误处理流程:
- API函数首先检查参数有效性和模块状态
- 检测到错误时,通过Det_ReportError()报告错误
- 错误参数包括模块ID、实例ID、错误代码和API ID
- 发生错误时,API函数通常不执行进一步操作并返回
7. 总结
AUTOSAR ICU驱动是一个功能丰富的模块,提供了对输入捕获单元的标准化访问接口。它支持多种信号捕获和测量功能,适用于各种应用场景。
ICU驱动的主要特点包括:
-
标准化接口
- 提供硬件无关的标准化API
- 遵循AUTOSAR规范确保兼容性
- 支持多种配置选项适应不同需求
-
多功能性
- 边沿检测与通知
- 信号测量(周期、占空比)
- 时间戳捕获
- 边沿计数
- 唤醒支持
-
可靠性
- 完善的错误检测机制
- 清晰的状态机模型
- 标准化的配置结构
-
集成性
- 与AUTOSAR其他模块良好集成
- 支持微控制器抽象层架构
- 配合其他模块实现完整功能
ICU驱动是处理数字输入信号的关键模块,广泛应用于汽车电子系统中的传感器接口、脉冲计数、频率测量和周期信号分析等场景。