文章目录一、 模块介绍二、概念2.1 Active Time 和 Period Time2.2 Master Bus 频率计算2.3 测量模式与启动方式三、配置步骤3.1 Port模块配置3.2 MCU模块使能外设时钟3.3 eMIOS配置3.3.1 选择eMIOS实体与全局时基3.3.2 配置Master Bus3.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 模块主要提供以下服务信号边沿检测与通知检测输入信号上的上升沿和/或下降沿并可通过中断或轮询方式通知应用程序。信号测量可以测量信号周期、频率、占空比等占空比通过测量高电平时间Active Time和周期时间Period Time来计算占空比 Duty Cycle (Active Time / Period Time) × 100%。边沿计数统计在指定时间内信号边沿上升沿、下降沿或两者发生的次数。边沿时间戳捕获在特定边沿到来时精确地记录下此时内部计数器的值用于高精度的时间戳记录。中断唤醒当 MCU 处于低功耗睡眠模式时可通过 ICU 检测到的特定信号边沿来触发中断将系统唤醒。二、概念2.1 Active Time 和 Period TimeActive Time激活时间通常指信号在一个周期内处于高电平或低电平的持续时间常用于测量脉冲宽度。举例在测量 PWM 占空比时Active Time 就是高电平的持续时间。Period Time周期指周期性信号如 PWM、方波一个完整周期所占用的时间。即从信号的一个特征边沿如上升沿到下一个相同特征边沿之间的时间间隔。2.2 Master Bus 频率计算ICU 模块的正常工作需要配置其时钟源其工作时钟Master Bus Clock通常由内核时钟Core Clock分频而来。计算公式如下Master Bus频率 CoreClock / ClockDividerValue / DefaultPeriod / MasterBusPrescaler2.3 测量模式与启动方式ICU 模块支持多种工作模式不同模式的启动函数也不同测量模式功能描述启动函数ICU_MODE_SIGNAL_EDGE_DETECT信号边沿检测与通知Icu_EnableEdgeDetectionICU_MODE_SIGNAL_MEASUREMENT信号测量周期、占空比Icu_StartSignalMeasurementICU_MODE_EDGE_COUNTER边沿计数Icu_EnableEdgeCountICU_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即 0xFFFF16 位计数器的最大值。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~23EMIOSx_1_IRQ16~19EMIOSx_2_IRQ12~15EMIOSx_3_IRQ8~11EMIOSx_4_IRQ4~7EMIOSx_5_IRQ0~3其中 x 分别对应 0, 1, 2例如第一行对应 EMIOS0_0, EMIOS1_0, EMIOS2_0。3.5 ICU 模块配置3.5.1 General 设置支持 SAIC 模式此处使能 SAICSmart 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_InitIcu_GetDutyCycleValues4.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 捕获的工作流程硬件层面eMIOS0 通道 6 捕获到一个上升沿。硬件中断eMIOS0 外设向中断控制器发出 EMIOS0_CH_6 中断请求。中断派发中断控制器根据 Platform 配置跳转到 EMIOS0_4_IRQ 这个中断向量。驱动处理AUTOSAR MCAL 生成的 ICU 驱动代码在 EMIOS0_4_IRQ 这个服务程序里会检查是哪个具体通道产生的中断。因为它知道你使能了通道 6 的中断所以它会调用相应的 ICU 驱动内部函数来处理这次捕获事件例如记录时间戳、计算占空比。用户回调如果用户使能了通知函数Notification驱动最终会调用用户编写的回调函数通知信号已经测量完成。