MCAL配置8_ICU模块配

文章目录

    • 一、 模块介绍
    • 二、概念
      • 2.1 Active Time 和 Period Time
      • 2.2 Master Bus 频率计算
      • 2.3 测量模式与启动方式
    • 三、配置步骤
      • 3.1 Port模块配置
      • 3.2 MCU模块使能外设时钟
      • 3.3 eMIOS配置
        • 3.3.1 选择eMIOS实体与全局时基
        • 3.3.2 配置Master Bus
      • 3.4 Platform模块中断配置
      • 3.5 ICU 模块配置
        • 3.5.1 General 设置
        • 3.5.2 IcuEmiosChannel配置
        • 3.5.3 IcuChannel 配置
        • 3.5.4 IcuHwInterruptConfigList 配置
    • 四、接口函数及调试
      • 4.1 接口函数
      • 4.2 调试
      • 4.3 注意事项:
    • 小结

一、 模块介绍

ICU 驱动(Input Capture Unit Driver)是 AUTOSAR 基础软件(BSW)中微控制器抽象层(MCAL)的一个关键驱动模块。其核心功能是控制微控制器(MCU)内部的输入捕获单元(ICU)硬件。
该模块通过对特定引脚上的外部数字信号进行测量和捕获,为上层应用程序(如发动机控制、车身控制等)提供精确的时序信息。

ICU模块主要提供以下服务:
ICU 模块主要提供以下服务:

  1. 信号边沿检测与通知:检测输入信号上的上升沿和/或下降沿,并可通过中断或轮询方式通知应用程序。

  2. 信号测量:可以测量信号周期、频率、占空比等,占空比通过测量高电平时间(Active Time)和周期时间(Period Time)来计算占空比 Duty Cycle = (Active Time / Period Time) × 100%。

  3. 边沿计数:统计在指定时间内信号边沿(上升沿、下降沿或两者)发生的次数。

  4. 边沿时间戳捕获:在特定边沿到来时,精确地记录下此时内部计数器的值,用于高精度的时间戳记录。

  5. 中断唤醒:当 MCU 处于低功耗睡眠模式时,可通过 ICU 检测到的特定信号边沿来触发中断,将系统唤醒。

二、概念

2.1 Active Time 和 Period Time

Active Time,激活时间,通常指信号在一个周期内处于高电平或低电平的持续时间,常用于测量脉冲宽度。举例:在测量 PWM 占空比时,Active Time 就是高电平的持续时间。
Period Time,周期,指周期性信号(如 PWM、方波)一个完整周期所占用的时间。即从信号的一个特征边沿(如上升沿)到下一个相同特征边沿之间的时间间隔。

2.2 Master Bus 频率计算

ICU 模块的正常工作需要配置其时钟源,其工作时钟(Master Bus Clock)通常由内核时钟(Core Clock)分频而来。计算公式如下:

Master Bus频率 = CoreClock / ClockDividerValue / DefaultPeriod / MasterBusPrescaler

2.3 测量模式与启动方式

ICU 模块支持多种工作模式,不同模式的启动函数也不同:

测量模式功能描述启动函数
ICU_MODE_SIGNAL_EDGE_DETECT信号边沿检测与通知Icu_EnableEdgeDetection
ICU_MODE_SIGNAL_MEASUREMENT信号测量(周期、占空比)Icu_StartSignalMeasurement
ICU_MODE_EDGE_COUNTER边沿计数Icu_EnableEdgeCount
ICU_MODE_TIMESTAMP边沿时间戳捕获Icu_StartTimestamp

三、配置步骤

ICU 模块的配置涉及 Port、MCU、Mcl、Platform 和 Icu 等多个模块的协同设置。以下是基于 AUTOSAR 标准(以 NXP S32K3xx 为例)的配置流程:

3.1 Port模块配置

将 MCU 的物理引脚功能定义为 eMIOS(增强型模块化 IO 子系统)通道,用于输入捕获。

  • 在 Port 模块配置中,找到与目标捕获信号连接的引脚,将其 PortPinMode 设置为对应的 eMIOS 通道模式(例如
    EMIOS0_CH0 表示 eMIOS 模块 0 的通道 0)。

  • 确保引脚方向设置为输入。

3.2 MCU模块使能外设时钟

在MCU模块配置中,使能 eMIOS 和 ICU 外设的时钟。

3.3 eMIOS配置

配置 eMIOS 外设的工作模式,它是 ICU 的硬件基础。

3.3.1 选择eMIOS实体与全局时基

添加要使用的 eMIOS 模块,使能全局时基,这是 eMIOS 内部计数器工作的基准。

3.3.2 配置Master Bus
- Master Bus Mode Type:必须设置为 MCB_UP_COUNTER(向上计数模式)。这是 ICU 测量时间间隔的基础。
  • Default Period:用于 ICU 的 eMIOS 通道的计数器周期通常需设置为 65535(即 0xFFFF,16 位计数器的最大值)。

  • Emios Channel:此处的通道号配置需与前面Port配置的通道号,以及后续ICU模块中 IcuEmiosChannel 的配置完全对应。

配置项配置值解释
Emios ChannelEMIOS_CH_22指定了 eMIOS0 模块中用于提供 Master Bus 的物理通道。根据芯片手册,通常有一个或多个特定通道可用作 Master Bus,这里使用的是通道 22。
Master Bus Mode TypeMCB_UP_COUNTER必须为此模式。将 Master Bus 配置为向上计数模式。ICU 测量时间间隔依赖于一个单调递增的计数器,这是唯一支持的模式。
Default period65535必须为此值,将 Master Bus 计数器的周期设置为最大值(0xFFFF)。ICU 测量依赖于计数器溢出回绕的行为。如果设置成一个较小的值,在测量高电平或长周期时计数器会提前溢出,导致测量错误。
Master Bus PrescalerDIV_1对输入给 Master Bus 的时钟进行分频。DIV_1 表示不分频。可以根据需要的计时精度和范围调整此值。

3.4 Platform模块中断配置

在Platform模块中,添加并使能对应eMIOS通道的中断。

eMIOS 模块(如 EMIOS0, EMIOS1, EMIOS2)的多个通道会共享一个中断向量,具体分组如下: 通道数与中断服务函数之间的对应关系如下:

eMIOS 模块(如 EMIOS0、EMIOS1、EMIOS2)的多个通道会共享一个中断向量,具体分组如下:
通道数与中断服务函数之间的对应关系如下:

中断服务函数通道数
EMIOSx_0_IRQ20~23
EMIOSx_1_IRQ16~19
EMIOSx_2_IRQ12~15
EMIOSx_3_IRQ8~11
EMIOSx_4_IRQ4~7
EMIOSx_5_IRQ0~3
其中 x 分别对应 0, 1, 2,例如第一行对应 EMIOS0_0, EMIOS1_0, EMIOS2_0。

3.5 ICU 模块配置

3.5.1 General 设置

支持 SAIC 模式:此处使能 SAIC(Smart Advanced Input Capture)模式,关于 SAIC 及其他采集模式,芯片手册有说明。

3.5.2 IcuEmiosChannel配置
  • IcuEmiosModule:选择之前配置的eMIOS 实体单元。
- IcuEmiosChannel:选择具体的eMIOS 通道号,必须与Mcl 和 Port 配置中的通道号一致。
  • IcuEmiosBusSelect:选择该通道的时钟源。可选择内部时钟(即该eMIOS模块自己的Master Bus)或外部Bus(来自其他eMIOS模块的Bus),需严格参照芯片手册进行跨模块配置。

  • IcuSubModeforMeasurement:选择子模式,如果之前在General中使能了SAIC,这里可以选择SAIC模式。否则,根据需求选择其他标准输入捕获模式(如测量脉宽、周期等)。

配置项配置值解释
eMios Channel6指定了使用 eMIOS0 的通道,与 Port 配置中引脚对应。
IcuEmiosBusSelectEMIOS_ICU_BUS_FEmiosBus 类型选择,EMIOS_ICU_BUS_F 代表选择外部全局总线。
IcuEmiosBusRef/Mcl/Mcl/McConfig/EmiosCommon_0/EmiosMcMasterBus_1外部总线引用,与上一项需要对应,指定了具体使用哪个总线。它指向了之前 Mcl 模块中为 eMIOS0 配置的 Master Bus (EmiosMcMasterBus_1)。这是一个 BUS_F 的全局的总线。
IcuSubModeforMeasurementSAIC子模式选择。只有在 General 配置中使能了 IcuSupportSaicMode 后才可选,表明使用 SAIC 功能来处理信号。
IcuEmiosPrescalerEMIOS_PRESCALER_DIVIDE_1通道预分频器,对输入到该通道的时钟进行分频。
IcuEmiosDigitalFilterDIGITAL_FILTER_BYPASSED数字滤波器,设置为旁路,即不使用数字滤波器。输入信号直接进入捕获逻辑。如果信号有毛刺,可以启用滤波器并设置采样周期来滤除噪声。
3.5.3 IcuChannel 配置
  • IcuChannelId:定义逻辑通道 ID,供上层应用软件调用。

  • IcuChannelRef:关联到之前创建的 IcuEmiosChannel,将硬件通道与逻辑通道绑定。

  • IcuMeasurementMode:选择测量模式(如信号边沿检测、信号测量、边沿计数、时间戳等)。

根据选择的 IcuMeasurementMode,双击 name 打开配置具体参数,如激活边沿(上升沿/下降沿)、中断使能、滤波器设置等。例如上图选择的是 SignalMeasurement,下图就双击之后配置 IcuMeasurement 具体
注:此步骤配置完成后,之前 IcuEmiosBusSelect 可能出现的报错通常会消失,因为所有依赖关系都已建立。

配置项配置值解释
IcuChannelId0该逻辑通道 ID。代码中通过这个 ID 来操作特定通道,或者通过这个 channel name。
IcuChannelRef/icu/icu/icuConfigSet/icueMios_2/BS_BLOWER_PWM_FB_IN_1这引用了之前在 IcuEmios_2 容器下创建的名为 BS_BLOWER_PWM_FB_IN_1 的硬件通道配置。这将逻辑通道与硬件资源关联起来。
IcuMeasurementModeICU_DUTY_CYCLE定义了该通道的测量模式,ICU_DUTY_CYCLE 模式会自动测量信号的周期和占空比。
IcuDefaultStartEdgeICU_RISING_EDGE定义测量的起始边沿,这里设置为上升沿。对于占空比测量,通常从一个边沿开始计数。
IcuSignalMeasurementProperty可配置此处可展开以配置信号测量模式下的具体参数,如滤波器、有效边沿等。
IcuTimestampMeasurementProperty可配置此处可展开以配置时间戳模式下的具体参数。虽然当前模式是占空比,但此属性可能仍存在。
IcuWakeupCapabilityNULL_PTR唤醒能力配置。NULL_PTR 表示该通道不用于将系统从低功耗模式唤醒。
3.5.4 IcuHwInterruptConfigList 配置

将 eMIOS 硬件中断与 Icu 驱动层的处理函数关联起来,在此列表中,添加并使能对应 eMIOS 通道的中断。需要指定中断源(与 Platform 配置一致)和 Icu 的中断服务例程。

使能中断:添加并使能使用的通道的中断,当这些 eMIOS 通道发生捕获事件(如边沿到来、计数器溢出)时,硬件会产生中断,并且 ICU 驱动会准备接收和处理这个中断。

四、接口函数及调试

4.1 接口函数

  • Icu_Init
  • Icu_GetDutyCycleValues

4.2 调试

在应用程序中,需要:

  • 调用 Icu_Init() 进行初始化。
  • 调用 Icu_EnableNotification() 使能通知(如果需要)。
  • 调用 Icu_StartSignalMeasurement() 开始测量。
  • 在中断或轮询中获取测量结果。
  • 代码示例:
Icu_DutyCycleType DutyCycleValues_BS_BLOWER_PWM_FB_IN; DutyCycleValues_BS_BLOWER_PWM_FB_IN.ActiveTime = 0; DutyCycleValues_BS_BLOWER_PWM_FB_IN.PeriodTime= 0; Icu_StartSignalMeasurement(BS_BLOWER_PWM_FB_IN_1);//初始化调用 Icu_GetDutyCycleValues(BS_BLOWER_PWM_FB_IN_1, &DutyCycleValues_BS_BLOWER_PWM_FB_IN);//周期调用

4.3 注意事项:

  • 通道一致:确保 Port 引脚 -> Mcl eMIOS 通道 -> IcuEmiosChannel 这三者配置的通道号完全一致。

  • 通道全覆盖:必须在 IcuEmiosChannels 列表中创建并配置所有在Mcl 中已分配的、计划用于 ICU 的 eMIOS 通道,否则代码生成时会报错(提示有通道未被使用)。

  • 时钟配置:确保MCU 模块中 eMIOS 的时钟源已正确配置并启用,Master Bus 的频率计算正确,以满足信号测量的精度和范围要求。

  • 中断:Platform(硬件中断)、IcuHwInterruptConfig(驱动中断绑定)和 IcuChannel(通道中断使能)三个地方的中断配置必须协同工作。

小结

ICU 捕获的工作流程:

  1. 硬件层面:eMIOS0 通道 6 捕获到一个上升沿。
  2. 硬件中断:eMIOS0 外设向中断控制器发出 EMIOS0_CH_6 中断请求。
  3. 中断派发:中断控制器根据 Platform 配置,跳转到 EMIOS0_4_IRQ 这个中断向量。
  4. 驱动处理:AUTOSAR MCAL 生成的 ICU 驱动代码,在 EMIOS0_4_IRQ 这个服务程序里,会检查是哪个具体通道产生的中断。因为它知道你使能了通道 6 的中断,所以它会调用相应的 ICU 驱动内部函数来处理这次捕获事件(例如,记录时间戳、计算占空比)。
  5. 用户回调:如果用户使能了通知函数(Notification),驱动最终会调用用户编写的回调函数,通知信号已经测量完成。