文章介绍了AUTOSAR MCAL的基础概念,软件架构以及AUTOSAR MCAL规范,拆解介绍了MCAL的相关背景知识。针对特定的芯片平台,文章还介绍了EB tresos工程的新建以及一些常见的tresos操作。
目录
MCAL概述
基本概念
MCAL全称为Microcontroller Abstraction Layer,即微控制器抽象层。顾名思义,作为AUTOSAR分层模型中BSW最底层,它包含可以直接访问所有映射到微控制器地址空间的片内外设与核心寄存器。它具有两方面特点,其一是将芯片相关的初始化配置进行统一的管理,可以通过图形界面配置的方式来生成动态代码。其二是实现并预留了符合AUTOSAR规范的接口,方便上层软件以统一的方式对MCAL进行使用。这两方面特点不仅能使以前需要Coding的开发工作转换为配置,提高开发速度,还可以保证上层软件的标准化和通用性。
软件架构
下图是MCAL的基础软件架构,方便我们先做一些初步的了解:
下面对MCAL各部分模块驱动进行分析。首先我们来看微控制器(核心)驱动
- GPT Driver:GPT(General Purpose Timer)通用定时器驱动模块使用MCU硬件定时器通道,为操作系统或者其他基础软件模块提供计时功能,实现不同周期的任务调用以及操作时间统计等功能。
- WDG Driver:WDG(Watchdog)驱动程序可以提供不同喂狗周期的初始化配置,并提供超时不喂狗重启(软件崩溃)的功能。
- MCU Driver:MCU(Micro Controller Unit)驱动程序提供MCU设置、初始化时钟并完成配置电源模式等。
下面我们来看存储器方面的驱动。
- FLS Driver:FLS (Flash) 驱动程序初始化 FLS并读取/写入FLS。以TC397为例,FLS对DFlash0 Bank完成读取写入擦除等操作。
TC397还有FEE和FlsLoader两部分模块驱动从不同的角度来操作存储器。
下面我们继续来看通信相关的驱动模块。
- SPI Handler/Driver:SPI(Serial Peripheral Interface)SPI驱动模块是微控制器内部同步串行通信接口的驱动,可以配置数据使用SPI驱动的内部缓冲器,或者是由用户提供的外部缓冲器。可以根据硬件属性来定义SPI任务,然后组成任务序列,以优先级排序的方式来传递数据。
- LIN Driver:LIN(Local Interconnected network)是基于UART/SCI(Universal Asynchronous Receiver-Transmitter/SerialCommunication Interface通用异步收发器/串行通信接口)的低成本串行通信协议,该模块完成LIN模块初始化以及收发等操作。
- CAN Driver:CAN驱动主要完成对片内CAN控制器的初始化与使用,完成CANController,CanHardwareObject等配置。
- FlexRay Driver:FlexRay设备驱动程序初始化FlexRay并执行FlexRay输入/输出。
- Ethernet Driver:该驱动模块对所使用的以太网控制器的硬件特性进行了抽象,完成以太网初始化以及收发。
最后我们来了解一下I/O相关的驱动。
- PORT Driver:对芯片的所有I/O口进行初始化,可以配置成通用I/O、模数转换、脉宽调制等功能。对各管脚的具体配置和使用取决于微控制器引脚功能分配。
- DIO Driver:DIO(Digital Input/Output)驱动对微控制器硬件管脚的访问进行了抽象,驱动输出通用I/O口置位或读出输入通用I/O口。
- ADC Driver:ADC(Analog Digital Converter)是片内模拟转数字驱动程序。它提供初始化,启动/停止AD转换,设置AD转换结果缓冲区并读取AD转换结果的功能。
- PWM Driver:PWM驱动为片内PWM模块提供初始化和控制服务,可生成周期和占空比都可变的方波脉冲。
- ICU Driver:ICU(Input Capture Unit)是微控制器的输入捕获单元。它可以对信号边沿进行检测并通知,它还可以测量PWM波形。
每个微控制器都配备了自己的MCAL软件来访问系统 MCU 的片上外设,点击这里即可访问瑞萨芯片官网下载MCAL,英飞凌则需要在官网提交申请进行下载。
AUTOSAR MCAL规范
AUTOSAR MCAL驱动程序软件规范包含MCAL驱动程序需要满足的所有软件要求(包括静态&动态代码)。主要包括了以下几个部分。
- 功能概述:定义模块实现的具体功能,比如定义MCU驱动程序提供基本微控制器初始化、时钟初始化、电源管理模式(低功耗)以及复位等微控制器特定功能。下图说明了MCU驱动规范的范围。
- 依赖关系:定义了此模块与其他模块的依赖关系,下图为模块涉及包含的头文件结构图。
- 功能规范:定义了包括复位、时钟管理的一般功能规范,还定义了包括错误分类,错误检测,错误通知以及调试支持等一系列功能规范。
- API规范:定义了模块包含的数据类型,模块内部的类型定义,函数定义以及预留的接口和API参数检测。下图为Mcu_Init的函数定义。
- 功能时序图:定义用户代码与驱动模块完成特定功能的时序,下图为应用代码与MCU驱动模块间为完成MCU初始化功能所经历的时序图。
- 配置规范:定义了提供给用户进行初始化以及驱动能力配置选项的规范说明,下图定义了驱动是否提供重启接口的配置选项。
MCAL代码分为静态代码以及动态代码,静态的代码为MCAL的核心代码,其提供符合AUTOSAR MCAL软件规范以及微控制器硬件规范的底层驱动程序,可以支持访问微控制器的片内外设。以TC3xx为例,MC-ISAR_AS422_TC3xx_BASIC_1.40.0\McIsar\Src\Mcal\Tricore目录下包含了BASIC部分的驱动静态代码,每个模块都包含对应的.c与.h文件。他们往往不需要用户进行改动。
MCAL的动态代码是通过代码生成工具生成的,代码生成工具需要输入PDF(Parameter Definition File)文件,这种文件以XML编写,通常为.arxml或者.xdm为后缀,定义了配置参数的描述及其最小值和最大值。下面的XML代码定义了McuPerformResetApi配置项的相关参数。
<v:var name="McuPerformResetApi" type="BOOLEAN">
<a:a name="DESC"
value="Pre-processor switch to enable / disable the use of the function Mcu_PerformReset()
TRUE : The function Mcu_PerformReset() is available
FALSE: The function Mcu_PerformReset() not is available"/>
<a:a name="IMPLEMENTATIONCONFIGCLASS"
type="IMPLEMENTATIONCONFIGCLASS">
<icc:v vclass="PreCompile">VariantPostBuild</icc:v>
</a:a>
<a:a name="POSTBUILDVARIANTVALUE" value="false"/>
<a:a name="ORIGIN" value="AUTOSAR_ECUC"/>
<a:a name="SCOPE" value="LOCAL"/>
<a:a name="SYMBOLICNAMEVALUE" value="false"/>
<a:a name="UUID"
value="ECUC:88316ee4-ac23-418d-a433-20ccecc20da2"/>
<a:da name="DEFAULT" value="false"/>
</v:var>
我们一般使用的配置工具是EB-tresos,它导入PDF(选择具体芯片平台)之后能够提供了图形界面(GUI)来供我们进行相关配置,然后最终生成动态代码。
它生成的动态代码包含两个部分,一个部分是与静态代码配合完成底层驱动工作,它们大部分的名称格式为*_PBCfg.c和*_PBCfg.h或者*_Cfg.h。芯片平台会基于Autosar规范,结合硬件平台的实际情况,提供MCAL User Manual以及MCAL Configuration Verification Manual,它们会进一步详细的说明针对此芯片对应的MCAL的方方面面,下图为MCU驱动模块代码文件结构,里边用红色框出的即为动态代码。
EB还会生成以.xdm为后缀的配置文档,保存了当前的配置信息。如下代码所示。
<d:var name="McuPerformResetApi" type="BOOLEAN" value="true"/>
它还生成了以.arxml结尾的ECU描述文件,如果AUTOSAR MCAL驱动程序在不同项目团队中共享,则ECU Desc文件可以充当代码生成工具的输入。下图一份MCAL生成的文件目录。
新建TC3xx EB-tresos工程
首先,使用默认路径或者提前建立好的文件夹路径存放workspace文件。
关闭掉引导文件之后,即可以看到可以看到下图,因为我之前建立(导入)过工程,这里显示了我有两个工程。
选择File-->New-->Configuration Project,建立新的工程。
起一个合法的工程名。
填写ECU_ID以及根据实际情况选择芯片类型,注意勾选Automatically add minimum number of child elements in lists。这样新建的工程会添加一些基本的配置结构,包括Port里各个PIN。
建立好之后就能在Project Explorer中见到我们刚建立好的工程,然后点击选择ECU(CSDN_TC397),右键选择Module Configurations添加驱动模块。
下图添加了MCU模块,选中左边的可选模块中的MCU,然后单击右指的绿色加号摁扭即可完成添加。 删除的的话选中中部已添加的模块,点击右指的红色减号摁扭即可完成删除,最右边可以修改生成代码的路径和使用的xdm文件,如果需要导入已有的模块xdm配置文件,在这里选择点击OK即可。
校验和生成摁扭如下如所示。
如果没有配置项非法或者依赖错误,生成会得到下图。
点击具体的驱动模块,右键可以选择模块使能状态,Disable之后不再生成该模块对应的动态代码。
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。