AUTOSAR ICU驱动程序详解
目录
- 概述
1.1 ICU驱动程序的作用与定位
1.2 适用范围 - 架构设计
2.1 层次结构
2.2 模块关系 - 状态管理
3.1 状态模型
3.2 状态转换
3.3 功能状态 - 配置结构
4.1 数据类型
4.2 配置参数
4.3 配置示例 - 操作时序
5.1 初始化流程
5.2 信号捕获流程
5.3 休眠与唤醒流程 - API接口
6.1 核心功能函数
6.2 通知机制 - 总结
1. 概述
1.1 ICU驱动程序的作用与定位
ICU(Input Capture Unit,输入捕获单元)驱动程序是AUTOSAR标准中的一个重要驱动模块,属于ECU抽象层的一部分。该驱动程序为上层软件提供了一套标准化的接口,用于进行输入信号的捕获、测量和监控。ICU驱动程序主要负责对外部输入信号的特性(如边沿、周期、占空比等)进行检测和测量,为应用软件提供精确的信号时序信息。
在汽车电子系统中,ICU驱动程序广泛应用于:
- 车轮转速检测
- 发动机转速和位置传感
- 各类开关和传感器信号的监控
- 脉冲宽度测量
- 唤醒源信号监测
- 精确时间间隔测量
1.2 适用范围
根据AUTOSAR SWS规范中的定义,ICU驱动程序适用于需要以下功能的应用场景:
- 边沿检测:监测输入信号的上升沿或下降沿,并生成通知
- 时间戳捕获:记录信号边沿出现的精确时间点
- 信号测量:测量信号的周期、高电平时间、低电平时间或占空比
- 边沿计数:计算特定时间内信号边沿的出现次数
- 休眠和唤醒支持:作为ECU唤醒源,在低功耗模式下监测特定信号
ICU驱动程序设计为与硬件无关的接口,通过配置可以适应不同微控制器的输入捕获硬件特性。
2. 架构设计
2.1 层次结构
ICU驱动程序在AUTOSAR软件架构中处于ECU抽象层,是连接微控制器硬件与上层软件的桥梁。下图展示了ICU驱动程序在AUTOSAR分层架构中的位置以及与相关模块的关系:
2.2 模块关系
从上图可以看出,ICU驱动程序在AUTOSAR架构中的主要关系包括:
-
向上接口:
- 应用软件组件(SWC):通过RTE间接使用ICU驱动提供的服务
- RTE层:转发应用层的请求到ICU接口
- ECU状态管理器(EcuM):控制ICU驱动的初始化、模式切换和去初始化
-
向下接口:
- MCU驱动程序:ICU驱动使用MCU提供的时钟配置
- 端口驱动程序:ICU驱动使用端口驱动配置I/O引脚功能
- ICU硬件模块:ICU驱动直接访问和控制底层硬件资源
-
横向模块:
- 其他驱动程序接口:可能与ICU共享某些硬件资源
ICU驱动程序的核心功能实现包括边沿检测、时间戳捕获、信号测量、边沿计数和唤醒支持,通过对底层ICU硬件的抽象,向上层软件提供统一的服务接口,同时隐藏了不同微控制器之间的硬件差异。
3. 状态管理
3.1 状态模型
ICU驱动程序采用状态机模型进行设计,具有明确定义的状态和状态转换。以下是ICU驱动程序的状态图:
3.2 状态转换
ICU驱动程序主要包含以下几个状态:
-
未初始化(UNINIT):
- 模块启动后的初始状态
- 所有功能不可用
- 通过调用
Icu_Init()
函数转换到IDLE状态
-
空闲(IDLE):
- 驱动程序已经初始化但尚未激活任何功能
- 所有通知被禁用
- 可以通过
Icu_SetMode()
函数切换到正常模式
-
正常模式(NORMAL):
- 所有配置的功能可用
- 所有中断可以被启用或禁用
- 可以通过
Icu_SetMode()
函数切换到休眠模式 - 可以通过
Icu_DeInit()
函数回到IDLE状态
-
休眠模式(SLEEP):
- 减少功耗的模式
- 只有配置为唤醒源的通知可用
- 其他功能受限
- 可以通过
Icu_SetMode()
函数切换回正常模式 - 可以通过
Icu_DeInit()
函数回到IDLE状态
状态转换主要由以下API驱动:
Icu_Init()
:初始化ICU驱动,从UNINIT转到IDLEIcu_DeInit()
:去初始化ICU驱动,从NORMAL或SLEEP转到IDLEIcu_SetMode()
:切换ICU驱动的工作模式,在NORMAL和SLEEP之间切换
3.3 功能状态
在正常模式(NORMAL)下,ICU驱动程序的各个通道可以分别处于以下功能状态:
-
边沿检测(EDGE_DETECT):
- 默认功能状态
- 通过
Icu_EnableNotification()
和Icu_DisableNotification()
控制通知 - 可以转换到其他功能状态
-
时间戳捕获(TIMESTAMP):
- 通过
Icu_StartTimestamp()
启动 - 通过
Icu_StopTimestamp()
停止并返回到边沿检测状态 - 自动记录边沿事件的时间戳到缓冲区
- 通过
-
信号测量(SIGNAL_MEASUREMENT):
- 测量信号周期、占空比等特性
- 可以在测量完成后回到边沿检测状态
-
边沿计数(EDGE_COUNTER):
- 通过
Icu_EnableEdgeCount()
启动 - 通过
Icu_DisableEdgeCount()
停止并返回到边沿检测状态 - 计数特定时间内的边沿事件数量
- 通过
每个ICU通道可以独立配置和控制,不同通道可以同时处于不同的功能状态。
4. 配置结构
4.1 数据类型
ICU驱动程序定义了一系列数据类型,用于配置和操作驱动程序。以下是ICU驱动程序的类图,展示了主要的数据类型和配置结构:
ICU驱动程序的主要数据类型包括:
-
Icu_StatusType:表示ICU通道的状态
ICU_IDLE
:通道空闲ICU_ACTIVE
:通道活动中ICU_EXPIRED
:通道操作已结束
-
Icu_ModeType:表示ICU驱动的工作模式
ICU_MODE_NORMAL
:正常工作模式ICU_MODE_SLEEP
:低功耗模式
-
Icu_ActivationType:表示ICU通道的激活条件
ICU_RISING_EDGE
:上升沿触发ICU_FALLING_EDGE
:下降沿触发ICU_BOTH_EDGES
:双边沿触发
-
Icu_MeasurementModeType:表示ICU通道的测量模式
ICU_MODE_SIGNAL_EDGE_DETECT
:边沿检测模式ICU_MODE_SIGNAL_MEASUREMENT
:信号测量模式ICU_MODE_TIMESTAMP
:时间戳模式ICU_MODE_EDGE_COUNTER
:边沿计数模式
-
Icu_SignalMeasurementPropertyType:表示信号测量属性
ICU_DUTY_CYCLE
:占空比测量ICU_PERIOD_TIME
:周期时间测量ICU_ACTIVE_TIME
:高电平时间测量ICU_LOW_TIME
:低电平时间测量
-
Icu_TimestampBufferType:表示时间戳缓冲区类型
ICU_LINEAR_BUFFER
:线性缓冲区ICU_CIRCULAR_BUFFER
:循环缓冲区
4.2 配置参数
ICU驱动程序的配置结构主要包括以下几个部分:
-
Icu_ConfigType:顶层配置结构
- 包含所有ICU通道的配置指针
-
Icu_ChannelConfigType:通道配置结构
Icu_ChannelId
:通道IDIcuMeasurementMode
:测量模式IcuDefaultStartEdge
:默认起始边沿IcuWakeupCapability
:唤醒能力标志- 其他通道相关配置
-
根据测量模式的不同,每个通道可能包含以下子配置:
-
边沿检测配置:
IcuNotification
:通知回调函数指针
-
时间戳配置:
IcuTimestampBufferPtr
:时间戳缓冲区指针IcuTimestampBufferSize
:缓冲区大小IcuTimestampNotification
:时间戳通知函数指针IcuTimestampBufferType
:缓冲区类型
-
边沿计数配置:
IcuMaxEdgeCount
:最大边沿计数值IcuEdgeCounterNotification
:边沿计数通知函数指针
-
信号测量配置:
IcuSignalMeasurementProperty
:信号测量属性IcuSignalMeasurementNotification
:信号测量通知函数指针
-
4.3 配置示例
以下是一个ICU驱动程序配置的简化示例,展示了如何配置一个通道用于时间戳捕获:
/* 通知回调函数定义 */
void Icu_TimestampNotification(void) {
/* 时间戳缓冲区已满时的处理逻辑 */
}
/* 时间戳缓冲区 */
Icu_ValueType TimestampBuffer[ICU_TIMESTAMP_BUFFER_SIZE];
/* 通道配置 - 时间戳模式 */
const Icu_TimestampConfigType IcuChannel0TimestampConfig = {
.IcuTimestampBufferPtr = TimestampBuffer,
.IcuTimestampBufferSize = ICU_TIMESTAMP_BUFFER_SIZE,
.IcuTimestampNotification = Icu_TimestampNotification,
.IcuTimestampBufferType = ICU_LINEAR_BUFFER
};
/* 通道配置 */
const Icu_ChannelConfigType IcuChannelConfig[ICU_MAX_CHANNEL] = {
{
.Icu_ChannelId = ICU_CHANNEL_0,
.IcuMeasurementMode = ICU_MODE_TIMESTAMP,
.IcuDefaultStartEdge = ICU_RISING_EDGE,
.IcuWakeupCapability = FALSE,
.IcuTimestampConfig = &IcuChannel0TimestampConfig,
/* 其他配置参数 */
}
/* 其他通道配置 */
};
/* ICU驱动程序配置 */
const Icu_ConfigType IcuConfig = {
.IcuChannelConfig = IcuChannelConfig
/* 其他配置参数 */
};
在实际应用中,通过配置工具生成的配置代码会更加复杂,包含更多的参数和通道配置。
5. 操作时序
5.1 初始化流程
ICU驱动程序的初始化和操作涉及多个组件之间的交互,下图展示了ICU驱动程序的典型操作序列:
如上图所示,ICU驱动程序的初始化流程主要包括以下步骤:
- 上层软件(通常是ECU状态管理器)调用
Icu_Init(ConfigPtr)
函数 - ICU驱动程序获取MCU驱动提供的时钟配置
- ICU驱动程序配置底层ICU硬件模块
- ICU驱动程序将自身状态设置为IDLE
- ICU驱动程序禁用所有通知和唤醒功能
- 上层软件调用
Icu_SetMode(ICU_MODE_NORMAL)
将驱动设置为正常工作模式
5.2 信号捕获流程
在正常模式下,ICU驱动程序可以执行多种信号捕获操作。以下是几种典型的操作流程:
-
边沿检测操作:
- 上层软件调用
Icu_SetActivationCondition()
设置边沿触发条件 - 上层软件调用
Icu_EnableNotification()
启用通知 - 当检测到配置的边沿时,ICU硬件触发中断
- ICU驱动程序调用配置的通知回调函数
- ICU驱动程序清除中断标志
- 上层软件可以调用
Icu_DisableNotification()
禁用通知
- 上层软件调用
-
时间戳捕获操作:
- 上层软件调用
Icu_StartTimestamp()
启动时间戳捕获 - ICU驱动程序启用时间戳捕获功能并设置通道状态为ACTIVE
- 当检测到配置的边沿时,ICU硬件触发中断
- ICU驱动程序记录时间戳到缓冲区并清除中断标志
- 当缓冲区满时,ICU驱动程序调用配置的通知回调函数
- 上层软件可以调用
Icu_GetTimestampIndex()
获取当前索引 - 上层软件调用
Icu_StopTimestamp()
停止时间戳捕获
- 上层软件调用
5.3 休眠与唤醒流程
ICU驱动程序支持系统休眠和唤醒功能,其操作流程如下:
-
进入休眠:
- 上层软件请求进入休眠模式
- 上层软件调用
Icu_EnableWakeup()
启用唤醒功能 - 上层软件调用
Icu_SetMode(ICU_MODE_SLEEP)
将驱动设置为休眠模式 - ICU驱动程序配置ICU硬件进入低功耗状态
-
唤醒处理:
- 当配置为唤醒源的ICU通道检测到唤醒信号时,ICU硬件触发唤醒中断
- ICU驱动程序调用唤醒通知函数通知上层软件
- 上层软件调用
Icu_SetMode(ICU_MODE_NORMAL)
将驱动恢复到正常模式
-
去初始化:
- 上层软件请求关闭时,调用
Icu_DeInit()
函数 - ICU驱动程序复位ICU硬件、禁用所有中断和通知
- ICU驱动程序将自身状态设置为UNINIT
- 上层软件请求关闭时,调用
这些序列图展示了ICU驱动程序与上层软件和底层硬件之间的交互过程,帮助理解模块的工作机制。
6. API接口
6.1 核心功能函数
ICU驱动程序提供了一系列标准化的API函数,用于控制和使用ICU功能。以下是主要API函数及其功能描述:
-
初始化和模式控制:
Icu_Init(const Icu_ConfigType* ConfigPtr)
:初始化ICU驱动程序Icu_DeInit(void)
:去初始化ICU驱动程序Icu_SetMode(Icu_ModeType Mode)
:设置ICU驱动的工作模式
-
唤醒控制:
Icu_DisableWakeup(Icu_ChannelType Channel)
:禁用通道的唤醒功能Icu_EnableWakeup(Icu_ChannelType Channel)
:启用通道的唤醒功能
-
边沿检测控制:
Icu_SetActivationCondition(Icu_ChannelType Channel, Icu_ActivationType Activation)
:设置通道的边沿触发条件Icu_DisableNotification(Icu_ChannelType Channel)
:禁用通道的边沿通知Icu_EnableNotification(Icu_ChannelType Channel)
:启用通道的边沿通知Icu_GetInputState(Icu_ChannelType Channel)
:获取通道的输入状态
-
时间戳功能:
Icu_StartTimestamp(Icu_ChannelType Channel, Icu_ValueType* BufferPtr, uint16 BufferSize)
:启动时间戳捕获Icu_StopTimestamp(Icu_ChannelType Channel)
:停止时间戳捕获Icu_GetTimestampIndex(Icu_ChannelType Channel)
:获取时间戳缓冲区的当前索引
-
边沿计数功能:
Icu_ResetEdgeCount(Icu_ChannelType Channel)
:重置边沿计数器Icu_EnableEdgeCount(Icu_ChannelType Channel)
:启用边沿计数功能Icu_DisableEdgeCount(Icu_ChannelType Channel)
:禁用边沿计数功能Icu_GetEdgeNumbers(Icu_ChannelType Channel)
:获取已计数的边沿数量
-
信号测量功能:
Icu_GetTimeElapsed(Icu_ChannelType Channel)
:获取已经过的时间Icu_GetDutyCycleValues(Icu_ChannelType Channel, uint32* DutyCycleValues, uint32* PeriodTime, uint32* ActiveTime)
:获取占空比相关值
-
版本信息:
Icu_GetVersionInfo(Std_VersionInfoType* VersionInfo)
:获取ICU驱动程序的版本信息
6.2 通知机制
ICU驱动程序使用回调函数机制向上层软件提供事件通知。根据不同的功能模式,可以配置以下通知回调:
- 边沿检测通知:当检测到配置的边沿时触发
- 时间戳通知:当时间戳缓冲区满时触发
- 边沿计数通知:当边沿计数达到配置的最大值时触发
- 信号测量通知:当信号测量完成时触发
通知回调函数在配置阶段定义,例如:
void Icu_EdgeNotification(void) {
/* 边沿检测通知处理逻辑 */
}
void Icu_TimestampNotification(void) {
/* 时间戳缓冲区满通知处理逻辑 */
}
通知机制为上层软件提供了一种异步处理ICU事件的方式,避免了轮询导致的CPU资源浪费。
7. 总结
AUTOSAR ICU驱动程序是连接微控制器输入捕获硬件与上层应用软件的关键组件。通过本文的分析,我们了解了ICU驱动程序的架构设计、状态管理、配置结构、操作时序和API接口。
ICU驱动程序的主要特点包括:
-
层次化架构:
- 位于ECU抽象层,是AUTOSAR分层架构的重要组成部分
- 向上提供标准接口,向下访问硬件资源
-
状态管理:
- 定义清晰的状态模型和状态转换机制
- 支持正常和低功耗两种工作模式
-
功能多样性:
- 边沿检测功能
- 时间戳捕获功能
- 信号特性测量功能
- 边沿计数功能
- 系统唤醒支持
-
配置灵活性:
- 支持多种通道独立配置
- 每个通道可配置为不同的工作模式
- 支持不同的信号激活条件和测量属性
-
标准化接口:
- 提供一套完整的API函数
- 使用回调机制实现事件通知
- 符合AUTOSAR标准规范
ICU驱动程序在汽车电子系统中发挥着重要作用,尤其是在需要精确测量外部信号特性的应用场景中。通过合理配置和使用ICU驱动程序,可以实现各种信号捕获和测量功能,满足不同的应用需求。
R分层架构的重要组成部分
- 向上提供标准接口,向下访问硬件资源
-
状态管理:
- 定义清晰的状态模型和状态转换机制
- 支持正常和低功耗两种工作模式
-
功能多样性:
- 边沿检测功能
- 时间戳捕获功能
- 信号特性测量功能
- 边沿计数功能
- 系统唤醒支持
-
配置灵活性:
- 支持多种通道独立配置
- 每个通道可配置为不同的工作模式
- 支持不同的信号激活条件和测量属性
-
标准化接口:
- 提供一套完整的API函数
- 使用回调机制实现事件通知
- 符合AUTOSAR标准规范
ICU驱动程序在汽车电子系统中发挥着重要作用,尤其是在需要精确测量外部信号特性的应用场景中。通过合理配置和使用ICU驱动程序,可以实现各种信号捕获和测量功能,满足不同的应用需求。
在实际开发中,需要根据具体的硬件平台和应用需求,正确配置ICU驱动程序的参数,并合理调用其API函数,以充分发挥其功能。