ICU(Input Capture Unit,输入捕获单元)驱动程序是AUTOSAR标准中的一个重要驱动模块,属于ECU抽象层的一部分。该驱动程序为上层软件提供了一套标准化的接口,用于进行输入信号的捕获、测量和监控。ICU驱动程序主要负责对外部输入信号的特性(如边沿、周期、占空比等)进行检测和测量,为应用软件提供精确的信号时序信息。
在汽车电子系统中,ICU驱动程序广泛应用于:
根据AUTOSAR SWS规范中的定义,ICU驱动程序适用于需要以下功能的应用场景:
ICU驱动程序设计为与硬件无关的接口,通过配置可以适应不同微控制器的输入捕获硬件特性。
ICU驱动程序在AUTOSAR软件架构中处于ECU抽象层,是连接微控制器硬件与上层软件的桥梁。下图展示了ICU驱动程序在AUTOSAR分层架构中的位置以及与相关模块的关系:
从上图可以看出,ICU驱动程序在AUTOSAR架构中的主要关系包括:
向上接口:
向下接口:
横向模块:
ICU驱动程序的核心功能实现包括边沿检测、时间戳捕获、信号测量、边沿计数和唤醒支持,通过对底层ICU硬件的抽象,向上层软件提供统一的服务接口,同时隐藏了不同微控制器之间的硬件差异。
ICU驱动程序采用状态机模型进行设计,具有明确定义的状态和状态转换。以下是ICU驱动程序的状态图:
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之间切换在正常模式(NORMAL)下,ICU驱动程序的各个通道可以分别处于以下功能状态:
边沿检测(EDGE_DETECT):
Icu_EnableNotification()
和Icu_DisableNotification()
控制通知时间戳捕获(TIMESTAMP):
Icu_StartTimestamp()
启动Icu_StopTimestamp()
停止并返回到边沿检测状态信号测量(SIGNAL_MEASUREMENT):
边沿计数(EDGE_COUNTER):
Icu_EnableEdgeCount()
启动Icu_DisableEdgeCount()
停止并返回到边沿检测状态每个ICU通道可以独立配置和控制,不同通道可以同时处于不同的功能状态。
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
:循环缓冲区ICU驱动程序的配置结构主要包括以下几个部分:
Icu_ConfigType:顶层配置结构
Icu_ChannelConfigType:通道配置结构
Icu_ChannelId
:通道IDIcuMeasurementMode
:测量模式IcuDefaultStartEdge
:默认起始边沿IcuWakeupCapability
:唤醒能力标志根据测量模式的不同,每个通道可能包含以下子配置:
边沿检测配置:
IcuNotification
:通知回调函数指针时间戳配置:
IcuTimestampBufferPtr
:时间戳缓冲区指针IcuTimestampBufferSize
:缓冲区大小IcuTimestampNotification
:时间戳通知函数指针IcuTimestampBufferType
:缓冲区类型边沿计数配置:
IcuMaxEdgeCount
:最大边沿计数值IcuEdgeCounterNotification
:边沿计数通知函数指针信号测量配置:
IcuSignalMeasurementProperty
:信号测量属性IcuSignalMeasurementNotification
:信号测量通知函数指针以下是一个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
/* 其他配置参数 */
};
在实际应用中,通过配置工具生成的配置代码会更加复杂,包含更多的参数和通道配置。
ICU驱动程序的初始化和操作涉及多个组件之间的交互,下图展示了ICU驱动程序的典型操作序列:
如上图所示,ICU驱动程序的初始化流程主要包括以下步骤:
Icu_Init(ConfigPtr)
函数Icu_SetMode(ICU_MODE_NORMAL)
将驱动设置为正常工作模式在正常模式下,ICU驱动程序可以执行多种信号捕获操作。以下是几种典型的操作流程:
边沿检测操作:
Icu_SetActivationCondition()
设置边沿触发条件Icu_EnableNotification()
启用通知Icu_DisableNotification()
禁用通知时间戳捕获操作:
Icu_StartTimestamp()
启动时间戳捕获Icu_GetTimestampIndex()
获取当前索引Icu_StopTimestamp()
停止时间戳捕获ICU驱动程序支持系统休眠和唤醒功能,其操作流程如下:
进入休眠:
Icu_EnableWakeup()
启用唤醒功能Icu_SetMode(ICU_MODE_SLEEP)
将驱动设置为休眠模式唤醒处理:
Icu_SetMode(ICU_MODE_NORMAL)
将驱动恢复到正常模式去初始化:
Icu_DeInit()
函数这些序列图展示了ICU驱动程序与上层软件和底层硬件之间的交互过程,帮助理解模块的工作机制。
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驱动程序的版本信息ICU驱动程序使用回调函数机制向上层软件提供事件通知。根据不同的功能模式,可以配置以下通知回调:
通知回调函数在配置阶段定义,例如:
void Icu_EdgeNotification(void) {
/* 边沿检测通知处理逻辑 */
}
void Icu_TimestampNotification(void) {
/* 时间戳缓冲区满通知处理逻辑 */
}
通知机制为上层软件提供了一种异步处理ICU事件的方式,避免了轮询导致的CPU资源浪费。
AUTOSAR ICU驱动程序是连接微控制器输入捕获硬件与上层应用软件的关键组件。通过本文的分析,我们了解了ICU驱动程序的架构设计、状态管理、配置结构、操作时序和API接口。
ICU驱动程序的主要特点包括:
层次化架构:
状态管理:
功能多样性:
配置灵活性:
标准化接口:
ICU驱动程序在汽车电子系统中发挥着重要作用,尤其是在需要精确测量外部信号特性的应用场景中。通过合理配置和使用ICU驱动程序,可以实现各种信号捕获和测量功能,满足不同的应用需求。
R分层架构的重要组成部分
状态管理:
功能多样性:
配置灵活性:
标准化接口:
ICU驱动程序在汽车电子系统中发挥着重要作用,尤其是在需要精确测量外部信号特性的应用场景中。通过合理配置和使用ICU驱动程序,可以实现各种信号捕获和测量功能,满足不同的应用需求。
在实际开发中,需要根据具体的硬件平台和应用需求,正确配置ICU驱动程序的参数,并合理调用其API函数,以充分发挥其功能。