分享

CP AUTOSAR MCAL IO Driver简介

 新用户82165308 2022-08-14 发布于广东

前言


概述


在CP AUTOSAR 架构设计中和MCU控制器密切相关的模块是MCAL,它在整个CP AUTOSAR 架构中处于软件的最底层,直接负责跟硬件的MCU控制器进行数据交互和控制。

MCAL中的IO Diver模块在CP AUTOSAR中有多个不同的MCU控制器上的外设模块组成,主要包括了DIO、PORT、ADC、PWM、ICU、OCU等模块,通常而言这些IO Driver的模块在实际的芯片中与多个MCU控制器的模块关联,在配置使用的时候,使用者基本也是需要结合MCU芯片的具体模块进行配置的,下面展示了IO Driver模块与AurixTC2xx芯片的主要对应关系。

图片


同时针对这些IO Driver在CP AUTOSAR的ECU抽象层抽象了IoHardwareAbs模块对整个IO Driver模块进行抽象,在CP AUTOSAR架构中MCAL IO Driver以及抽象层的定位如下:

图片


下面针对这些模块分别做具有的介绍。

PORT


CP AUTOSAR 中PORT的配置和使用主要包括:引脚不同功能的定义,也就是我们常说的复用功能,定义Port_Pin作为GPIO使用还是作为ADC或者是CAN等特殊功能使用;引脚方向定义(输入还是输出)、引脚初始值定义、是否支持输入输出方向变化、是否支持复用模式转换功能等;

作为输入时选择上拉还是下拉、作为输出时选择开漏还是推挽输出、是否支持回读功能;未使用到的Port_Pin状态的定义;在CP AUTOSAR 中针对Port_Pin,在使用中的Symbol Name(常见的定义方式PORT_A_PIN_0)定义等。

下图展示了简单的MCU中Port模块的架构图,基本是对PORT的模式、输入输出、复用功能进行设计的。

图片


在使用PORT的时候如果在不同的时刻PORT的输出模式不一样,要根据实际情况选择PORT对应的Mode。

DIO


CP AUTOSAR 中的DIO模块严格依赖于PORT模块,它是对PORT模块中输入输出标记为GPIO模式的Port_Pin的操作。对于Dio的操作提供了三种模式,分别是
1. 对特定的Port_Pin引脚的读写,即Dio_ReadChannel / Dio_WriteChannel;

2. 对多个Port_Pin作为一个Group操作,即Dio_WriteChannelGroup / Dio_ReadChannelGroup;

3. 对于整个PORT的读写操作,即Dio_WritePort/ Dio_ReadPort。

对于DIO的操作,在CP AUTOSAR 架构中必须要经过抽象模块的定义进行封装,将特定的DIO读写封装成具体的控制属性,实现上层APP对功能状态的读取,整个操作如下,通过抽象层根据功能读写实现DIO对应PORT引脚状态的控制和读入。

图片


CP AUTOSAR 中还定义了Dio的ReadBack(回读)功能,但是该功能取决于具体的芯片,如果芯片本身支持,那么就直接读出Pin脚上的电平。对于一些安全性能要求比较高的Pin脚也可以单独从硬件层面加一个Pin作为回读功能使用。

CP AUTOSAR中支持电平反转功能(Dio_FlipChannel),可以实现电平的反转,可以用于模拟PWM使用,也可以在开发阶段结合示波器简单的测量相关函数的调度时间。

ADC


CP AUTOSAR中ADC模块主要支持用于进行模拟量到数字量的转换。在ADC转换中支持两种转换模式,分别为单次转换和连续转换两种模式,单次转换就是一次ADC转换触发后只进行一次转换,而连续转换则是一次触发后一直连续转换,直到调用停止转换命令。

触发ADC的转换源支持软件触发和硬件事件触发两种方式。其中软件触发一般需要手动调用Start函数,软件触发可以实现单次转换模式和连续转换模式。硬件事件触发主要包括定时器定时产生中断触发或者外部检测到边沿信号触发ADC转换,硬件事件作为触发源时,ADC的转换模式只能是单次转换,不支持连续ADC转换。 

对于ADC转换后的结果处理,CP AUTOSAR 支持两个函数Adc_GetStreamLastPointer (用于获得ADC转换结果和有效的转换个数),而Adc_ReadGroup主要将转换结果Copy到用于数据Buffer中。

支持ADC的转换结果存在两种模式,分别为Single模式和Stream模式,其中Single为将一次采样的结果放到指定的采样Buffer中,而Stream支持线性和环形Stream模式,可以将多次采样的结果放到指定的Buffer中。

为了保证转换数据的及时处理可以采用Notification功能将ADC转换后的值立刻通过Notification函数告知上层应用,或者采用Polling模式周期的去Check转换结果状态,通过这两种方式可以快速实现对ADC转换结果的处理。

下图展示了User使能ADC的Notification和硬件触发转换(定时触发、硬件边沿触发)后,等到硬件触发中断到来进行ADC转换,转换完成后产生中断调用Notification函数告诉应用层转换结果。

图片


PWM

CP AUTOSAR 中PWM Driver主要目的是输出周期和占空比,通常在使用的时候PWM模块要和相应的时钟模块关联,例如在Aurix TC2xx系列的单片机中PWM的输出会将相应的输出通道绑定到GTM的ATOM(TOM)通道,通过对ATOM(TOM)特定通道的参数设置输出PWM的周期和占空比。

原理如下,通过设置ATOM(TOM)的CCU0和CCU1的寄存器进行周期和占空的设置,自由运行的计数器CN0与CCU0和CCU1进行比较,进行电平的翻转,输出PWM的周期和占空比。

图片


CP AUTOSAR中 PWM Driver支持PWM的可变周期和占空比输出,固定周期和占空比输出,支持以相关PWM通道为参考输出相反极性的PWM,支持以相关PWM通道为参考输出一定偏移的PWM输出等。支持PWM的占空比为0或者100%等Notification功能,通知Upper layer进行处理。

ICU

CP AUTOSAR 中的ICU的主要主要功能包括:PWM周期和占空比捕获、边沿检测、电平时间测量、边沿数目测量等。在Aurix TC2xx芯片中的ICU是基于GTM的TIM单元对外部输入的信号进行捕获。

下面是TIM通道作为ICU捕获的架构图,对于到来的ICU的信号会和TIM的CH进行关联,在GTM中的TIM的通道就是ICU引脚输入的状态,根据具体的功能可以选择是否进行Filter来过滤ICU输入信号的干扰,ECNT计数器主要用以对边沿计数进行捕获;

SMU主要记录高低电平的时间;最终的高低电平时间通过GPR0和GPR1两个寄存器进行数据的保存,对于GPR0和GPR1的结果可以根据需要选择使用TBU的时钟还是CNT(CNTS)的计数值,最终的结果可以通过轮询或者中断的方式告诉应用层。

图片


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

图片


除了捕获PWM的周期和占空比,还可以使能或者禁用ICU的唤醒功能,用于外部唤醒功能的检测;用来设置特定的ICU通道是上升沿还是下降沿激活:开启对特定ICU通道的边沿捕获时间计数。

OCU

CP AUTOSAR 中的OCU模块主要用于输出比较使用,在实际的应用中该模块使用的比较少。OCU Driver提供了两个比较的元素,其中一个是自由运行的计数器,还有一个是设置阈值的比较器。

当自由运行的计数器的值,达到了比较计数器的设置的阈值的时候,便会触发相应的Action。对于用户来说可以定义一个OCU的Channel,同时选择该Channel的一个计数Tick的时间或者频率(来自于MCU的时钟模块分配到OCU的频率),在Upper Layer定义的特定时间阈值并将其写入到比较计数器中,从而在计数器运行的时间达到比较器的阈值时触发相应的Action。

该Action一般包括两大类:在特定的Port_Pin上输出特定的电平;触发Notification功能,回调执行特定的用于程序(类似于定时中断的功能)。具体的原理如下所示:

图片



I/O Hardware Abstraction

I/O Hardware Abstraction在使用的时候主要处理的是MCAL层的各个模块,I/O Hardware Abstraction可以访问的MCAL层的接口如下所示。

图片


I/O Hardware Abstraction在与MCAL的交互过程中可以调用所有MCAL的API接口,同时可以接收除了DIO和PORT以外的所有模块的回调函数。I/O Hardware Abstraction除了调用MCAL中I/O Driver的模块,同时可以调用Communication的Driver接口,比较常用的就是SPI接口,在使用外部的ADC芯片的时候同时会用到相关的SPI通信协议,这个时候I/O Hardware Abstraction可以直接调用在SPI配置的参数和相关的接口实现对外部ADC芯片的电压采集。如下图所示:

图片


I/O Hardware Abstraction采用的是 CP AUTOSAR Interface与SWC进行数据交互,处理的信号为ECU的Input/Output Signal,在CP AUTOSAR 中Port属于典型的AutoSAR Interface,用于处理ECU的nput/OutputSignal。一般来说ECU信号与一个典型的Pin相互对应。

I/O Hardware Abstraction的实现一般需要EcuAbstractionComponentType的实体,同时建立起相关的Port通过RTE与SWC进行交互,除了定义Port还要定义Runnable以及Internalbehavior等。I/O Hardware Abstraction可以提供SC Port和SR Port进行数据的交互。在SC Port中一般采用Set Operation和Get Operation进行数据操作,也可以采用Notification或者Callback进行操作。

I/O Hardware Abstraction一般包括多个BSW I/O模块,对于每一个BSW模块一般建立一个I/O Hardware Abstraction的实体实现特定的功能。对于特定的功能可以创建调度的函数实现与下层模块的同步,例如可以根据ADC触发转换的时间定义对应的调度函数进行转换数据的读取。

I/O Hardware Abstraction没有具体的配置条目,它的实现主要和SWC的实现相似,在使用的时候根据需要定义相关的函数以及交互的接口,实现对MCAL层I/O相关模块的数据处理。

最常用的功能就是将采集到的原始数据转化为直接可以供SWC使用的数据,如将ADC寄存器的值根据硬件转换电路实现真实的物理数值以及做相关的滤波处理;将从SWC接收的PWM的周期和占空比转换为寄存器中对应的时钟参数输出PWM等。

本期分享就到这里,欢迎大家一起交流学习,如果有不合理的地方也请大家指正,愿和大家一起学习进步,一步步做好汽车电子软件开发。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多