AUTOSAR图解==>AUTOSAR_SWS_ICUDriver

AUTOSAR ICU驱动程序详解

基于AUTOSAR标准规范的ICU驱动程序架构、状态转换与配置分析

目录

  1. 概述
    1.1 ICU驱动程序的作用与定位
    1.2 适用范围
  2. 架构设计
    2.1 层次结构
    2.2 模块关系
  3. 状态管理
    3.1 状态模型
    3.2 状态转换
    3.3 功能状态
  4. 配置结构
    4.1 数据类型
    4.2 配置参数
    4.3 配置示例
  5. 操作时序
    5.1 初始化流程
    5.2 信号捕获流程
    5.3 休眠与唤醒流程
  6. API接口
    6.1 核心功能函数
    6.2 通知机制
  7. 总结

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架构中的主要关系包括:

  1. 向上接口

    • 应用软件组件(SWC):通过RTE间接使用ICU驱动提供的服务
    • RTE层:转发应用层的请求到ICU接口
    • ECU状态管理器(EcuM):控制ICU驱动的初始化、模式切换和去初始化
  2. 向下接口

    • MCU驱动程序:ICU驱动使用MCU提供的时钟配置
    • 端口驱动程序:ICU驱动使用端口驱动配置I/O引脚功能
    • ICU硬件模块:ICU驱动直接访问和控制底层硬件资源
  3. 横向模块

    • 其他驱动程序接口:可能与ICU共享某些硬件资源

ICU驱动程序的核心功能实现包括边沿检测、时间戳捕获、信号测量、边沿计数和唤醒支持,通过对底层ICU硬件的抽象,向上层软件提供统一的服务接口,同时隐藏了不同微控制器之间的硬件差异。


3. 状态管理

3.1 状态模型

ICU驱动程序采用状态机模型进行设计,具有明确定义的状态和状态转换。以下是ICU驱动程序的状态图:

在这里插入图片描述

3.2 状态转换

ICU驱动程序主要包含以下几个状态:

  1. 未初始化(UNINIT)

    • 模块启动后的初始状态
    • 所有功能不可用
    • 通过调用Icu_Init()函数转换到IDLE状态
  2. 空闲(IDLE)

    • 驱动程序已经初始化但尚未激活任何功能
    • 所有通知被禁用
    • 可以通过Icu_SetMode()函数切换到正常模式
  3. 正常模式(NORMAL)

    • 所有配置的功能可用
    • 所有中断可以被启用或禁用
    • 可以通过Icu_SetMode()函数切换到休眠模式
    • 可以通过Icu_DeInit()函数回到IDLE状态
  4. 休眠模式(SLEEP)

    • 减少功耗的模式
    • 只有配置为唤醒源的通知可用
    • 其他功能受限
    • 可以通过Icu_SetMode()函数切换回正常模式
    • 可以通过Icu_DeInit()函数回到IDLE状态

状态转换主要由以下API驱动:

  • Icu_Init():初始化ICU驱动,从UNINIT转到IDLE
  • Icu_DeInit():去初始化ICU驱动,从NORMAL或SLEEP转到IDLE
  • Icu_SetMode():切换ICU驱动的工作模式,在NORMAL和SLEEP之间切换

3.3 功能状态

在正常模式(NORMAL)下,ICU驱动程序的各个通道可以分别处于以下功能状态:

  1. 边沿检测(EDGE_DETECT)

    • 默认功能状态
    • 通过Icu_EnableNotification()Icu_DisableNotification()控制通知
    • 可以转换到其他功能状态
  2. 时间戳捕获(TIMESTAMP)

    • 通过Icu_StartTimestamp()启动
    • 通过Icu_StopTimestamp()停止并返回到边沿检测状态
    • 自动记录边沿事件的时间戳到缓冲区
  3. 信号测量(SIGNAL_MEASUREMENT)

    • 测量信号周期、占空比等特性
    • 可以在测量完成后回到边沿检测状态
  4. 边沿计数(EDGE_COUNTER)

    • 通过Icu_EnableEdgeCount()启动
    • 通过Icu_DisableEdgeCount()停止并返回到边沿检测状态
    • 计数特定时间内的边沿事件数量

每个ICU通道可以独立配置和控制,不同通道可以同时处于不同的功能状态。


4. 配置结构

4.1 数据类型

ICU驱动程序定义了一系列数据类型,用于配置和操作驱动程序。以下是ICU驱动程序的类图,展示了主要的数据类型和配置结构:

在这里插入图片描述

ICU驱动程序的主要数据类型包括:

  1. Icu_StatusType:表示ICU通道的状态

    • ICU_IDLE:通道空闲
    • ICU_ACTIVE:通道活动中
    • ICU_EXPIRED:通道操作已结束
  2. Icu_ModeType:表示ICU驱动的工作模式

    • ICU_MODE_NORMAL:正常工作模式
    • ICU_MODE_SLEEP:低功耗模式
  3. Icu_ActivationType:表示ICU通道的激活条件

    • ICU_RISING_EDGE:上升沿触发
    • ICU_FALLING_EDGE:下降沿触发
    • ICU_BOTH_EDGES:双边沿触发
  4. Icu_MeasurementModeType:表示ICU通道的测量模式

    • ICU_MODE_SIGNAL_EDGE_DETECT:边沿检测模式
    • ICU_MODE_SIGNAL_MEASUREMENT:信号测量模式
    • ICU_MODE_TIMESTAMP:时间戳模式
    • ICU_MODE_EDGE_COUNTER:边沿计数模式
  5. Icu_SignalMeasurementPropertyType:表示信号测量属性

    • ICU_DUTY_CYCLE:占空比测量
    • ICU_PERIOD_TIME:周期时间测量
    • ICU_ACTIVE_TIME:高电平时间测量
    • ICU_LOW_TIME:低电平时间测量
  6. Icu_TimestampBufferType:表示时间戳缓冲区类型

    • ICU_LINEAR_BUFFER:线性缓冲区
    • ICU_CIRCULAR_BUFFER:循环缓冲区

4.2 配置参数

ICU驱动程序的配置结构主要包括以下几个部分:

  1. Icu_ConfigType:顶层配置结构

    • 包含所有ICU通道的配置指针
  2. Icu_ChannelConfigType:通道配置结构

    • Icu_ChannelId:通道ID
    • IcuMeasurementMode:测量模式
    • IcuDefaultStartEdge:默认起始边沿
    • IcuWakeupCapability:唤醒能力标志
    • 其他通道相关配置
  3. 根据测量模式的不同,每个通道可能包含以下子配置:

    • 边沿检测配置

      • 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驱动程序的初始化流程主要包括以下步骤:

  1. 上层软件(通常是ECU状态管理器)调用Icu_Init(ConfigPtr)函数
  2. ICU驱动程序获取MCU驱动提供的时钟配置
  3. ICU驱动程序配置底层ICU硬件模块
  4. ICU驱动程序将自身状态设置为IDLE
  5. ICU驱动程序禁用所有通知和唤醒功能
  6. 上层软件调用Icu_SetMode(ICU_MODE_NORMAL)将驱动设置为正常工作模式

5.2 信号捕获流程

在正常模式下,ICU驱动程序可以执行多种信号捕获操作。以下是几种典型的操作流程:

  1. 边沿检测操作

    • 上层软件调用Icu_SetActivationCondition()设置边沿触发条件
    • 上层软件调用Icu_EnableNotification()启用通知
    • 当检测到配置的边沿时,ICU硬件触发中断
    • ICU驱动程序调用配置的通知回调函数
    • ICU驱动程序清除中断标志
    • 上层软件可以调用Icu_DisableNotification()禁用通知
  2. 时间戳捕获操作

    • 上层软件调用Icu_StartTimestamp()启动时间戳捕获
    • ICU驱动程序启用时间戳捕获功能并设置通道状态为ACTIVE
    • 当检测到配置的边沿时,ICU硬件触发中断
    • ICU驱动程序记录时间戳到缓冲区并清除中断标志
    • 当缓冲区满时,ICU驱动程序调用配置的通知回调函数
    • 上层软件可以调用Icu_GetTimestampIndex()获取当前索引
    • 上层软件调用Icu_StopTimestamp()停止时间戳捕获

5.3 休眠与唤醒流程

ICU驱动程序支持系统休眠和唤醒功能,其操作流程如下:

  1. 进入休眠

    • 上层软件请求进入休眠模式
    • 上层软件调用Icu_EnableWakeup()启用唤醒功能
    • 上层软件调用Icu_SetMode(ICU_MODE_SLEEP)将驱动设置为休眠模式
    • ICU驱动程序配置ICU硬件进入低功耗状态
  2. 唤醒处理

    • 当配置为唤醒源的ICU通道检测到唤醒信号时,ICU硬件触发唤醒中断
    • ICU驱动程序调用唤醒通知函数通知上层软件
    • 上层软件调用Icu_SetMode(ICU_MODE_NORMAL)将驱动恢复到正常模式
  3. 去初始化

    • 上层软件请求关闭时,调用Icu_DeInit()函数
    • ICU驱动程序复位ICU硬件、禁用所有中断和通知
    • ICU驱动程序将自身状态设置为UNINIT

这些序列图展示了ICU驱动程序与上层软件和底层硬件之间的交互过程,帮助理解模块的工作机制。


6. API接口

6.1 核心功能函数

ICU驱动程序提供了一系列标准化的API函数,用于控制和使用ICU功能。以下是主要API函数及其功能描述:

  1. 初始化和模式控制

    • Icu_Init(const Icu_ConfigType* ConfigPtr):初始化ICU驱动程序
    • Icu_DeInit(void):去初始化ICU驱动程序
    • Icu_SetMode(Icu_ModeType Mode):设置ICU驱动的工作模式
  2. 唤醒控制

    • Icu_DisableWakeup(Icu_ChannelType Channel):禁用通道的唤醒功能
    • Icu_EnableWakeup(Icu_ChannelType Channel):启用通道的唤醒功能
  3. 边沿检测控制

    • Icu_SetActivationCondition(Icu_ChannelType Channel, Icu_ActivationType Activation):设置通道的边沿触发条件
    • Icu_DisableNotification(Icu_ChannelType Channel):禁用通道的边沿通知
    • Icu_EnableNotification(Icu_ChannelType Channel):启用通道的边沿通知
    • Icu_GetInputState(Icu_ChannelType Channel):获取通道的输入状态
  4. 时间戳功能

    • Icu_StartTimestamp(Icu_ChannelType Channel, Icu_ValueType* BufferPtr, uint16 BufferSize):启动时间戳捕获
    • Icu_StopTimestamp(Icu_ChannelType Channel):停止时间戳捕获
    • Icu_GetTimestampIndex(Icu_ChannelType Channel):获取时间戳缓冲区的当前索引
  5. 边沿计数功能

    • Icu_ResetEdgeCount(Icu_ChannelType Channel):重置边沿计数器
    • Icu_EnableEdgeCount(Icu_ChannelType Channel):启用边沿计数功能
    • Icu_DisableEdgeCount(Icu_ChannelType Channel):禁用边沿计数功能
    • Icu_GetEdgeNumbers(Icu_ChannelType Channel):获取已计数的边沿数量
  6. 信号测量功能

    • Icu_GetTimeElapsed(Icu_ChannelType Channel):获取已经过的时间
    • Icu_GetDutyCycleValues(Icu_ChannelType Channel, uint32* DutyCycleValues, uint32* PeriodTime, uint32* ActiveTime):获取占空比相关值
  7. 版本信息

    • Icu_GetVersionInfo(Std_VersionInfoType* VersionInfo):获取ICU驱动程序的版本信息

6.2 通知机制

ICU驱动程序使用回调函数机制向上层软件提供事件通知。根据不同的功能模式,可以配置以下通知回调:

  1. 边沿检测通知:当检测到配置的边沿时触发
  2. 时间戳通知:当时间戳缓冲区满时触发
  3. 边沿计数通知:当边沿计数达到配置的最大值时触发
  4. 信号测量通知:当信号测量完成时触发

通知回调函数在配置阶段定义,例如:

void Icu_EdgeNotification(void) {
    /* 边沿检测通知处理逻辑 */
}

void Icu_TimestampNotification(void) {
    /* 时间戳缓冲区满通知处理逻辑 */
}

通知机制为上层软件提供了一种异步处理ICU事件的方式,避免了轮询导致的CPU资源浪费。


7. 总结

AUTOSAR ICU驱动程序是连接微控制器输入捕获硬件与上层应用软件的关键组件。通过本文的分析,我们了解了ICU驱动程序的架构设计、状态管理、配置结构、操作时序和API接口。

ICU驱动程序的主要特点包括:

  1. 层次化架构

    • 位于ECU抽象层,是AUTOSAR分层架构的重要组成部分
    • 向上提供标准接口,向下访问硬件资源
  2. 状态管理

    • 定义清晰的状态模型和状态转换机制
    • 支持正常和低功耗两种工作模式
  3. 功能多样性

    • 边沿检测功能
    • 时间戳捕获功能
    • 信号特性测量功能
    • 边沿计数功能
    • 系统唤醒支持
  4. 配置灵活性

    • 支持多种通道独立配置
    • 每个通道可配置为不同的工作模式
    • 支持不同的信号激活条件和测量属性
  5. 标准化接口

    • 提供一套完整的API函数
    • 使用回调机制实现事件通知
    • 符合AUTOSAR标准规范

ICU驱动程序在汽车电子系统中发挥着重要作用,尤其是在需要精确测量外部信号特性的应用场景中。通过合理配置和使用ICU驱动程序,可以实现各种信号捕获和测量功能,满足不同的应用需求。

R分层架构的重要组成部分

  • 向上提供标准接口,向下访问硬件资源
  1. 状态管理

    • 定义清晰的状态模型和状态转换机制
    • 支持正常和低功耗两种工作模式
  2. 功能多样性

    • 边沿检测功能
    • 时间戳捕获功能
    • 信号特性测量功能
    • 边沿计数功能
    • 系统唤醒支持
  3. 配置灵活性

    • 支持多种通道独立配置
    • 每个通道可配置为不同的工作模式
    • 支持不同的信号激活条件和测量属性
  4. 标准化接口

    • 提供一套完整的API函数
    • 使用回调机制实现事件通知
    • 符合AUTOSAR标准规范

ICU驱动程序在汽车电子系统中发挥着重要作用,尤其是在需要精确测量外部信号特性的应用场景中。通过合理配置和使用ICU驱动程序,可以实现各种信号捕获和测量功能,满足不同的应用需求。

在实际开发中,需要根据具体的硬件平台和应用需求,正确配置ICU驱动程序的参数,并合理调用其API函数,以充分发挥其功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiGer666

慧眼~施主!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值