目录
🌈你好呀!我是 程序猿
🌌 2024感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!
一、MCAL架构简介
MCAL是Micro-Controller Abstraction Layer(微控制器抽象层)的缩写。如下图所示,MCAL位于AUTOSAR软件架构中基本软件(Basic Software,BSW)的底层,是可以直接访问MCU寄存器和内存外设的底层驱动。这样划分的目的是使上层软件(如ECU抽象层、系统服务层等)独立于MCU硬件平台,保证上层软件的标准化和通用性。
![](https://i-blog.csdnimg.cn/direct/efb226314aba4d889c50cd8cd7731203.png)
AUTOSAR规范根据MCU底层驱动功能的相似性,把MCAL抽象为4个驱动组,分别是微控制器驱动组(Microcontroller Drivers Group)、存储器驱动组(Memory Drivers Group)、通信驱动组(Communication Drivers Group)、输入/输出驱动组(I/O Drivers Group)。下图描绘了MCAL这4个驱动组和微控制器内核和外设的映射关系。
![](https://i-blog.csdnimg.cn/direct/fc3ad44651844b41b9f603e1c3e3ade3.png)
二、Microncontroller驱动组
Microncontroller驱动组完成MCU内核及其外设的配置,主要包括MCU驱动(MCU)、看门狗驱动(Watch Dog,WDG)、通用定时器驱动(General Purpose Timers,GPT)。
2.1 MCU驱动
MCU驱动提供微控制器初始化、断电、重启等基本功能,以及MCAL其他驱动模块所需的特殊驱动函数。MCU驱动特性如下:
①初始化MCU时钟、PLL、分频器、时钟树分配等;
②初始化RAM;
③设置MCU低功耗模式;
④设置MCU重启模式;
⑤提供硬件复位源查询。
2.2 WDG驱动
WDG驱动控制MCU内部看门狗定时器,提供触发功能和模块选择服务。AUTOSAR规范定义了3中模式:Fast Mode(快速模式)、Slow Mode(慢速模式)、OFF Mode(关闭模式)。
2.3 GPT模式
GPT驱动初始化、控制MCU内部的通用定时器,用来产生一次性(One-shot)或者连续性(Continuous)的定时通知。GPT驱动通常为操作系统(OS)提供定时服务,或者OS Alarm负担过重时为BSW其他模块提供定时服务。
三、Memory 驱动组
Memory 驱动组提供对片上存储器(内部Flash、内部EEPROM等)的初始化和控制功能,主要包括内部Flash(FLS)、内部EEPROM驱动(EEP)。
3.1 FLS驱动
FLS驱动提供读、写、擦除Flash存储器服务,并且当底层硬件支持写、擦除保护时,FLS驱动提供设置该保护机制的配置接口。通常在ECU的应用程序中,FLS驱动仅在Flash模拟EEPROM时使用,把数据写到FLASH存储器中。在应用程序中,FLS驱动不应该写数据到Flash存储器中,这部分功能是在加载引导(Bootloader)时完成的,加载引导不在AUTOSAR规范讨论范畴内。
3.2 EEP驱动
EEP驱动除提供读、写、擦除EEPROM服务之外,还提供把EEPROM中的数据和内存(如RAM)存储的数据进行比较的功能。
四、Communication 驱动组
Communication驱动组提供对ECU板载通信外设的(如SPI等)的初始化和控制功能,以及对汽车网络的通信外设(如CAN等)的初始化和控制功能,主要包括SPI驱动(SPI)、LIN驱动(LIN)、CAN驱动(CAN)、FlexRay驱动(FR)、以太网驱动(ETH)。
4.1 SPI驱动
SPI驱动提供配置片上SPI外设、通过SPI总线从外部器件读取数据、写入数据到外部器件的服务。除此之外,SPI驱动还提供访问一些特殊SPI器件(如EEPROM、看门狗、I/O专用芯片等)的服务。
4.2 LIN驱动
首先,这里有必要先明确一下LIN驱动的适用范围。LIN驱动只适用于主节点应用(Master Mode),从节点应用(Slave Mode)并没有在LIN驱动中实现,在AUTOSAR MCAL规范中,LIN驱动主节点的行为均符合LIN2.1协议标准,不影响LIN总线的行为逻辑,因此,可以和当前任何LIN驱动从节点通信。另外,LIN驱动适用于SCI/UART硬件模块或者完整的LIN控制器,并不适用于软件模拟UART的实现方式。
LIN驱动直接访问MCU硬件模块,支持在同一个LIN硬件模块里的多通道LIN通信,提供独立的API函数供上层软件调用。AUTOSAR MCAL规范定义由上层的LIN(LIN Interface)模块访问LIN驱动。如下图所示,使用LIN驱动通信的软件分层架构。
![](https://i-blog.csdnimg.cn/direct/cf2001d748854f5d8cb76fadf83b5774.png)
4.3 CAN驱动
与LIN驱动类似,CAN驱动直接访问MCU硬件模块,提供独立的API函数供上层软件调用。AUTOSAR MCAL规范定义有上层的CAN接口(CAN Interface)模块访问CAN驱动。CAN驱动提控制CAN控制器行为和状态机等服务。另外,独立于硬件本身,CAN驱动还提供发起CAN通信、调用上层CAN接口回调函数进行事件通知等服务。
4.4 FlexRay驱动(FR驱动)
芯片厂商根据FlexRay协议标准设计了FlexRay通信控制器(FlexRay Communication Controller,FlexRay CC),而FR驱动则抽象了FlexRay CC的硬件实现,也就是说FlexRay CC的特性都被囊括在FR驱动中。对FlexRay CC一些列的访问被抽象成了统一接口(API),上层软件模块只能通过这些接口来访问FlexRay CC。一个FR驱动可以支持多个FlexRay CC,但这些调用者,FlexRay接口(FlexRay Interface,FrIf)模块与底层FlexRay CC完全独立,而且FR驱动中没有主要功能函数(Main-Function)和中断服务函数(ISR),所有FR驱动的API函数仅在FrIf模块中运行。每个FR驱动都被分配唯一的前缀,FrIf模块通过这些命名规则来访问不同的FlexRay CC。
4.5 以太网驱动(ETH驱动)
在整个以太网协议栈中,ETH驱动的主要任务是给上层模块提供独立于硬件的接口——以太网接口(EthIf)。这个独立于硬件的接口对于所有的以太网控制器(MAC)都是统一的,因此,上层以太网接口以统一行为方式访问底层硬件。以太网驱动提供 对以太网控制器的初始化、设置和数据传输等功能。
一个以太网驱动可以支持多个以太网控制器,但这些以太网控制器必须为同一种硬件实现类型。
五、I/O驱动组
I/O驱动组万策划给你MCU片上一下输入/输出模块的驱动:端口控制(PORT)驱动、数字I/O引脚(DIO)驱动、模数转换(ADC)驱动、PWM驱动、输入捕获(ICU)驱动、输出比较(OCU)驱动。
5.1 PORT驱动
PORT驱动实现片上端口配置和引脚服用的功能,提供配置和初始化MCU所有端口/引脚的服务。例如,将引脚功能配置为通用的I/O、ADC、SPI等。
5.2 DIO驱动
作为DIO驱动使用的引脚首先需要再PORT驱动中配置和初始化,然后才能使用DIO驱动读/写引脚上的逻辑状态。
5.3 ADC驱动
ADC驱动实现初始化、控制MCU内部的ADC模块的功能,可以使能触发源发起模数转换,以及关闭触发源停止模数转换。此外,ADC驱动提供通知机制(Notification)查询模数转换的状态和结果。
5.4 PWM驱动
PWM驱动提供MCU芯片内部PWM模块初始化和控制功能。PWM驱动中定义的PWM通道,都与MCU内部模块的PWM硬件通道对应。PWM驱动能产生可变脉宽的脉冲信号,支持设置占空比和周期。但是,AUTOSAR MCAL规范并未对PWM类型(中心对称PWM、左边对称PWM等)做出规定,PWM类型是由驱动提供商的具体实现方案决定的。
5.5 ICU驱动
ICU驱动完成MCU内部输入捕获模块的功能,用于调节PWM信号、脉冲计数、测量信号周期和占空比、产生普通中断和唤醒中断等。ICU驱动提供如下服务:
①信号边沿检测、产生相应通知;
②唤醒中断控制;
③周期信号测量;
④信号边沿时间戳(用于非周期信号);
⑤边沿计数。
5.6 OCU驱动
OCU驱动完成MCU内部输出比较模块的初始化和控制功能。OCU驱动中定义的软件通道,与MCU内部的输出比较硬件通道对应。当通用计数器的值与预设阙值匹配时,OCU驱动自动做出相应的动作。
一些MCU并没有专门的OCU驱动,是利用通用计数器完成输出比较功能的。在AUTOSAR MCAL规范中,并没有OCU驱动的硬件架构,只定义了参数和用户接口函数,因此,OCU驱动可以用于任何适合的硬件平台。OCU驱动提供如下服务:
①开始、停止通用计数器比较;
②设置比较阙值;
③使能、关闭通知机制;
④获取通用计数器当前值;
⑤改变输出引脚电平状态;
⑥触发其他硬件资源(ADC、DMA等)。
期待批评指正,共同进步~