介绍一个MCAL的ICU Driver模块

电子说

1.2w人已加入

描述

**AutoSAR ICU Driver **概述

ICU中文又叫输入捕获单元,在汽车的控制器中具有广泛的用途。AutoSAR中ICU Driver根据需要定义了硬件中所使用的ICU通道,主要用于采集PWM信号,解析计算PWM的周期和占空比;对输入的脉冲信号做计数;同时支持信号中断和唤醒相关的检测机制。

根据ICU主要功能,在AutoSAR架构中主要提供了以下服务:信号边沿检测通知(Signal edge notification);控制唤醒中断处理(Controllingwakeup interrupts);周期信号检测(Periodic signal time measurement);信号高点电平时间计算(Edge time stamping);信号边沿计数(Edge counting)。

在AutoSAR中对于ICU的实现相关的模块主要有Det、MCU、OS、EcuM、Port等模块。其中Det用于在开发过程中检测与ICU相关的错误;MCU模块主要为ICU模块提供基本的时间基准,用于计算输入的ICU信号相关的时间参数;OS模块主要用于提供ICU中断相关的处理函数的调用;EcuM模块主要接受ICU产生的唤醒信号用于对唤醒源有效性检测,从而决定状态切换;Port一般作为复用功能将ICU模块与外部输入的信号关联。

**AutoSAR ICU Driver **基本功能

在AutoSAR中ICU Driver提供了两种模式,分别为Normal模式和Sleep模式,在Normal模式下相关的通知函数有效,而在Sleep模式下只有唤醒相关的事件具备有效性,在Sleep模式下除了唤醒相关的中断其它事件也是不能处理的。 ICU模块对外部PWM的检测的原理是基于MCU模块提供的高频率时钟根据PWM的边沿开始计数,最终通过计数个数和MCU输入的高频率时钟基准得到最终的高低电平时间,从而计算出周期和频率。下面简单对ICU的唤醒模式设置和读取PWM的周期和占空比做介绍。

在使用的ICU唤醒与休眠相关的状态转换时,在进入到Sleep的之前设置唤醒的检测的边沿触发,然后进入到Sleep模式,当外部检测到有效的边沿的时候,在EcuM中会对该唤醒源的有效性做判断,正确的情况下设置ICU进入到Normal模式。下面展示了ICU模块检测到外部上升沿的唤醒源后进入到Normal的过程。对于整个ECU的唤醒功能原理与之类似。如果使能了ICU的唤醒,在检测到唤醒信号后,ECUM模块也可以使整个程序进入到RUN模式(ECUM中从WakeUp到RUN其余的转换条件也满足)。

控制器

控制器

在ICU中其实最常用的功能主要是对PWM信号的占空比和周期的计算。以上升沿作为激活的时间点,以较快的频率在上升沿到来时开始计数,最终数据会保存在ActiveTime和PeriodTime的变量中,调用Icu_GetDutyCycleValues便可将ActiveTime和PeriodTime放入到指定的Buffer中,应用层处理该数据得到占空比和周期。

控制器

ICU Driver API

ICU Driver模块常用的API主要包括以下:

1 ICU_Init:初始化ICU Driver使用的Channel的参数,将值写入到对应的寄存器中,同时ICU模块与Port和MCU密切关联,因此要在这两个模块会根据配置信息初始化与ICU相关的功能。一旦ICU初始化完成,ICU模块进入到Normal模式。
2 Icu_SetMode:设置ICU模块的Mode,Sleep或者是Normal。
3 Icu_Enable/DisableWakeup:使能或者禁用ICU的唤醒功能
4 Icu_SetActivationCondition:用来设置特定的ICU通道是上升沿还是下降沿激活。

5.Icu_GetInputState:得到ICU输入的状态

6.ICU_EnableNotification/ICU_DisableNotification:控制ICU Driver模块要不要使能对Upper Layer的通知功能。

6 Icu_StartTimestamp:开启对特定ICU通道的边沿捕获时间计数。
7 Icu_StartSignalMeasurement:开始对信号进行测量。

8.Icu_GetDutyCycleValues:得到PWM的周期和激活电平的时间,根据该函数可以实现对PWM占空比和周期的计算。

**AutoSAR ICU Driver **配置选项

在实际的配置中ICU模块主要包含三方面的配置,分别是IcuConfigSet Container、IcuGeneral Container以及IcuOptionalApis Container。下面分别对ICU的这三个Container的主要配置选项进行说明。

IcuGeneral Container主要包含了ICU配置的一些General的东西,主要包括:是否支持Det错误追溯功能;是否支持将唤醒发送到EcuM模块;以及对于ICU模块的Partition分配。

控制器

IcuOptionalApis Container主要包含了一些可以供用户使用的API,主要包括以下API,用于可以根据具体的项目需要选择其中的API即可,在使用的时候,有些API是相互关联的,确保相关的API都要使能或者都要禁用。

控制器

IcuConfigSet Container是整个ICU模块配置的核心。在配置中主要包括了六个相关的功能块,如下所示。

控制器

IcuSignalMeasurement:在该功能中主要配置所选的ICU通道在信号测量中作为何种测量方法实现。可以采样周期、占空比、高低电平时间等,根据需要选择即可,同时相关的API也要使能。

IcuChannel:主要给使用的ICU通道分配ID,并且定义该通道是否支持唤醒,以及该通道采用ICU实现的具体功能。特定的ICU通道的功能主要包括边沿计数、信号边沿检测、信号采样、时间采样。信号边沿检测多用于触发或者唤醒相关的,而信号采样在IcuSignalMeasurement可以选择具体的模式。

IcuTimestampMeasurement:定义时间测量采样的是线性Buffer还是环形Buffer,以及相关的通知功能,根据实际需要选择即可。

IcuWakeup:对唤醒功能的支持的情况下关联到EcuM特定的唤醒通道。在发生唤醒事件的时候通知ECUM对唤醒的有效性做判断。

IcuMaxChannel:定义最大支持的ICU通道数。

IcuSignalEdgeDetection:定义对信号边沿检测的通知函数。

对于以上的三个主要方面的配置信息,不同的AutoSAR开发工具可能会有细微的差别,但是万变不离其宗,基本的配置功能就是这些,根据实际的开发环境选择即可。

**TC277 ICU **使用

本人在使用TC277曾做过ICU的捕获PWM输入功能。做ICU捕获PWM的时候,主要是将特定的Port、ICU以及MCU的TIM通道进行相互关联。在TC277中对于Port作为ICU使用的时候可以直接关联到MCU特定的TIM通道,同时该通道作为参考被ICU模块引用。

在ICU将该通道作为ICU_MODE_SIGNAL_MEASUREMENT使用,同时在IcuSignalMeasurementProperty选择ICU_DUTY_CYCLE使用。然后对MCU的特定的时钟做配置,可以选择检测的Filter来优化时钟采样。通过MCU的时钟分配模块为特定的ICU的TIM选择较高频率的时钟用来计算高低电平的时间,在应用层调用Icu_GetDutyCycleValues得到Active Time和Period Time。

根据选择时钟频率和得到的Active Time和Period Time就可获得相应的周期和占空比。在使用的时候要选择合适的采样的触发边沿,否则得到的占空比可能是100%-得到的值,还有就是可能采样中存在Active Time和Period Time读不到的情况,这时候要根据需要选择相应的回调函数或者中断立刻处理数据或者增加相关寄存器的有效性作为判断得到真实的数据。

审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分