AUTOSAR进阶图解==>AUTOSAR_SRS_OCUDriver

AUTOSAR OCU驱动程序详解

AUTOSAR标准输出比较单元驱动程序架构与实现分析

目录


1. 概述

1.1 OCU驱动程序简介

OCU(Output Compare Unit,输出比较单元)驱动程序是AUTOSAR标准中MCAL(微控制器抽象层)的一部分,提供了对微控制器中输出比较单元的抽象接口。OCU驱动程序使上层软件能够使用标准化的API访问硬件输出比较功能,无需关心具体的硬件细节。

1.2 功能概述

根据AUTOSAR规范文档,OCU驱动程序提供以下核心功能:

  • 比较值控制:允许设置绝对或相对阈值,与自由运行计数器进行比较
  • 通道管理:支持启动和停止OCU通道,控制计数器运行
  • 通知机制:在计数器值等于阈值时提供通知回调
  • 引脚控制:管理输出引脚状态,配置比较匹配时的动作
  • 计数器读取:提供读取自由运行计数器当前值的接口

OCU通道由自由运行计数器、比较阈值和比较匹配动作组成。当计数器值等于阈值时,会执行配置的比较匹配动作,如修改输出引脚状态或触发通知回调。


2. OCU驱动程序架构

2.1 架构图

下图展示了OCU驱动程序在AUTOSAR架构中的位置和与其他模块的关系:

在这里插入图片描述

2.2 层次结构

根据架构图和源文档,OCU驱动程序位于AUTOSAR架构的MCAL层,其层次结构如下:

应用层

  • 应用软件组件:实现特定的应用功能,通过RTE使用OCU驱动提供的服务。

RTE层

  • 运行时环境:连接应用层和基础软件层,提供标准化的通信机制。

BSW层

  • ECU抽象层:对BSW功能提供抽象接口,屏蔽硬件细节。
  • MCAL层:包含OCU驱动程序,直接与硬件交互。
    • OCU驱动程序:提供对OCU硬件的访问接口。
    • 其他MCAL模块:如DIO、PORT等,与OCU驱动协作。
  • 服务层:提供系统服务,用于配置和初始化模块。

硬件层

  • MCU硬件:微控制器硬件平台。
  • OCU硬件单元:实现计数器、比较器和输出功能的硬件单元。

OCU驱动程序的关键职责包括:

  • 初始化和配置OCU通道
  • 启动/停止通道
  • 设置阈值和读取计数器值
  • 配置输出引脚行为
  • 通知上层应用比较匹配事件

OCU硬件单元的功能包括:

  • 自由运行计数器
  • 比较阈值
  • 比较匹配动作
  • 输出引脚控制

3. OCU驱动程序组件设计

3.1 组件图

以下组件图展示了OCU驱动程序的内部结构和接口设计:

在这里插入图片描述

3.2 接口定义

OCU驱动程序包含以下主要功能模块和接口:

初始化模块

  • Ocu_Init:初始化OCU驱动程序,设置硬件寄存器和内部数据结构。
  • Ocu_DeInit:反初始化OCU驱动程序,复位硬件和内部状态。

通道控制模块

  • Ocu_StartChannel:启动指定的OCU通道,允许计数器运行。
  • Ocu_StopChannel:停止指定的OCU通道,禁止计数器运行。
  • Ocu_SetPinState:设置通道关联的输出引脚状态(高/低电平)。
  • Ocu_SetPinAction:配置比较匹配时输出引脚的动作(置高/置低/翻转/禁用)。

通知管理模块

  • Ocu_EnableNotification:启用指定通道的比较匹配通知回调。
  • Ocu_DisableNotification:禁用指定通道的比较匹配通知回调。
  • 通知处理:内部组件,负责处理比较匹配事件并调用回调函数。

计数器管理模块

  • Ocu_GetCounter:读取指定通道计数器的当前值。
  • Ocu_SetAbsoluteThreshold:设置绝对比较阈值。
  • Ocu_SetRelativeThreshold:设置相对比较阈值(相对于当前计数器值或当前阈值)。

配置管理模块

  • 通道配置:管理OCU通道的配置数据。
  • 静态配置:存储来自配置工具的静态配置参数。

这些接口符合AUTOSAR标准,提供了对OCU硬件功能的完整访问。配置参数包括通道ID、计数器最大值、计数器频率/分辨率、默认阈值、通知函数、输出引脚配置和硬件通道分配等。

根据源文档中的SRS_Ocu_00006,OCU驱动程序提供当计数器值等于阈值时的通知功能。通知仅在以下条件满足时触发:

  • 通知功能已配置(非空指针)
  • 通知功能已启用

根据SRS_Ocu_00012,OCU驱动程序还提供设置比较匹配时引脚动作的功能,可能的动作值包括OCU_HIGH、OCU_LOW、OCU_TOGGLE和OCU_DISABLE。


4. OCU驱动程序状态管理

4.1 状态图

下图展示了OCU驱动程序通道的状态转换:

在这里插入图片描述

4.2 状态转换

OCU驱动程序使用状态机管理其生命周期和功能状态。主要状态和转换包括:

未初始化状态 (UNINIT)

  • 驱动程序尚未初始化,无法使用任何功能。
  • 通过调用Ocu_Init()函数转换到初始化完成状态。

初始化完成状态 (INITIALIZED)

  • 驱动程序已初始化,可以使用其功能。
  • 通过调用Ocu_DeInit()函数返回到未初始化状态。
  • 初始化后的特点:
    • 所有通道处于停止状态
    • 所有通知被禁用
    • 输出引脚设置为默认状态

在初始化完成状态下,通道和通知有各自的子状态:

通道子状态

  • 通道停止状态 (IDLE):通道未运行,不会触发比较匹配。
    • 通过调用Ocu_StartChannel()转换到通道运行状态。
  • 通道运行状态 (RUNNING):通道正在运行,可以触发比较匹配。
    • 通过调用Ocu_StopChannel()返回到通道停止状态。
    • 在此状态下可以:
      • 读取计数器值 (Ocu_GetCounter)
      • 设置阈值 (Ocu_SetAbsoluteThreshold/Ocu_SetRelativeThreshold)
      • 设置引脚状态 (Ocu_SetPinState)
      • 设置比较匹配动作 (Ocu_SetPinAction)

通知子状态

  • 通知关闭状态 (NOTIFICATION_DISABLED):不会触发通知回调。
    • 通过调用Ocu_EnableNotification()转换到通知开启状态。
  • 通知开启状态 (NOTIFICATION_ENABLED):可以触发通知回调。
    • 通过调用Ocu_DisableNotification()返回到通知关闭状态。
    • 当通知开启且通道运行时:
      • 在计数器值等于阈值时
      • 触发配置的通知回调函数

根据源文档的SRS_Ocu_00004,初始化OCU驱动程序后,所有通知都应该被禁用,所有通道都应该被停止。如果通道有关联的输出引脚,该引脚将被设置为配置中定义的默认值。

根据SRS_Ocu_00007,OCU驱动程序允许在运行时启用/禁用通知,以防止调用不需要的通知(中断),并允许在软件执行流中选择何时触发第一个或下一个通知。


5. OCU驱动程序数据结构

5.1 配置类图

下图展示了OCU驱动程序的配置数据结构:

在这里插入图片描述

5.2 数据类型定义

OCU驱动程序定义了以下主要数据类型和结构:

顶层配置结构 (Ocu_ConfigType)

  • 包含所有通道配置的容器结构。
  • 属性:
    • ChannelConfigs:指向通道配置数组的指针。
    • NumberOfChannels:配置的通道数量。

通道配置结构 (Ocu_ChannelConfigType)

  • 定义每个OCU通道的特性。
  • 属性:
    • ChannelId:通道的唯一标识符。
    • CounterMaxValue:计数器的最大值。
    • DefaultThreshold:阈值的默认值。
    • HwChannel:分配的硬件通道。
    • NotificationEnable:通知启用状态。
    • NotificationCallback:通知回调函数。
    • DefaultPinAction:比较匹配时的默认引脚动作。
    • DefaultPinState:输出引脚的默认状态。
    • CountDirection:计数方向(向上/向下)。
    • CountResolution:计数器分辨率。
    • HwSpecificConfig:指向硬件特定配置的指针。

引脚状态类型 (Ocu_PinStateType)

  • 定义输出引脚的可能状态。
  • 值:
    • OCU_LOW:低电平。
    • OCU_HIGH:高电平。

引脚动作类型 (Ocu_PinActionType)

  • 定义比较匹配时的可能引脚动作。
  • 值:
    • OCU_SET_LOW:设置为低电平。
    • OCU_SET_HIGH:设置为高电平。
    • OCU_TOGGLE:翻转当前状态。
    • OCU_DISABLE:禁用动作。

计数方向类型 (Ocu_CountDirectionType)

  • 定义计数器的计数方向。
  • 值:
    • OCU_COUNT_UP:向上计数。
    • OCU_COUNT_DOWN:向下计数。

通知类型 (Ocu_NotifyType)

  • 通知回调函数的类型定义。
  • 当比较匹配发生时调用的函数指针。

硬件特定配置 (Ocu_HwSpecificConfig)

  • 包含MCU特定的配置参数。
  • 属性:
    • ClockSetting:时钟设置。
    • DmaEnable:DMA启用状态。
    • HwResourceId:硬件资源ID。
    • PinSelectionValue:引脚选择值。
    • 其他硬件特定配置:取决于具体MCU。

OCU驱动程序接口定义了以下API函数:

  • Ocu_Init:初始化驱动程序。
  • Ocu_DeInit:反初始化驱动程序。
  • Ocu_StartChannel:启动通道。
  • Ocu_StopChannel:停止通道。
  • Ocu_SetPinState:设置引脚状态。
  • Ocu_SetPinAction:设置比较匹配时的引脚动作。
  • Ocu_GetCounter:获取计数器值。
  • Ocu_SetAbsoluteThreshold:设置绝对阈值。
  • Ocu_SetRelativeThreshold:设置相对阈值。
  • Ocu_EnableNotification:启用通知。
  • Ocu_DisableNotification:禁用通知。

根据源文档的SRS_Ocu_00002,OCU驱动程序支持以下基本静态配置:计数器最大值、计数分辨率/频率、通知函数、阈值默认值、分配的硬件通道、通道符号名/ID、计数方向、输出信号和默认输出电平、硬件资源ID以及硬件触发事件。


6. OCU驱动程序使用流程

6.1 序列图

下图展示了OCU驱动程序的典型使用序列:

在这里插入图片描述

6.2 调用流程

OCU驱动程序的使用流程可以分为以下几个阶段:

初始化阶段

  • 应用软件调用Ocu_Init(配置参数)初始化OCU驱动程序。
  • OCU驱动程序初始化硬件寄存器和内部数据结构。
  • 初始化完成后,所有通道停止,所有通知禁用,输出引脚设置为默认状态。

通道配置阶段

  • 应用软件调用Ocu_SetPinState(通道ID, OCU_HIGH/OCU_LOW)设置输出引脚状态。
  • 应用软件调用Ocu_SetPinAction(通道ID, OCU_SET_HIGH/OCU_SET_LOW/OCU_TOGGLE)配置比较匹配时的引脚动作。
  • 应用软件调用Ocu_SetAbsoluteThreshold(通道ID, 阈值)设置比较阈值。
  • 应用软件调用Ocu_EnableNotification(通道ID)启用通知回调。

通道启动阶段

  • 应用软件调用Ocu_StartChannel(通道ID)启动通道。
  • OCU驱动程序启动计数器。

运行阶段

  • 当计数器值等于阈值时,OCU硬件触发比较匹配事件。
  • OCU驱动程序执行配置的引脚动作并调用通知回调(如果已启用)。
  • 应用软件可以调用Ocu_GetCounter(通道ID)读取当前计数器值。
  • 应用软件可以调用Ocu_SetRelativeThreshold(通道ID, 增量值)设置新的相对阈值。

停止阶段

  • 应用软件调用Ocu_StopChannel(通道ID)停止通道。
  • 应用软件调用Ocu_DisableNotification(通道ID)禁用通知回调。

去初始化阶段

  • 应用软件调用Ocu_DeInit()去初始化OCU驱动程序。
  • OCU驱动程序复位硬件寄存器和内部数据结构。

根据源文档中的各项需求,这个使用流程完全符合AUTOSAR OCU驱动程序的设计规范。

/* OCU驱动程序使用示例 */
#include "Ocu.h"

/* 通知回调函数 */
void MyOcuNotification(void)
{
    /* 处理比较匹配事件 */
    /* 例如:更新PWM占空比、触发采样等 */
}

void ApplicationTask(void)
{
    Std_ReturnType result;
    uint8 channelId = OCU_CHANNEL_0;
    Ocu_ValueType counterValue;
    
    /* 1. 初始化OCU驱动程序 */
    result = Ocu_Init(&OcuConfigData);
    if (result != E_OK) {
        /* 处理错误 */
        return;
    }
    
    /* 2. 配置OCU通道 */
    Ocu_SetPinState(channelId, OCU_HIGH);
    Ocu_SetPinAction(channelId, OCU_TOGGLE);
    Ocu_SetAbsoluteThreshold(channelId, 1000); /* 设置比较阈值为1000 */
    Ocu_EnableNotification(channelId);         /* 启用通知回调 */
    
    /* 3. 启动OCU通道 */
    result = Ocu_StartChannel(channelId);
    if (result != E_OK) {
        /* 处理错误 */
        return;
    }
    
    /* 4. 运行阶段 */
    /* ... 应用逻辑 ... */
    
    /* 读取当前计数器值 */
    counterValue = Ocu_GetCounter(channelId);
    
    /* 设置新的相对阈值(当前阈值 + 500) */
    Ocu_SetRelativeThreshold(channelId, 500);
    
    /* ... 更多应用逻辑 ... */
    
    /* 5. 停止OCU通道 */
    Ocu_StopChannel(channelId);
    Ocu_DisableNotification(channelId);
    
    /* 6. 去初始化OCU驱动程序 */
    Ocu_DeInit();
}

7. 总结

AUTOSAR OCU驱动程序提供了对微控制器输出比较单元的标准化访问接口,使上层软件能够以统一的方式使用输出比较功能,而无需关心硬件细节。它的主要特点包括:

  • 标准化接口:符合AUTOSAR标准,提供一致的API。
  • 硬件抽象:屏蔽不同微控制器之间的硬件差异。
  • 灵活配置:支持多种配置选项,适应不同应用需求。
  • 状态管理:提供清晰的状态转换和错误处理。
  • 低资源占用:高效使用系统资源。

OCU驱动程序可用于多种应用场景,包括:

  • 精确定时控制:如PWM生成、脉冲宽度测量等。
  • 事件触发:在特定时刻触发动作或通知。
  • 波形生成:通过控制输出引脚生成特定波形。
  • 传感器接口:配合传感器实现精确计时和测量。

7. 总结

AUTOSAR OCU驱动程序提供了对微控制器输出比较单元的标准化访问接口,使上层软件能够以统一的方式使用输出比较功能,而无需关心硬件细节。它的主要特点包括:

  • 标准化接口:符合AUTOSAR标准,提供一致的API。
  • 硬件抽象:屏蔽不同微控制器之间的硬件差异。
  • 灵活配置:支持多种配置选项,适应不同应用需求。
  • 状态管理:提供清晰的状态转换和错误处理。
  • 低资源占用:高效使用系统资源。

OCU驱动程序可用于多种应用场景,包括:

  • 精确定时控制:如PWM生成、脉冲宽度测量等。
  • 事件触发:在特定时刻触发动作或通知。
  • 波形生成:通过控制输出引脚生成特定波形。
  • 传感器接口:配合传感器实现精确计时和测量。

通过本文对OCU驱动程序架构、组件设计、状态管理、数据结构和使用流程的详细分析,开发者可以更好地理解和使用AUTOSAR OCU驱动程序,为基于AUTOSAR标准的汽车电子系统开发提供支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KaiGer666

慧眼~施主!!!

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

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

打赏作者

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

抵扣说明:

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

余额充值