AUTOSAR OCU驱动程序详解
目录
- 1. 概述
- 1.1 OCU驱动程序简介
- 1.2 功能概述
- 2. OCU驱动程序架构
- 2.1 架构图
- 2.2 层次结构
- 3. OCU驱动程序组件设计
- 3.1 组件图
- 3.2 接口定义
- 4. OCU驱动程序状态管理
- 4.1 状态图
- 4.2 状态转换
- 5. OCU驱动程序数据结构
- 5.1 配置类图
- 5.2 数据类型定义
- 6. OCU驱动程序使用流程
- 6.1 序列图
- 6.2 调用流程
- 7. 总结
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标准的汽车电子系统开发提供支持。