微控制器抽象层(Microcontroller Abstraction Layer)位于AUTOSAR分层模型中BSW的最底层,MCAL中包含了内部驱动,可以直接访问微控制器和片内外设。另一方面,MCAL又可以分为微控制器驱动(Micrcontroller Drivers)、存储器驱动(Memory Drivers)、通信驱动(Communication Drivers)和I/O驱动(I/O Drivers)四个部分,如下图所示。
微控制器驱动由通用定时器驱动、看门狗驱动、微控制器单元驱动和内核测试四个部分组成。
在AUTOSAR中由两类定时器:操作系统定时器和硬件定时器。该模块使用通用定时器单元的硬件定时器通道,为操作系统或其他基础软件模块提供计时功能。其作用主要有:启动和停止硬件定时器;获取定时器数值;控制时间触发的中断;控制事件触发的中断唤醒。GPT驱动通过 Gpt_StartTimer 和 Gpt_StopTimer函数来启动和停驶定时器通道。目标时间视作Gpt_StartTimer的一个参数,可以为每个计时器通道单独设置。
定时器通道可以设置为单次模式和连续模式。在单次模式下,定时器到达目标时间后会自动停止,保持定时器数值不变且通道状态从“运行”改为“超时”;在连续模式下,定时器到达目标时间后会自动清零并继续运行。
WDG Driver的功能主要是初始化和触发看门狗,WDG Driver分为内部和外部WDG Driver,内部WDG Driver主要负责MCU内部看门狗定时器,提供触发功能和模式选择;外部WDG Driver负责控制外部硬件看门狗。
MCU Driver位于MCAL,可以直接访问微控制器硬件,其主要功能是初始化、休眠、复位微控制器以及提供其他MCAL软件模块所需的与微控制器相关的特殊功能。
MCU Driver能为硬件复位提供软件触发服务,但只有被授权的用户才能调用这个复位服务函数。另外,MCU Driver还能使能并设置MCU时钟,如CPU时钟、外围器件时钟、预分频器等参数。MCU Driver还可以激活MCU的低功耗模式,但低功耗模式的激活会影响微控制器诸多硬件设施。
Core Test模块包含周期性测试和启动测试,其可以对CPU的所有寄存器进行测试,提供中断控制和异常检测,另外,该模块还对算术逻辑单元、存储保护单元和缓存控制器等进行检测。
Core Test模块可以运行在后台或前台模式;在后台模式中,Core Test会被调度机(Scheduler)周期性调用,在当前的原子型序列中(Atomic Sequence)是可中断的,一个完整的测试包含多个原子型序列,以测试内核功能;但在前台模式中,Core Test会被用来测试整个内核或者所选模块的功能。取消后台模式而运行前台模式是允许的,但两种模式不能同时执行。如果在后台任务中有某个前台任务被请求,则后台任务就会被取消而调用前台任务。
存储器驱动由内部EEPROM驱动,内部Flash驱动,RAM测试和Flash测试四部分组成。
该驱动提供初始化服务,以及对内部EEPROM的读、写、擦除等操作。该模块一次只能接受一个任务。
该驱动提供内部Flash初始化服务,以及对内部Flash的读、写、擦除等操作。该驱动还可以将Flash访问代码下载到RAM中,同时也可以进行读、写、擦除等操作。
该模块通过软件对RAM存储进行测试,其包含前台测试和后台测试,其中后台测试(Background RAM Test)是异步服务,前台测试(Foreground RAM Test)是同步服务。
该模块提供算法来对如数据/程序闪存、程序SRAM等非易失性存储器进行测试。测试服务可以在MCU初始化完成后的任意时间进行,用户同样可以选择合适的测试算法。同样,测试服务可以前台或者后台模式下运行,并且被测试的模块可以在前台或后台进行单独配置。
通信驱动由以太网(Ethernet)驱动、FlexRay驱动、CAN驱动、LIN驱动和SPI驱动五部分组成。
该模块为以太网提供统一的接口,对所使用的以太网控制器的硬件特性进行了抽象。该模块使用以太网驱动层访问某些控制器。以太网驱动层由若干个以太网驱动模块组成,如下图所示。
该驱动用来抽象不同的FlexRay通信控制器及其硬件特性。通信控制器的FlexRay协议强制特性经过封装后只能通过统一的API进行访问。API提供了映射到基于实际通信控制器的硬件访问,因此使用FlexRay驱动可以保证FlexRay接口独立于下层硬件。
FlexRay驱动只支持相同类型的FlexRay通信控制器。一个FlexRay接口可以使用一个或多个FlexRay驱动访问若干个通信控制器,某个驱动用来访问某个特定的通信控制器必须在配置FlexRay接口时进行分配。
如果一个通信控制器在FlexRay规范中提供了更多可选择的特性,这些特性被封装在FlexRay驱动驱动里面,配置工具需要支持该通信控制器,从而生成合适的配置。另外,FlexRay驱动的配置应当在系统配置时完成,其API函数在FlexRay接口或操作系统中断服务的上下文中被执行。配置工具可以将ECU配置描述所给的通信矩阵输入转化为运行时所使用的数据结构。
对内部或外部FlexRay通信控制器的驱动需要进行以下处理:FlexRay控制器的初始化;配置数据处理单元;控制指令向通信控制器的传递;从协议引擎到控制器主接口状态数据的规定;通信控制器和主处理机之间信息数据的传输。
CAN驱动针对的是微控制器内部的CAN控制器,其主要实现以下功能:对CAN控制器进行初始化;发送和接收报文;对报文的数据和功能进行通知;溢出和错误处理;唤醒检测。另外,CAN驱动还有以下特性:单个或多个CAN通道;CAN驱动的多重实例化;对接收报文的中断/轮询模式。
CAN驱动是MCAL的一部分,可以执行硬件访问、向上提供独立于硬件的API,而仅有的能访问CAN驱动的上层是CAN接口。CAN驱动也可以为数据传输的初始化和通知接收时间的回调函数提供服务,且该服务独立于硬件。另外,CAN驱动也可以控制从属于同一个CAN硬件单元的CAN 控制器的行为和状态。
LIN驱动使用标准的通用异步收发器(Universal Asynchronous Receiver Transmitter, UART)或者串行通信接口(Serial Communication Interface,SCI)进行通信。该模块主要完成以下任务:LIN硬件的初始化;调度表的处理;LIN报文的发送和接收;唤醒和睡眠;协议差错的处理;报文的超时监测。
LIN驱动支持从简单的SCI/UART到复杂的LIN硬件控制器的整个范围,但不可以使用软件通用异步收发器。LIN驱动是MCAL的一部分,可以执行硬件访问、向上提供独立于硬件的API,而仅有的能访问CAN驱动的上层是LIN接口。
该模块是微控制器内部同步通信串口的驱动,其为SPI总线上不同的设备(如EEPROM、WatchDog)提供读写访问服务。一个SPI设备可以被所使用的SPI硬件和相关的片选信号识别。该模块可以在主、从或者主-从模式下运行。
配置SPI驱动应该遵循以下步骤:选择SPI驱动的功能级别,配置可选择的功能特性;根据数据用途来定义SPI通道;根据硬件属性来定义SPI任务,其会包含一列使用这些属性的通道;最后定义任务序列,以优先级排序的方式来传递数据。
I/O驱动由PORT驱动、DIO驱动、ADC驱动、PWM驱动、ICU驱动、OCU驱动六部分组成。
PORT驱动初始化就是对整个微控制器的PORT模块进行初始化配置。很多端口或管脚能够进行端口复用,比如通用I/O(General Purpose I/O)、模数转换(ADC)、脉宽调制(PWM)等功能。因此各个管脚的具体配置和使用取决于微控制器和ECU的引脚功能分配。
PORT初始化数据应当尽可能高效的写到每个端口,DIO驱动中所用到的端口的配置和初始化都是在PORT驱动模块中完成的,因此在使用DIO驱动模块之前应该先进行PORT驱动模块的初始化。
DIO驱动对微控制器硬件管脚的访问进行了抽象和分组。该模块通过DIO通道(DIO Channel)、DIO端口(DIO Port)以及DIO通道组(DIO Channel Group)来读写数据,并且这些操作都是可以同步的。通道组示意图如下所示。
在DIO驱动中可以把多个DIO通道通过硬件分组来表示一个DIO端口。PORT中的每一位(Bit)都代表一个DIO通道,而DIO通道组是DIO端口中相邻的几个DIO通道的逻辑组合。
ADC驱动对微控制器内部的模数转换单元(Analog Digital Converter Unit)进行初始化和控制,其可以提供启动和停止模数转换的服务,分别用来开启和禁用模数转换的触发源。
ADC驱动在ADC通道(ADC Channel)的基础上进行运作,ADC通道把模拟信号输入管脚、所需的ADC电路以及转换结果寄存器三部分联系为一个整体,使其能够被ADC驱动所控制和访问。另外一个或多个ADC通道可以被划分为一个ADC通道组(ADC Channel Group),而ADC模块允许为每个通道组分配优先级。
ADC驱动模块的两种转换模式:单次转换(One-shot Conversion)是指被转换的通道组中每个通道组只执行一次转换;连续转换(Continous Conversion)是指在转换完成之后整个通道组的转换将会重复而不需要另外的触发事件。
ADC驱动模块的两种触发源:硬件触发(Hardware Event)是指ADC通道组通过硬件事件(如定时器和边沿触发)来启动转换,但只能运行在单次转换模式之下;软件触发(Software API Call)是指ADC通道组通过ADC模块提供的服务来启动或者转换,其可在所有转换模式下使用。
ADC驱动的两种转换结果访问方式:调用API函数 Adc_GetStreamLastPointer;调用API函数 Adc_ReadGroup。
ADC通过以下两种方式保证转换结果的一致性:使用通道组通知机制保证转换结果一致;通过API函数Adc_GetGroupStatus轮询来实现转换结果一致。
PWM驱动为微控制器PWM模块提供初始化和控制服务,可生成周期和占空比可变的脉冲。
ICU驱动控制的是微控制器的输入捕获单元(Input Capture Unit),有两种模式:正常模式(ICU_MODE_NOMAL)和休眠模式(ICU_MODE_SLEEP)。
该模块提供的服务有:信号边沿检测与通知;中断唤醒;周期性信号时间的测量;边沿时间戳捕获;边沿/脉冲计数。
OCU驱动控制的是微控制器的输出比较单元(Output Compare Unit)。当计数器到达某个阈值时,OCU模块会自动比较并进行相应的操作。
OCU通道主要由两部分组成:自由运行计数器(Free Running Counter)和比较阈值(Compare Threshold)。自由运行计数器可以有硬件或者软件提供,每当计数器的值增加一个单位,则该值就会与设定的阈值进行比较。若相等,则会出现两种操作:通过通知函数将信息上报给上层软件或者修改输出管脚的状态。
OCU驱动还提供的服务有:启动或停止输出通道;设定某个阈值;启用或禁止某个通道的通知函数;获取计数器数值。OCU驱动所有的通道都会在调用Ocu_Init()函数时进行初始化,不能通过某个API来单独初始化某个通道,状态图如下所示。