AutosarMCAL开发——基于EB ICU驱动

1 ICU原理

ICU模块,即Input Capture Unit(输入捕获单元),在汽车电子控制系统中扮演着重要角色。以下是关于ICU模块的详细解析:

一、ICU模块的功能
ICU模块主要用于以下功能:

信号时间测量:能够精确测量输入信号的时间,如PWM(脉冲宽度调制)信号的周期和占空比。
信号边沿检测:检测输入信号的上升沿或下降沿,并可用于触发中断或事件。
边沿/脉冲计数:对信号的边沿或脉冲进行计数,常用于频率测量或计数应用。
时间戳捕获:在信号边沿发生时捕获时间戳,用于精确的时间同步或分析。
唤醒功能:在某些模式下,ICU可以作为唤醒源,当检测到特定信号时唤醒系统。
autosar中对应的功能选项
边沿/脉冲计数:ICU_MODE_EDGE_COUNTER
信号边沿检测:ICU_MODE_SIGNAL_EDGE_DETECT
信号时间测量:ICU_MODE_SIGNAL_MEASUREMENT
时间戳捕获:ICU_MODE_TIMESTAMP
递增接口:ICU_MODE_INCREMENTAL_INTERFACE

二、ICU模块的配置与应用
在AutoSAR或类似架构中,ICU模块的配置通常涉及以下几个方面:

通道配置:为ICU模块分配特定的输入通道,这些通道可以连接到MCU(微控制器)的引脚或内部信号源。
模式选择:根据应用需求选择适当的模式,如信号测量、边沿检测、边沿/脉冲计数或时间戳捕获。
参数设置:设置相关的参数,如分频器、计数器长度、触发条件等,以确保ICU能够正确捕获和处理信号。
中断配置:根据需要配置中断,以便在信号事件发生时能够及时处理。
三、ICU模块的工作原理
ICU模块的工作原理基于精确的时间测量和事件捕获。当输入信号满足特定条件时(如达到某个阈值、发生边沿变化等),ICU会触发相应的操作,如更新计数器、生成中断等。这些操作允许系统对输入信号进行实时分析和处理。

四、ICU模块的应用场景
ICU模块在汽车电子控制系统中有着广泛的应用场景,如:

发动机控制:用于测量点火信号、燃油喷射信号等的周期和占空比,以优化发动机性能。
变速箱控制:用于捕获换挡信号、转速信号等,以实现精确的换挡控制。
车身控制:用于检测各种传感器信号,如车门开关、安全带状态等,以提高车辆安全性和舒适性。
电源管理:用于监控电池电压、电流等参数,以优化电源分配和使用效率。

2 EB配置以及接口应用

EB配置

配置目标
将P22.11配置为TIM5_CH3占空比捕获

EB配置步骤
1.配置GTM时钟
2.ICU通用配置
3.ICU通道配置
4.TIM_Chanel配置
5.Port配置

1.配置GTM时钟
确认GTM模块输入时钟
在这里插入图片描述
配置Cluster0时钟分频以得到输入CMU的时钟源
在这里插入图片描述
配置CMU时钟分频(详细内容参考PWM配置章节)
在这里插入图片描述
CMU输出CMU_CLK时钟分频,保持默认即可
在这里插入图片描述

2.ICU通用配置
在这里插入图片描述
3.ICU通道配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.TIM_Chanel配置
在这里插入图片描述
5.Port配置
在这里插入图片描述

API接口

接口函数调用步骤:
信号测量

  • 1.Icu_17_TimerIp_Init(&Icu_17_TimerIp_Config);//ICU初始化 Icu_17_TimerIp_Config为EB生成配置结构体
  • 2.Icu_17_TimerIp_StartSignalMeasurement();//启动对应ICU通道信号测量功能 其他模式省略此步骤
  • 3.Icu_17_TimerIp_GetDutyCycleValues();//获取通道计数值

边沿计数

  • 1.Icu_17_TimerIp_Init(&Icu_17_TimerIp_Config);//ICU初始化
  • 2.Icu_17_TimerIp_EnableEdgeCount();//启动边沿计数功能
  • 3.Icu_17_TimerIp_GetEdgeNumbers()//获取边沿计数值 Icu_17_TimerIp_ResetEdgeCount()//清楚边沿计数值

边沿检测

  • 1.Icu_17_TimerIp_Init(&Icu_17_TimerIp_Config);//ICU初始化
  • 2.Icu_17_TimerIp_EnableEdgeDetection();//启动边沿检测功能
  • 3.SRC_GTMTIM05.B.SRE = 1;//开启对应通道中断
  • Icu_17_TimerIp_EnableNotification();//开启中断通知函数

时间戳

  • 1.Icu_17_TimerIp_Init(&Icu_17_TimerIp_Config);//ICU初始化
  • 2.SRC_GTMTIM05.B.SRE = 1;//开启对应通道中断
  • 3.Icu_17_TimerIp_StartTimestamp()//启动时间戳功能
  • 4.Icu_17_TimerIp_EnableNotification()//使能中断通知函数
接口名传入参数说明返回参数说明
Icu_17_TimerIp_GetDutyCycleValues()uint8 Channel;Icu_17_TimerIp_DutyCycleType *const DutyCycleValuesICU通道ID;计数buffer(占空比计数值,周期计数值)void-
Icu_17_TimerIp_GetEdgeNumbers()uint8 ChannelICU 通道Icu_17_TimerIp_EdgeNumberType边沿计数值
Icu_17_TimerIp_ResetEdgeCount()uint8 ChannelICU 通道void-

3 总结

本文为博主个人学习总结记录,如有不正,欢迎指正

EB (Embedded Board) 中的 Icu(Integrated Circuit)通常指集成电路,而边沿触发中断可能是特定微控制器或嵌入式系统中的硬件中断机制。在配置这种中断回调函数时,具体的步骤会依赖于你使用的处理器架构以及开发环境,例如Arduino、Keil、FreeRTOS等。 一般来说,你需要做以下几步: 1. **定义回调函数**: 首先,在你的代码中定义一个函数,这个函数将作为中断服务程序(Interrupt Service Routine, ISR)。它应该处理中断发生时需要的任务,比如读取中断源的数据、更新状态变量等。 ```c void ICUTriggerISR(void) { // 在这里编写你的处理逻辑 } ``` 2. **注册中断**:在初始化阶段,通过API或库函数向中断控制器(Interrupt Controller Unit, ICU)申请并设置ICU的中断,指定刚才定义的回调函数作为中断处理函数。 ```c #if defined(BOARD_NAME) InterruptManager::registerICUInterrupt(IcuPinNumber, ICUTriggerISR, INTERRUPT_PRIORITY); #endif ``` 这里的`BOARD_NAME`需要替换为实际的板子名称,`IcuPinNumber`是ICU的中断输入引脚,`INTERRUPT_PRIORITY`是中断优先级。 3. **启用中断**:确保在运行时中断是启用的,并且对应中断源的线路上有正确的连接(如果硬件上有外部信号触发中断的话)。 4. **异常返回处理**:为了保护程序正常流程不受干扰,中断结束后可能需要使用`NO interrupts`指令临时禁用中断,处理完再恢复到正常的中断模式。 完成上述步骤后,每当ICU对应的输入产生边沿触发时,就会自动调用你设定的`ICUTriggerISR`函数。请注意,具体步骤可能会因使用的开发框架、库或处理器的不同而有所差异,务必查阅相关的文档或教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值