EB配置MCAL——OCU篇

前言

在网上搜了一圈资料发现对MCAL层的ocu模块基本没有介绍,想来应该这部分没有icu、mcu、pcm、adc等模块重要吧,刚好安排了个调研任务给我,我主要根据S32G27x和AUTOSAR 4.4.0,具体开发时肯定需要根据需求与其他模块交互使用,这边就当个字典记录一下。
(ps:刚进这个行业,如有不对欢迎指正。)

1. 简介

OCU(Output Compare Unit)模块完成MCU内部输出比较模块的初始化和控制的功能。OCU模块中定义的软件通道,与MCU内部的输出比较硬件通道对应。当通用计数器的值与预设阈值匹配时,OCU模块自动做出相应动作。主要用于生成脉冲宽度调制(PWM)信号、捕捉输入信号的时间和生成定时输出信号。

    由于一些MCU并没有专门的OCU模块,则是使用通用计数器完成输出比较功能。在AUTOSAR MCAL规范中,并没有规定OCU模块的硬件架构,只定义了参数和用户接口函数,因此,OCU模块可以用于任何适合的硬件平台。OCU驱动的作用是对微控制器内部的输出比较单元(Output Compare Unit)进行初始化和控制。当计数器的值到达某个阈值时,OCU模块会自动开始比较并执行相应的操作。

OCU模块可以为下列功能提供服务:
• 开始、停止通用计数器比较;
• 设置比较阈值;
• 使能、关闭通知机制;
• 获取通用计数器当前值;
• 改变输出引脚电平状态;
• 触发其他硬件资源(ADC、DMA)

2. OCU工作原理

     OCU(Output Compare Unit,输出比较单元)是嵌入式系统和微控制器中的一个重要模块,用于精确的时间控制和输出信号的生成。OCU 的工作原理可以分为以下几个关键部分:

2.1 定时器/计数器

OCU 的核心是一个定时器或计数器,其工作原理如下:
• 计数器:计数器会以固定的频率递增(或递减),频率由系统时钟或预分频器决定。
• 时间基准:通过计数器值,可以精确地测量时间或生成特定的时间间隔。

2.2 比较器

OCU 包含多个比较器,这些比较器可以将当前计数器值与预设的阈值进行比较:
• 比较匹配:当计数器值与预设阈值匹配时,比较器会触发一个事件。这些事件可以用来执行特定的动作,如改变引脚状态、触发中断或调用回调函数。
• 绝对阈值:这是一个固定的计数值,当计数器达到该值时触发事件。
• 相对阈值:这是相对于当前计数器值的一个增量,当计数器加上这个增量达到某个值时触发事件。

2.3 引脚控制

OCU 的一个主要功能是控制输出引脚的状态:
• 引脚动作:通过设置比较事件,可以配置在比较匹配时引脚的动作,例如置高、置低或切换状态。
• PWM 生成:OCU 可以通过控制引脚的高低电平生成 PWM(脉冲宽度调制)信号,这在电机控制和亮度调节等应用中非常常见。

2.4 通知机制

OCU 支持事件通知机制:
• 中断或回调:当比较事件发生时,OCU 可以触发中断或调用用户注册的回调函数,以实现实时响应。
• 启用/禁用通知:用户可以根据需要启用或禁用特定通道的通知功能。

2.5 工作流程

一个典型的 OCU 工作流程如下:

  1. 初始化:调用 Ocu_Init() 初始化 OCU 模块并配置计数器、比较器和引脚。
  2. 设置阈值:使用 Ocu_SetAbsoluteThreshold() 或 Ocu_SetRelativeThreshold() 设置比较阈值。
  3. 启用通知:调用 Ocu_EnableNotification() 启用通知功能,注册回调函数以处理事件。
  4. 启动计数器:计数器开始以预定的频率运行,计数值不断变化。
  5. 比较匹配:当计数器值达到预设阈值时,比较事件触发,执行预定的引脚动作和通知机制。
  6. 停止计数器:当不再需要计数或输出时,可以调用 Ocu_DeInit() 去初始化 OCU 模块。

3. MCAL配置与参数解释

3.1 General

在这里插入图片描述

OcuConfigurationOfOptionalApis:表示可选 API 的配置。
OcuDeInitApi :表示从代码中添加/删除服务 Ocu_DeInit()。
OcuGetCounterApi :从代码中添加/删除服务 Ocu_GetCounter()。Ocu_GetCounter() 是一个用于获取当前 OCU(Output Compare Unit)计数器值的函数。
OcuNotificationSupported:从代码中添加/删除服务 Ocu_EnableNotification() 和 Ocu_DisableNotification()。
OcuSetAbsoluteThresholdApi :从代码中添加/删除服务 Ocu_SetAbsoluteThreshold()。Ocu_SetAbsoluteThreshold() 是一个用于设置 OCU(Output Compare Unit)通道的绝对阈值的函数。绝对阈值是指与 OCU 计数器进行比较的具体计数值,当计数器值达到或超过这个阈值时,会触发相应的比较事件。
OcuSetPinActionApi :从代码中添加/删除服务 Ocu_SetPinAction()。Ocu_SetPinAction() 用于配置 OCU 通道在比较事件发生时的引脚动作。
OcuSetPinStateApi :从代码中添加/删除服务 Ocu_ SetPinState ()。Ocu_SetPinState() 用于直接设置 OCU 输出引脚的状态,而不依赖于比较事件。
OcuSetRelativeThresholdApi:从代码中添加/删除服务 Ocu_SetRelativeThreshold ()。 Ocu_SetRelativeThreshold() 用于设置 OCU 通道的相对阈值。相对阈值是相对于当前计数器值的增量,用于在当前计数器值基础上进行比较。
OcuVersionInfoApi :从代码中添加/删除服务 Ocu_GetVersionInfo()。Ocu_GetVersionInfo() 用于获取 OCU 模块的版本信息。
OcuCountdirection :此参数指示整个 OCU 驱动程序的计数方向。注意此功能不支持向下计数。始终默认使用向上计数。
OcuDevErrorDetect :启用开发错误检测的开关。
OcuEnableDualClockMode :在代码中添加/删除服务 Ocu_SetClockMode()。当需要更改预分频器值以在不同频率下保持相同周期时,将调用此函数。
OcuEnableUserModeSupport:启用此参数后,OCU 模块将适应从用户模式运行,具体措施如下: 为 Ftm IP 配置 REG_PROT,以便可以通过 将 REG_PROT_GCR 中的 UAA 位设置为 1 从用户模式访问受保护的寄存器
OcuMulticoreEnabled :切换以启用/禁用多核功能。 用户可以通过选中此选项来选择启用多核功能,这将强制在 OcuChannelEcucPartitionRef 中配置至少 1 个 ECUC 分区,并且 OcuChannel 中的每个 OCU 通道在 OcuChannelEcucPartitionRef 容器中配置至少 1 个 ECUC 分区引用以满足生成代码条件;或者取消选中此选项以禁用多核功能,执行此操作将强制用户删除 OcuChannel 和 OcuChannelEcucPartitionRef 中包含的每个 OCU 通道中的所有 ECUC 分区引用。

3.2 OcuChannel

在这里插入图片描述
OcuChannelId:是一个标识符,用于指定OCU通道的ID。这是与物理OCU硬件通道相关联的一个值。
OcuAssignedHardwareChannel:物理硬件通道,指定逻辑OCU通道在硬件上的具体通道编号。
HwChannel:分配给该逻辑通道的 Ftm 硬件通道。
OcuDefaultThreshold:用于初始化的比较阈值。
OcuHardwareTriggeredAdc:此参数用于允许 OCU 通道在比较匹配时触发 ADC 通道(如果硬件支持)。参数的值表示要触发的 ADC 物理通道。注意 ADC 触发器应通过 MCL 路由,OCU 驱动程序尚未支持。ADC 的硬件触发器可由 PWM 使用
OcuHardwareTriggeredDMA:此参数用于允许 OCU 通道在比较匹配时触发 DMA 通道(如果硬件支持)。参数的值表示要触发的 DMA 物理通道。 注意 OCU 驱动程序尚不支持 DMA 的硬件触发。
OcuMaxCounterValue:OCU 通道的计数器能够计数的最大值(以刻数为单位)。
OcuNotification :用户回调函数。 注意:使用不带引号的 NULL 或 NULL_PTR。如果使用的字符串不同于 NULL 或 NULL_PTR 则它将被用作配置的函数名称。
OcuOuptutPinUsed :有关此通道上输出引脚的使用情况的信息。
OcuOutputPinDefaultState :表示初始化后应设置与通道关联的引脚的状态。
OcuOutputPinAction :表示在比较匹配事件发生后应立即设置与通道关联的引脚的操作。
OcuUseMcuReferencePoint :此参数允许根据配置的 MCU 参考时钟自动计算通道刻度持续时间。如果 OcuUseMcuReferencePoint 设置为 true,则可以从 MCU 中选择时钟源,并可基于该源时钟自动计算 OcuChannelTickDuration。
OcuChannelTickDuration:指定通道计数器的滴答持续时间。此参数是每次计数输入时钟沿(仅上升沿或下降沿)的数量,以使计数器增加一个单位。注意:默认值是使用默认预分频器 1 计算的。对于不同的预分频器值,应将计算值除以所述预分频器值。 并且OCU 通道滴答持续时间的单位为纳秒 (ns)。
OcuMcuClockReferencePoint :将 OCU 通道映射到零个或多个 ECUC 分区,以限制对此通道组的访问。引用的 ECUC 分区是 OCU 驱动程序映射到的 ECUC 分区的子集。

3.3 OcuHWSpecificSettings

在这里插入图片描述

此容器包含 Ocu 特定参数,用于选择时钟源和设置可选预分频器(如果硬件支持)。
OcuHardwareChannelId: OCU硬件通道的通道ID,用于与OcuAssignedHardwareChannel或者OcuChannel进行匹配。
Ftm module:选择平台上可用的一个 Ftm 模块。
OcuClockSource : 如果硬件提供时钟源,则可以静态配置单元的 OCU 驱动程序特定时钟输入以选择不同的时钟源。枚举文字是特定于供应商定义的。
OcuPrescale :可选的 OCU 驱动程序特定时钟预分频因子(如果硬件支持)。具体实现由供应商定义。
OcuPrescale_Alternate:选择此 Ftm 模块使用的输入计数源(时钟)。此参数将由 Ocu_SetClockMode 函数使用。

3.4 OcuHwResourceConfig

在这里插入图片描述

整个平台可用的硬件中断列表。
OCU Resource Name:硬件中断服务例程的 ID 在整个平台范围内可用,并可供 Ocu 模块使用。
OcuIsrEnable: 硬件中断的状态(true - 应在平台范围内启用中断;false - 应在平台范围内禁用中断)。
OcuChannelIsUsed: 此列配置将要使用的硬件通道。(启用更恰当)

3.5 版本信息

在这里插入图片描述此容器包含有关供应商和版本的已发布信息。
ArReleaseMajorVersion :相应实施所基于的 AUTOSAR 规范的主版本号。
ArReleaseMinorVersion: 相应实施所基于的 AUTOSAR 规范的次版本号。
ArReleaseRevisionVersion:相应实施所依据的 AUTOSAR 规范的修订版本号。
ModuleId:来自模块列表的该模块的模块 ID。
SwMajorVersion:模块供应商特定实现的主版本号。编号是供应商特定的。
SwMinorVersion:模块供应商特定实现的次版本号。编号是供应商特定的。
SwPatchVersion:模块供应商特定实现的补丁级别版本号。编号是特定于供应商的。
VendorId:根据 AUTOSAR 供应商列表,此模块的专用实现的供应商 ID。

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值