在这里插入图片描述

7、AUTOSAR MCAL入门-实战:I/O驱动组

在第三节中有介绍AUTOSARMCAL 抽象分为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和自动驾驶嵌入式相关的文章!")
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐