7、AUTOSAR MCAL入门-实战:I/O驱动组
在第三节中有介绍AUTOSAR
把MCAL
抽象分为4个驱动组,分别为:**微控制器驱动组,存储器驱动组,通信驱动组、输入/输出驱动组。**这一节将具体介绍MCAL
微控制器驱动组的内容。
2.4、I/O驱动组
I/O
驱动组完成MCU
片上以下输入/输出模块的驱动:端口控制(PORT)驱动、数字I/O引脚(DIO)驱动、模式转换(ADC)驱动、PWM
驱动、输入捕获(ICU)驱动、输出比较(OCU)驱动。
2.4.1、PORT 驱动
PORT
驱动实现片上端口配置和引脚复用的功能,提供配置和初始化MCU
所有端口/引脚的服务。如:将引脚配置为通用I/O、ADC、PWM
等。
2.4.1.1、PORT常用的API函数
在AUTOSAR
规范中,PORT
模块的常用接口函数有Port_Init
(初始化PORT驱动模块)、Port_SetPinDirection
(设置引脚输入、输出方向)、Port_RefreshPortDirection
(刷新端口方向配置)、Port_GetVersioninfo
(返回PORT
驱动模块的版本信息)、Port_SetPinMode
(设置引脚模式)等。
PORT
驱动模块初始化必须在MCU驱动模块初始化之后完成,AUTOSAR MCAL
规范给出了初始化PORT
驱动模块的标准调用流程:
2.4.2、DIO驱动
作为DIO
驱动使用的引脚需要先在PORT
驱动中配置和初始化,然后才能使用DIO
驱动/写引脚上的逻辑状态。
2.4.2.1、DIO常用的API函数
在AUTOSAR
规范中,Dio
模块的常用接口函数有Dio_WriteChannel
(写DIO通道状态)、Dio_ReadChannel
(读DIO通道状态)、Dio_FlipChannel
(变换DIO通道状态)等。
①、Dio_Init()
void Dio_Init(const Dio_ConfigType *ConfigPtr);
功能:初始化DIO驱动模块;
参数:const Dio_ConfigType *,由于Dio模块只有Per Compile模式,所以其传入参数必须为NULL_PTR;
返回值:void。
Dio_Init(NULL_PTR);
②、Dio_WriteChannel()
void Dio_WriteChannel(const Dio_ChannelType ChannelId,const Dio_LevelType Level);
功能:设置DIO 通道值;
参数:const Dio_ChannelType,即传入DIO通道Id号;const Dio_LevelType,即传入DIO通道状态值,STD_HIGH为1;STD_LOW为0;
返回值:void。
注意:
配置完DioChannel后,在生成MCAL配置代码过程中会在Dio_Cfg.h文件中通过宏定义(#define)的方式将DioChannel Name与DioChannelId关联起来。
③、Dio_ReadChannel()
Dio_LevelType Dio_ReadChannel(const Dio_ChannelType ChannelId);
功能:读取DIO 通道值;
参数:const Dio_ChannelType,即传入DIO通道Id号;
返回值:Dio_LevelType,即返回当前通道状态,STD_HIGH为1;STD_LOW为0。
④、Dio_FlipChannel()
Dio_LevelType Dio_FlipChannel( const Dio_ChannelType ChannelId);
功能:返回当前通道状态;
参数:const Dio_ChannelType,即传入DIO通道Id号;
返回值:Dio_LevelType,即返回当前通道状态,STD_HIGH为1;STD_LOW为0。
2.4.3、ADC 驱动
ADC
驱动实现初始化、控制MCU
内部的ADC
模块的功能,可以使能触发源发起模数转换,以及关闭触发源停止模数转换。此外,ADC
驱动还提供通知机制查询模数转换的状态和结构。
ADC
驱动在ADC
通道(ADC Channel)的基础上进行。ADC
通道把模拟信号输入引脚、所需的ADC
电路和转换结果寄存器三部分联系成为一个整体,使其能被ADC
驱动所控制与访问。此外,属于同一个ADC
硬件单元(ADC HW Unit)的一个或者多个ADC
通道,可以组成一个ADC
通道组(ADC Channel Group),由同一触发源触发。但一个ADC
通道组必须至少包含一个ADC
通道。
ADC模块支持以下两种转换模式:
①单次转换(One-Shot Conversion):ADC通道组中每个ADC通道只执行一次转换。
②连续转换(Continuous Conversion):在启动转换后,ADC通道组将会自动重复进行转换,而不需要再次触发。
ADC模块可以选择以下两种触发源:
①软件触发(SW-TRIGGER):ADC通道组通过ADC模块提供的服务来启动/停止转换,其可在上述两种转换模式下使用。
②硬件触发(HW-TRIGGER):ADC通道组通过硬件事件(如边沿触发、定时器等)来启动转换,但该方式只能用于单次转换模式。
AUTOSAR MCAL规范中 ADC 驱动模块初始化API的标准调用流程图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dm00dpOX-1683633393234)(E:\1.NXP_AUTOSAR_S32K1X\4.功能说明\3.AUTOSAR-MCAL 架构简介\9.png)]
2.4.3.1、ADC驱动模块常用API函数
①、Adc_Init()
void Adc_Init(const Adc_ConfigType*pConfigPtr);
功能:初始化 ADC 驱动模块;
参数:const adc_ConfigType*;
返回值:void。
②、Adc_SetupResultBuffer()
Std_ReturnType Adc_SetupResultBuffer(Adc_GroupType Group,Adc_ValueGroupType*pDataBufferPtr);
功能:配置结果缓存;
参数:Adc_GroupType和Adc_ValueGroupType*;
返回值:void。
Adc模块有两种转换结果的访问模式,由以下两个接口函数实现:
③、Adc_ReadGroup()
Std_ReturnType Adc_ReadGroup(Adc_GroupType Group,Adc_ValueGroupType*pDataBufferPtr);
功能:读取模数转换通道组最后一轮模数转换的结果,并存入指定的结果缓存指针中;
参数:Adc_GroupType和Adc_ValueGroupType*;
返回值:Std_ReturnType。
④、Adc_GetStreamLastPointer()
Adc_StreamNumSampleType Adc_GetStreamLastPointer(Adc_GroupType Group,Adc_ValueGroupType**PtrToSamplePtr)
功能:获取结果缓存的最后指针;
参数:Adc_GroupType和Adc_ValueGroupType*;
返回值:Adc_StreamNumSampleType。
ADC通道组启动、停止、转换状态回读相关的接口函数:
⑤、Adc_StartGroupConversion()
void Adc_StartGroupConversion(Adc_GroupType Group)
功能:打开模数转换通道组的所有通道进行模数转换;
参数:Adc_GroupType和Adc_ValueGroupType*;
返回值:void。
⑥、Adc_StopGroupConversion()
void Adc_StopGroupConversion(Adc_GroupType Group)
功能:停止模数转换通道组的所有通道进行模数转换;
参数:Adc_GroupType和Adc_ValueGroupType*;
返回值:void。
⑦、Adc_GetGroupStatus()
Adc_StatusType Adc_GetGroupStatus(Adc_GroupType Group)
功能:获取模数转换通道组的状态;
参数:Adc_GroupType;
返回值:Adc_StatusType,有4种状态,即ADC_IDLE、ADC_BUSY、ADC_COMPLETED、ADC_STREAM_COMPLETED。
2.4.4、PWM 驱动
PWM
驱动提供MCU
芯片内部PWM
模块初始化和控制的功能。PWM
驱动定义的PWM
通道,都与MCU
内部模块的PWM
硬件通道对应。PWM
驱动能产生可变脉冲的脉冲信号,支持设置占空比和周期。但是,AUTOSAR MCAL
规范并未对PWM
类型(中心对称PWM
、左边对称PWM),PWM
类型是由驱动提供商的具体实现方案决定的。
2.4.4.1、PWM驱动模块常用API函数
①、Pwm_Init()
void Pwm_Init(const Pwm_ConfigType*ConfigPtr)
功能:初始化 PWM 驱动模块;
参数:const Pwm_ConfigType*;
返回值:void。
②、Pwm_SetDutyCycle()
void Pwm_SetDutyCycle(Pwm_ChannelType ChannelNumber,uint16 DutyCycle)
功能:设置 PWM驱动模块通道的占空比;
参数:Pwm_ChannelType–PWM通道;
uint16–占空比设定值,AUTOSAR规范中规定0x0000对应 0%,0x8000对应100%;
返回值:void。
2.4.5、 ICU 驱动
ICU
驱动完成MCU
内部输入捕获模块的功能,用于调解PWM
信号、脉冲计数、测量信号周期和占空比、产生普通中断和唤醒中断等。ICU
驱动提供如下服务:
①、信号边沿检测、产生相应通知;
②、唤醒中断控制;
③、周期信号测量;
④、信号边沿时间戳(用于非周期信号);
⑤、边沿计数;
2.4.5.1、ICU驱动模块常用API函数
①、Icu_Init()
void Icu_Init(const Icu_ConfigType*ConfigPtr);
功能:初始化 ICU驱动模块;
参数:const Icu_ConfigType*;
返回值:void。
②、Icu_GetDutyCycleValues()
void Icu_GetDutyCycleValues(Icu_ChannelType Channel,Icu_DutyCycleType*DutyCycleValues);
功能:获取ICU通道的值;
参数:Icu_ChannelType和Icu_DutyCycleType*,前者为ICU通道,后者为采样结果缓存结构体,其定义如下:
typedef struct
{
/*<@brief Low or High time value.*/
Icu_ValueType ActiveTime;
/*<@brief Period time value.*/
Icu_ValueType PeriodTime;
}Icu_DutyCycleType;
返回值:void。
2.4.6、OCU驱动
OCU
驱动完成MCU
内部输出比较模块的初始化和控制的功能。OCU
驱动中定义的软件通道,与MCU
内部的输出比较硬件通道对应。当通用计数器的值与预设阈值匹配时,OCU
驱动自动做出相应动作。
由于一些MCU
并没有专门的OCU
驱动,则是使用通用计数器完成输出比较功能。在AUTOSAR MCAL
规范中,并没有规定OCU
驱动的硬件架构,只定义了参数和用户接口函数,因此,OCU
驱动可以用于任何适合的硬件平台。
OCU
驱动提供如下服务:
①、开始、停止通用计数器比较;
②、设置比较阈值;
③、使能、关闭通知机制;
④、获取通用计数器当前值;
⑤、改变输出引脚电平状态;
⑥、触发其他硬件资源(ADC、DMA)
printf("请关注微信公众号:Kevin的学习站,阅读更多关于AUTSAR和自动驾驶嵌入式相关的文章!")