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 模块主要提供以下服务:
信号边沿检测与通知:检测输入信号上的上升沿和/或下降沿,并可通过中断或轮询方式通知应用程序。
信号测量:可以测量信号周期、频率、占空比等,占空比通过测量高电平时间(Active Time)和周期时间(Period Time)来计算占空比 Duty Cycle = (Active Time / Period Time) × 100%。
边沿计数:统计在指定时间内信号边沿(上升沿、下降沿或两者)发生的次数。
边沿时间戳捕获:在特定边沿到来时,精确地记录下此时内部计数器的值,用于高精度的时间戳记录。
中断唤醒:当 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 / MasterBusPrescaler2.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
Default Period:用于 ICU 的 eMIOS 通道的计数器周期通常需设置为 65535(即 0xFFFF,16 位计数器的最大值)。
Emios Channel:此处的通道号配置需与前面Port配置的通道号,以及后续ICU模块中 IcuEmiosChannel 的配置完全对应。
| 配置项 | 配置值 | 解释 |
|---|---|---|
| Emios Channel | EMIOS_CH_22 | 指定了 eMIOS0 模块中用于提供 Master Bus 的物理通道。根据芯片手册,通常有一个或多个特定通道可用作 Master Bus,这里使用的是通道 22。 |
| Master Bus Mode Type | MCB_UP_COUNTER | 必须为此模式。将 Master Bus 配置为向上计数模式。ICU 测量时间间隔依赖于一个单调递增的计数器,这是唯一支持的模式。 |
| Default period | 65535 | 必须为此值,将 Master Bus 计数器的周期设置为最大值(0xFFFF)。ICU 测量依赖于计数器溢出回绕的行为。如果设置成一个较小的值,在测量高电平或长周期时计数器会提前溢出,导致测量错误。 |
| Master Bus Prescaler | DIV_1 | 对输入给 Master Bus 的时钟进行分频。DIV_1 表示不分频。可以根据需要的计时精度和范围调整此值。 |
3.4 Platform模块中断配置
在Platform模块中,添加并使能对应eMIOS通道的中断。
eMIOS 模块(如 EMIOS0、EMIOS1、EMIOS2)的多个通道会共享一个中断向量,具体分组如下:
通道数与中断服务函数之间的对应关系如下:
| 中断服务函数 | 通道数 |
|---|---|
| EMIOSx_0_IRQ | 20~23 |
| EMIOSx_1_IRQ | 16~19 |
| EMIOSx_2_IRQ | 12~15 |
| EMIOSx_3_IRQ | 8~11 |
| EMIOSx_4_IRQ | 4~7 |
| EMIOSx_5_IRQ | 0~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 实体单元。
IcuEmiosBusSelect:选择该通道的时钟源。可选择内部时钟(即该eMIOS模块自己的Master Bus)或外部Bus(来自其他eMIOS模块的Bus),需严格参照芯片手册进行跨模块配置。
IcuSubModeforMeasurement:选择子模式,如果之前在General中使能了SAIC,这里可以选择SAIC模式。否则,根据需求选择其他标准输入捕获模式(如测量脉宽、周期等)。
| 配置项 | 配置值 | 解释 |
|---|---|---|
| eMios Channel | 6 | 指定了使用 eMIOS0 的通道,与 Port 配置中引脚对应。 |
| IcuEmiosBusSelect | EMIOS_ICU_BUS_F | EmiosBus 类型选择,EMIOS_ICU_BUS_F 代表选择外部全局总线。 |
| IcuEmiosBusRef | /Mcl/Mcl/McConfig/EmiosCommon_0/EmiosMcMasterBus_1 | 外部总线引用,与上一项需要对应,指定了具体使用哪个总线。它指向了之前 Mcl 模块中为 eMIOS0 配置的 Master Bus (EmiosMcMasterBus_1)。这是一个 BUS_F 的全局的总线。 |
| IcuSubModeforMeasurement | SAIC | 子模式选择。只有在 General 配置中使能了 IcuSupportSaicMode 后才可选,表明使用 SAIC 功能来处理信号。 |
| IcuEmiosPrescaler | EMIOS_PRESCALER_DIVIDE_1 | 通道预分频器,对输入到该通道的时钟进行分频。 |
| IcuEmiosDigitalFilter | DIGITAL_FILTER_BYPASSED | 数字滤波器,设置为旁路,即不使用数字滤波器。输入信号直接进入捕获逻辑。如果信号有毛刺,可以启用滤波器并设置采样周期来滤除噪声。 |
3.5.3 IcuChannel 配置
IcuChannelId:定义逻辑通道 ID,供上层应用软件调用。
IcuChannelRef:关联到之前创建的 IcuEmiosChannel,将硬件通道与逻辑通道绑定。
IcuMeasurementMode:选择测量模式(如信号边沿检测、信号测量、边沿计数、时间戳等)。
根据选择的 IcuMeasurementMode,双击 name 打开配置具体参数,如激活边沿(上升沿/下降沿)、中断使能、滤波器设置等。例如上图选择的是 SignalMeasurement,下图就双击之后配置 IcuMeasurement 具体
注:此步骤配置完成后,之前 IcuEmiosBusSelect 可能出现的报错通常会消失,因为所有依赖关系都已建立。
| 配置项 | 配置值 | 解释 |
|---|---|---|
| IcuChannelId | 0 | 该逻辑通道 ID。代码中通过这个 ID 来操作特定通道,或者通过这个 channel name。 |
| IcuChannelRef | /icu/icu/icuConfigSet/icueMios_2/BS_BLOWER_PWM_FB_IN_1 | 这引用了之前在 IcuEmios_2 容器下创建的名为 BS_BLOWER_PWM_FB_IN_1 的硬件通道配置。这将逻辑通道与硬件资源关联起来。 |
| IcuMeasurementMode | ICU_DUTY_CYCLE | 定义了该通道的测量模式,ICU_DUTY_CYCLE 模式会自动测量信号的周期和占空比。 |
| IcuDefaultStartEdge | ICU_RISING_EDGE | 定义测量的起始边沿,这里设置为上升沿。对于占空比测量,通常从一个边沿开始计数。 |
| IcuSignalMeasurementProperty | 可配置 | 此处可展开以配置信号测量模式下的具体参数,如滤波器、有效边沿等。 |
| IcuTimestampMeasurementProperty | 可配置 | 此处可展开以配置时间戳模式下的具体参数。虽然当前模式是占空比,但此属性可能仍存在。 |
| IcuWakeupCapability | NULL_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 捕获的工作流程:
- 硬件层面:eMIOS0 通道 6 捕获到一个上升沿。
- 硬件中断:eMIOS0 外设向中断控制器发出 EMIOS0_CH_6 中断请求。
- 中断派发:中断控制器根据 Platform 配置,跳转到 EMIOS0_4_IRQ 这个中断向量。
- 驱动处理:AUTOSAR MCAL 生成的 ICU 驱动代码,在 EMIOS0_4_IRQ 这个服务程序里,会检查是哪个具体通道产生的中断。因为它知道你使能了通道 6 的中断,所以它会调用相应的 ICU 驱动内部函数来处理这次捕获事件(例如,记录时间戳、计算占空比)。
- 用户回调:如果用户使能了通知函数(Notification),驱动最终会调用用户编写的回调函数,通知信号已经测量完成。
