AUTOSAR笔记:ECU级开发MCAL(六)

发布时间 2023-06-07 22:06:42作者: 明明1109

MCAL位于AUTOSAR架构最底层,与MCU内部及外设有关。该层作用:接收上层指令,完成对硬件的直接操作;获取硬件相关状态,反馈给上层,对上层屏蔽硬件相关特征,只提供对应的操作接口。

示例需要用到MCAL中MCU驱动(Microcontroller Unit Driver):GPT驱动(General Purpose Timer Driver);I/O驱动中的PORT驱动、DIO驱动(Digital Input/Output Driver)、ADC驱动(Analog-to-Digital Converter Driver)、PWM驱动(Pulse Width Modulation Driver)、ICU驱动(Input Capture Unit Driver);通信驱动中的CAN驱动(CAN Driver)。

MCAL配置工具入门

NXP、Elektrobit(EB)公司合作开发了针对MPC5744P MCAL的配置工具及代码。配置工具基于EB tresos Studio平台,MCAL代码由NXP提供。

MCAL配置工具安装

包含EB Tresos Studio工具安装、MPC5744P MCAL代码包安装。按默认操作安装即可,过程略。

MCAL配置方法、常用接口函数

Mcu模块

MCU驱动位于MCAL,可以直接访问MCU硬件,提供MCU初始化、复位、休眠等功能。

MCU驱动可以使能时钟,设置相关参数,如CPU时钟、锁相环(PLL)、外设时钟、预分频器等参数。

1)McuGeneral配置
主要对Mcu模块整体功能的配置:


①Mcu Development Error Detect:Mcu模块开发错误检测使能。
②Mcu Get Ram State API:获取RAM状态API使能。
③Mcu Init Clock API:初始化API使能。
④Mcu No PLL:锁相环禁用。
⑤Mcu Enter Low-Power Mode:进入低功耗模式使能。
⑥Mcu Perform Reset API:执行复位API使能等。

2)McuResetReasonConf配置
在ECU中,有很多原因可能导致MCU复位,Mcu可以获取复位的原因。McuResetResoneConf配置可以添加不同的Mcu复位原因:点击”+“Add new element with default values,添加:

3)McuModuleConfiguration配置

McuModuleConfiguration配置较复杂。
McuModuleConfiguration>General配置中Extern Crystal Frequency为外部晶振频率,硬件平台为MCP5744P,外部晶振频率40MHz,如下图:

McuModuleConfiguration>McuClockSettingConfig是MCU时钟配置,是Mcu模块配置的重难点(可参考MPC5744P 手册的Clock generation)。点击”+“Add new element with default values,添加McuClockSettingConfig配置,如下图:

双击McuClockSettingConfig Index,进入下图配置界面:

McuClockSettingConfig模块,主要针对MPC5744P Clock generation各模块。
McuClockSettingConfig>General 主要配置:
①System Clock Frequency:系统时钟频率,200MHz。
②System Clock Select:系统时钟源选择,可选内部晶振(IRC)、外部晶振(XOSC)、锁相环0(PLL0_PH1)、锁相环1(PLL1_PH1)。这里选PLL0_PH1。

由于使用PLL0_PH1,所以可以切换到McuPll_0进行锁相环0相关配置:

配置系统时钟、PLL后,需要对MPC5744P Clock generation右侧分频后的输出时钟进行配置,如ADC_CLK、PBRIDE0_CLK等。可以先定义McuClockReferencePoint,即对项目中使用到的时钟进行全局的配置,从而可将外设时钟通过McuClockReferencePoint与其他BSW模块联系起来:

之后,对上述各时钟涉及的AUX Clock Selector进行配置。
以AUX Clock Selector0为例,其时钟源为PLL0_PHI,通过它可分频给MOTC_CLK、SGEN_CLK、ADC_CLK。如下图,McuAuxiliaryClock0Divider0为分频器0,是给MOTC_CLK用的。

其中,主要配置项如下:
①Auxiliary Clock0 Divider0 Frequency:分频后的频率,此处MOTC_CLK需要50MHz,与McuClockReferencePoint_MC_CLK对应。
②Auxiliary Clock0 Divider0 Enable:分频使能。
③Auxiliary Clock0 Divisor0:分频系数,此处由PLL0_PHI的200MHz分频50MHz,所以分频系数4。

4)Mcu模块初始化相关函数
Mcu模块配置完成后,在实际使用中,需要对Mcu模块进行初始化。其初始化过程流程如下:
Mcu_Init;
Mcu_InitClock;
Mcu_GetPllStatus(若使用PLL,直到PLL锁相环配置成功);
Mcu_InitRamSection(按具体需求,可不调用);

Gpt模块

GPT驱动使用通用定时器单元的硬件定时器通道,为OS或其他BSW提供计时功能:启动和停止硬件定时器、得到定时器数值、控制时机触发的中断、控制时间触发的中断唤醒等功能。

GPT通道可设为连续模式(CONTINUOUS)或单次模式(ONESHOT)。

①连续模式:定时器到达目标时间会自动清零并将继续运行;
②单次模式:定时器到达目标时间,即计数值达到设定值时,定时器会自动停止,保持计数值不变,且通道状态从”运行“变为”超时“。

1)Gpt General 配置
主要对Gpt模块整体功能的配置,如下图:

①GptDeiniitApi
②GptEnableDisableNotificationApi
③GtpTimeRemainingApi
④GptWakeupFunctionalityApi等

2)GptChannelConfigSet 配置
切换到GptChannelConfigSet界面>点击”+“Add new element with default values,添加GptChannelConfigSet(下图左);双击GptChannelConfigSet_0 Index进入GptChannelConfiguartion配置界面(下图右):

示例使用GPT通道为OS提供计时功能,所以添加一个GptChannel,如下图:

各配置项意义:
①GptChannelId:Gpt通道号Id。
②GptHwChannel:Gpt硬件通道,其中,基于3个eTimer(Enhanced Motor Control Timer)模块有18个通道,基于STM(System Timer Module)有4个通道,基于PIT(Periodic Interrupt Timer)有4个通道。示例使用STM_0_CH_0。
③GptChannelMode:Gpt通道模式,如前所述分为连续模式(CONTINUOUS)、单次模式(ONESHOT)。示例使用连续模式。
④GptChannelTickFrequency:Gpt通道频率,其中以Tick为计数单位。
⑤GptChannelClkSrcRef:Gpt通道时钟源参考,需要引用GptClockReferencePoint。
⑥GptStmPrescaler(_Alternate):基于STM分频。
⑦GptEtimerChannelClkSrc(_Alternate):基于eTimer分频。
⑧GptChannelTickValueMax:最大计数值。
⑨GptFreezeEnable:硬件资源冻结使能。
⑩GptEnableWakeup:Gpt通道唤醒使能。
⑪GptNotifcation:Gpt通知函数,即定时器到达设定值将调用到该函数。

3)GptClockReferencePoint配置
GptClockReferencePoint界面中,点击”+“Add new element with default values,添加GptClockReferencePoint,需要先引用先在Mcu模块中定义的McuClockReferencePoint,如下图:

4)Gpt模块常用接口函数

Gpt模块使用过程中需要初始化、使能Gpt通知函数,并且开启Gpt通道。Gpt通知函数名虽然已配置,但需要自行实现函数。
①Gpt_Init:

void Gpt_Init(const Gpt_ConfigType *configPtr);

②Gpt_EnableNotification:

void Gpt_EnableNotification(Gpt_ChannelType channel);

③Gpt_StartTimer:

void Gpt_StartTimer(Gpt_ChannelType channel, Gpt_ValueType val);

示例使用Gpt通道使用连续模式,所以Gpt通道只需要初始化一次。当计数值到达设定值时,将自动清零,重新开始计数。这里将其作为OS时钟源,即OS的Tick。GptNotification配置项所定义的函数Gpt_Cbk_ProcessOsCounter(),具体实现如下:

Gpt_Init(&GptChannelConfigSet_0);
Gpt_EnableNotification(GptConf_GptChannelConfiguration_OsCounter);
Gpt_StartTimer(GptConf_GptChannelConfiguration_OsCounter,OSCYCLESPERSECOND);

void Gpt_Cbk_ProcessOsCounter(void)
{
  IncrementCounter(Rte_TickCounter); /* OS接口, 产生Tick */
}

Port模块

PORT驱动(PORT Driver)主要针对MCU的PORT模块进行初始化配置。由于MCU引脚存在复用,如MPC5744P A[0]引脚如下图,可用作GPIO、SPI等。因此,需要根据应用对引脚属性进行相关配置。

Port模块主要针对MCU各引脚属性的配置,可配置的参数包括引脚的方向(输入/输出)、引脚的工作模式、引脚的初始值、内部上拉等。

1)Port General配置
主要对Port模块整体功能的配置:

①Port Development Error Detect:Port模块开发错误检测使能。
②Port SetPinDirection Api:Pin方向设置API使能。
③Port SetPinMode Api:Pin模式设置API使能等。

2)PortConfigSet配置
PortConfigSet菜单主要针对MCU引脚属性的定义,可以点击”+“Add new element with default values,添加Port配置:


双击PortConfigSet_0 Index可进入如下图所示的PortConfigSet界面:

①PortConfigSet>General:可针对未使用的Pin模式进行全局配置(如上图);
②PortConfigSet>PortContainer:可配置所使用的Pin的一些属性;

当切换到PortContainer界面后,点击”+“Add new element with default values添加Port,如下图左;双击一个Port Index,添加Pin,如下图右:

双击PortPin Index可进入PortPin属性界面,如下图:

①PortPin Wpe:Enable Weak Pull Up/Down,内部上拉/下拉使能。
②PortPin Wps:在勾选PortPin Wpe的情况下,勾选PortPin Wps代表开启内部上拉,未勾选PortPinWps代表内部下拉。
③PortPin Ode:开漏(Open-Drain)输出使能。
④PortPiin Safe Mode:安全模式使能。
⑤PortPin With Read Back:回读功能使能。
⑥PortPin Hysteresis Control:输入迟滞使能。
⑦PortPin Direction Changeable:引脚方向可变使能。
⑧PortPin Mode Changeable:引脚模式可变使能。
⑨PortPin Id:引脚的Id号。
⑩PortPinPcr:描述引脚的PCR(Port Configuration Register)。
⑪PortPin Direction:定义引脚方向,输入(PORT_PIN_IN)、输出(PORT_PIN_OUT)、输入输出(PORT_PIN_INOUT)。
⑫PortPin Initial Mode:定义引脚初始模式,默认为GPIO。
⑬PortPin Mode:定义引脚模式。
⑭PortPin Level Value:定义引脚初始化电平。
⑮PortPin Output Slew Rate:定义引脚电压转换速率。

3)Port模块初始化函数介绍
当Port模块配置完成后,在实际使用中,需要对Port模块进行初始化。

void Port_Init(const Port_ConfigType *ConfigPtr);

Dio模块

DIO驱动(Digital Input/Output Driver)对MCU引脚的访问进行了抽象,并且还可以对引脚进行分组。DIO驱动对MCU引脚的数据读写操作都是同步的。

AUTOSAR中,将一个MCU数字I/O引脚(Pin)定义为DIO通道(DIO Channel);可把若干个DIO通道通过硬件分组成为一个DIO端口(DIO Port)。DIO端口中,相邻的几个DIO通道的逻辑组合,称为DIO通道组(DIO Channel Group),在配置过程中,可以设置寄出去bit屏蔽值、位偏移等,从而对多个I/O引脚同时读写。

Dio模块涉及DIO Channel,即MCU 引脚(Pin),如果要正常使用,必须在Port模块中对该引脚进行属性配置,即配置为GPIO(General Purpose I/O)模式。

1)Dio General配置
Dio General配置主要对Dio模块整体功能的配置,如下图:

①Dio Development Error Detect:Dio模块开发错误检测使能。
②Dio Read Zero For Undefined Port Pins:读取未定义引脚值为0等。

2)DioConfig配置
切换至DioConfig界面,点击”+“Add new element with default values添加Dio配置,如下图左。双击DioConfig_0 Index,进入下图右所示DioPort配置界面:

双击DioPort Index,每个DioPort配置有3项:
①DioPort>General:为当前DioPort设定一个Dio Port Id。工具规定,对于MCU PortA=0、PortB=1...PortI=8、PortJ=9,如下图左。
②DioPort>DioChannel:点击”+“添加DioChannel,即DIO通道;这里Dio Channel Id是基于Dio Port Id,如Dio Port Id为0,Dio Channel Id为0,则表示引脚PA[0],依此类推。如下图右,为A车灯配置,通过数字输出DO直接控制车灯的亮灭。

3)Dio模块常用接口函数介绍

在AUTOSAR规范中,Dio模块的常用接口函数:Dio_WriteChannel(写DIO通道状态)、Dio_ReadChannel(读DIO通道状态)、Dio_FlipChannel(交换DIO通道状态)等。

下面结合A车灯初始化与IOAbstractionSWC与Dio模块相关的具体实例进行讲解。

①Dio_Init()

void Dio_Init(const Dio_ConfigType *ConfigPtr);

②Dio_WriteChannel()

/**
 @param ChannelId DIO通道Id号
 @Level 传入DIO通道状态值, STD_HIGH为1, STD_LOW为0
*/
void Dio_WriteChannel(const Dio_ChannelType ChannelId, const Dio_LevelType Level);

设置灯状态可以实现如下:

FUNC (void, IOAbstractionSWC_CODE) RE_SetLightState 
(VAR(UInt8, AUTOMATIC) DESetLightState)
{
  /* --------------------------------------Server Call Point -------------------------------- */
  Dio_WriteChannel(DioConf_DioChannel_Do_FrontLight,DESetLightState);
}

注意:配置完DioChannel后,生成MCAL配置代码过程中,会在Dio_Cfg.h文件中通过宏定义(#define)的方式将DioChannel Name与DioChannelId关联起来。例如:

#define DioConf_DioChnanel_Do_FrontLight((uint8) 0x03U)

③Dio_ReadChannel()

Dio_LevelType Dio_ReadChannel(const Dio_ChannelType ChannelId);

读取灯状态实现如下:

FUNC (void, IOAbstractionSWC_CODE) RE_GetButtonState
(CONSTP2VAR (UInt8, AUTOMATIC, RTE_APPL_DATA)DEGetButtonState)
{
  /* --------------------------------------Server Call Point -------------------------------- */
  *DEGetButtonState = Dio_ReadChannel((Dio_ChannelType) DioConf_DioChannel_Din_FrontLightSwitch);
}

④Dio_FilipChannel()

Dio_LevelType Dio_FlipChannel(const Dio_ChannelType ChannelId);

Adc模块

ADC驱动是在ADC通道(ADC Channel)基础上进行的,将模拟信号输入引脚、所需的ADC电路和转换结果寄存器三部分联系成一个整体,使其能被ADC驱动所控制与访问。

ADC:模拟量=>数值量

一个ADC硬件单元(ADC HW Unit)通常包含一个或多个ADC通道,可组成一个ADC通道组(ADC Channel Group),由同一触发源触发。

ADC模块支持以下两种转换模式:
①单次转换(One-Shot Conversion):ADC通道组中,每个ADC通道只执行一次转行。
②连续转换(Continuous Conversion):在启动转换后,

ADC可以选择两种触发源:
①软件触发(SW-TRIGGER):ADC通道组通过ADC模块提供的服务,来启动/停止转换,其可在上述两种转换模式下使用。
②硬件触发(HW-TRIGGER):ADC通道组通过硬件事件(如边沿触发、定时器)来启动转换,但该方式只能用于单次转换模式。

1)Adc General配置

Adc General配置主要是对Adc模块整体功能的配置,如下图:

①Adc Development Error Detection:Adc模块开发错误检测使能。
②Adc_ReadGroup API:读取ADC通道组API使能。
③Adc_StartStopGroup API:ADC通道组转换启动/停止API使能。
④Adc Priority Mechanism:ADC优先级机制选择。
⑤Adc Priority Mechanism:ADC优先级机制选择。
⑥Adc Result Alignment:ADC转换原始结果对齐方式选择。
⑦Adc Max Qeueu Depth:ADC转换请求队列最大长度等。

2)AdcConfigSet配置

切换至AdcConfigSet界面>点击”+“Add newelement with default values添加Adc配置,如下图左:

双击AdcConfigSet_ADC0 Index,可进入上图右所示AdcHwUnit配置界面 > 点击”+“可新建AdcHwUnit配置。MPC5744P有4个ADC单元:ADC_0、ADC_1、ADC_2、ADC_3。A车灯用到ADC_0,这里新建一个AdcHwUnit。

双击AdcHwUnit_0 Index,可以对ADC硬件单元进行配置。

AdcHwUnit>General界面,如下图,配置重点是Adc Transfer Type和Adc Hardware Unit。

①Adc Transfer Type:ADC转换类型,可采用中断方式ADC_INTERRUPT与DMA模式,这里用ADC_INTERRUPT方式。

②Adc Hardware Unit:选择ADC硬件单元,此处为ADC_0。

切换到AdcHwUnit>AdcChannel界面,可点击”+“Add new element with default values,添加硬件单元ADC_0的ADC通道:

对于一个ADC通道而言,需要设定Adc Channel Resolution,即ADC通道的精度,这里使用12bit精度,如下图:

属于同一个ADC硬件单元的一个or多个ADC通道,可以组成一个ADC通道组,由同一触发源触发。
在AdcHwUnit>AdcGroup界面,就需要完成ADC通道组队配置及其中所包含的ADC通道的添加>点击”+“Add new element with default values,添加AdcGroup:

示例使用一个ADC通道组,其中包含前面定义的所有ADC通道。该ADC通道组的配置:

在AdcGroup>General界面,需要配置ADC通道组的属性,主要有以下几种:
①Adc Group Access Mode:ADC转换结果寄存器访问模式,有SIGNLE-ACCESS和STREAMING-ACCESS模式。这里用SIGNLE-ACCESS。
②Adc Group Conversion Mode:ADC通道组转换模式,有单次转换(ONESHOT)、连续转换(CONTINUOUS)模式。这里用单次转换模式。
③Adc GroupConversion Type:ADC通道组转换类型,有NORMAL、INJECTED模式。这里用NORMAL模式。
④Adc Group Id:ADC通道组Id号。
⑤Adc Group Trigger Source:ADC通道组触发源,有硬件触发、软件触发。这里用软件触发模式。

切换到AdcGroup>AdcGroupDefinition界面,点击”+“Add new element with default values,添加上述ADC通道组中的ADC通道:

3)Adc模块常用接口函数
①Adc_Init()

void Adc_Init(const Adc_ConfigType* pConfigPtr);

②Adc_SetupResultBuffer()

Std_ReturnType Adc_SetupResultBuffer(Adc_GroupType Group, Adc_ValueGroupType *pDataBufferPtr);

Adc模块有两种转换结果的访问模式,由下面2个接口实现:
①Adc_ReadGroup()

Std_ReturnType Adc_ReadGroup(Adc_GroupType Group, Adc_ValueGroupType *pDataBufferPtr);

②Adc_GetStreamLastPointer()

Adc_StreamNumSampleType Adc_GetStreamLastPointer(Adc_GroupType Group, Adc_ValueGroupType**PtrToSamplePtr);

其次,还有一些ADC通道组启动、停止、转换状态回读相关的接口。

①Adc_StartGroupConversion()

void Adc_StartGroupConversion(Adc_GroupType Group);

②Adc_StopGroupConversion()

void Adc_StopGroupConversion(Adc_GroupType Group);

③Adc_GetGroupStatus()

/**
 Adc_GroupType有4钟状态:ADC_IDLE, ADC_BUSY, ADC_COMPLETED, ADC_STREAM_COMPLETED
*/
Adc_StatusType Adc_GetGroupStatus(Adc_GroupType Group);

A车灯ADC相关代码实现:

VAR(Adc_ValueGroupType, AUTOMATIC) AdcRawBuffer[6];
Std_ReturnType retValue = RTE_E_OK;
retValue = Adc_SetupResultBuffer(AdcConf_AdcGroup_AdcGroup_0,AdcRawBuffer);
Adc_StartGroupConversion(AdcConf_AdcGroup_AdcGroup_0);
FUNC (void, IOAbstractionSWC_CODE)RE_GetLightState
(
   CONSTP2VAR(UInt8, AUTOMATIC, RTE_APPL_DATA) DEGetLightState
)
{
 if(ADC_STREAM_COMPLETED==Adc_GetGroupStatus(AdcConf_AdcGroup_AdcGroup_0))
 {
  Adc_StopGroupConversion(AdcConf_AdcGroup_AdcGroup_0);
  if(ADC_IDLE == Adc_GetGroupStatus(AdcConf_AdcGroup_AdcGroup_0))
  {
    *DEGetLightState = (uint8)(AdcRawBuffer[ADC0_AN6] >> 4);
  }
  else{…}
 }
 else{…}
}

Pwm模块

PWM驱动(Pulse Width Modulation Driver)为MCU PWM模块提供初始化和控制服务,可产生占空比和周期可改变的脉冲。

1)Pwm General 配置
主要对Pwm模块整体功能的配置,如下图:

①PwmDeInitApi:Pwm模块反初始化API使能;
②PwmSetDutyCycle:设置PWM波占空比API使能;
③PwmSetPeriodAndDuty:设置PWM波周期和占空比API使能;
④PwmDevErorDetect:Pwm模块开发错误检测使能;
⑤PwmNotificationSupported:Pwm通知函数使能;
⑥PwmClockRef:Pwm模块参考时钟引用,需要引用之前在Mcu模块中定义的McuClockReferencePoint_MC_CLK;

2)PwmChannelConfigSet配置

切换至PwmChannelConfigSet界面>点击“+”Add new element with default values,添加PwmChannelConfigSet配置,如下图左。
双击PwmChannelConfigSet_0 Index,可进入下图右所示PwmChannel配置界面>点击“+”新建PwmChannel配置。B车灯示例采用PWM输出来控制灯的亮度,所以需要配置一个PWM通道Pwm_Chn0_FrontLight:

PwmChannel需要定义PWM通道的一些属性:


各配置说明:
①PwmChannelId:PWM通道Id号;
②Pwm Hw IP:PWM硬件单元选择,可选择Enhanced Motor Control Timer(eTimer)和Motor Control Pulse Width Modulator Module(FlexPWM);
③PwmFlexPwmChannel:若选择FlexPwm Hardware IP:需要选择一个FlexPwmChannel配置;
④PwmeTimerChannel:若选择eTimer Hardware IP,需要选择一个eTimerChannel配置;
⑤Default Period:PWM波默认输出周期;
⑥PwmChannelClass:PWM通道类别,分为FIXED_PERIOD、FIXED_PERIOD_SHIFTED、VARIABLE_PERIOD。
⑦PwmPolarity:PWM波极性;
⑧PwmDutycycleDefault:PWM波默认占空比;
⑨PwmIdleState:PWM通道Idle状态的电平,PWM_HIGHT或PWM_LOW;
⑩PwmNotification:PWM通道通知函数名。

MPC5744P有两个FlexPwm模块:FlexPwm_0,FlexPwm_1。每个FlexPwm又有4个Sub-Module:Sub-Module_0、Sub-Module_1、Sub-Module_2、Sub-Module_3。每个Sub-Module可输出三路PWM:PWM_A、PWM_B、PWM_X。

B车灯采用FlexPwm_0、Sub-Module_0、PWM_A通道输出PWM,所以需要进行相关配置:

PwmChannelConfigSet> PwmFlexPwm> PwmFlexPwmSubModules> FlexPwmSubModules配置:

PwmChannelConfigSet> PwmFlexPwm> PwmFlexPwmChannels> PwmFlexPwmChannels配置:

对于Sub-Module,需要进行一些属性配置。PwmChannelConfigSet> PwmFlexPwmSubModulesSettings配置:

3)Pwm模块常用接口函数

①Pwm_Init()

void Pwm_Init(const Pwm_ConfigType *ConfigPtr);

②Pwm_SetDutyCycle()

void Pwm_SetDutyCycle(Pwm_ChannelType ChannelNumber);

③RE_SetLightState()

uint16 FrontLight_DutyCycleSetValue = 0;
FUNC(void, IOAbstractionSWC_CODE) RE_SetLightState(VAR(UInt8, AUTOMATIC)DESetLightState)
{
 /* ------------------Server Call Point ------------
------ */
 FrontLight_DutyCycleSetValue = 0x8000 * DESetLightState / 100;
 Pwm_SetDutyCycle(Pwm_Chn0_FrontLight, (uint16)(FrontLight_DutyCycleSetValue));
}

Icu模块

ICU驱动控制MCU的输入捕获单元ICU,MPC5744P的ICU可提供如下服务:
①高/低电平时间测量(High Time/Low Time Measurement);
②占空比测量(Duty Cycle Measurement);
③周期性信号时间测量(Period Time Measurement);
④信号边沿检测和通知(Edge Detection and Notification);
⑤边沿计数(Edge Counting);
⑥边沿时间戳捕获(Edge Time Stamping);
⑦中断唤醒(Wake-up Interrupt);

1)Icu General配置
Icu General配置主要对Icu模块整体功能的配置,如下图:

2)IcuConfigSet配置

切换至IcuConfigSet界面,点击“+”Add new element with default values,添加IcuConfigSet配置,如下图左。双击IcuConfigSet_0 Index,进入下图右:

切换到IcuChannel,点击“+”新建IcuChannel。B车灯采用ICU测量车灯控制信号的占空比,所以需要配置一个ICU通道Pwm0A2_LightMeasure。肌凝乳IcuChannel配置后,主要完成如下配置:

①IcuHwIP:选择ICU硬件通道,ETIMER或SIUL2。
②IcueTimerChannelRef:若IcuHwIP选择ETIMER,需要引用ETIMER通道配置。
③IcuDefaultStartEdge:通道默认激活边沿;
④IcuMeasurementMode:选择ICU工作模式。这里用SIGNAL_MEASUREMENT模式。
⑤IcuSignalMeasurementProperty:若使用SIGNAL_MEASUREMENT模式,则需要选择测量。这里测量DUTY_CYCLE(占空比)。

这里Icu模块IcuHwIP选择ETIMER,所以需要配置eTimer通道。切换 到IcueTimer界面> 点击“+”新建一个IcueTimer配置,如下图左。
双击Index,进入下图右> 选择一个eTimer Hardware Module(eTimer硬件模块)> 根据所选PortPin,选择MCU EETIMER_2:

选择eTimer硬件模块后,需要配置其属性:

3)IcuConfigSet配置

①Icu_Init()

void Icu_Init(const Icu_ConfigType *ConfigPtr);

②Icu_GetDutyCycleValues()

/**
 @param Channel ICU通道
 @param DutyCycleValues 采样结果缓存结构体
*/
void Icu_GetDutyCycleValues(Icu_ChannelType Channel, Icu_DutyCycleType *DutyCycleValues);

Icu_DutyCycleType结构体定义如下:

typedef struct
{
    Icu_ValueType ActiveTime;
    Icu_ValueType PeriodTIme;
}Icu_DutyCycleType;
``
B车灯与ICU相关代码实现:
```c
UInt8 FrontLight_DutyCycleGetValue = 0;

FUNC(void, IOAbstractionSWC_CODE) RE_GetLightState
(CONSTP2VAR (UInt8, AUTOMATIC, RTE_APPL_DATA) DEGetLightState)
{
    /*Local Data Declaration*/
    VAR(Icu_DutyCycleType,AUTOMATIC)luws_DutyCycle;

    /*PROTECTED REGION ID(User Logic:RE_GetLightState)ENABLED START*/
    /*Start of user code-Do not remove this comment*/

    Icu_GetDutyCycleValues(Pwm0A2_LightMeasure, &luws_DutyCycle);
    FrontLight_DutyCycleGetValue = (luws_DutyCycle.ActiveTime * 100) / luws_DutyCycle.PeriodTime;
    *DEGetLightState = FrontLight_DutyCycleGetValue;

    /*End of user code-Do not remove this comment*/
    /*PROTECTED REGION END*/
}

Can模块

CAN驱动属于MCAL中的通信驱动,针对MCU CAN Controller,可以实现对CAN Controller的初始化、发送/接受CAN报文、对接收报文的指示、对发送报文的确认、唤醒检测、溢出、错误处理等功能。
CAN驱动能访问硬件,向上层提供独立于硬件的API。

1)Can General配置
主要对Can模块整体功能的配置:

①Can Change Baudrate Api:改变CAN波特率API使能;
②Development Error Detection:Can模块开发错误检测使能;
③Can Driver Index:CAN驱动Id号;
④Can Main Function Busoff Period:Can_Main Function_Bus OFF()调用周期;
⑤Can MainFunction Wakeup Period:Can_MainFunction_Wakeup()调用周期;
⑥Can Main Function Mode Period:Can_MainFUnction_Mode()调用周期;
⑦Can Multiplexed Transmission:双路复用功能的传输使能;
⑧Can Identical Id Cancellation:取消挂起的发送报文使能;
⑨Can Extended Id Support:支持扩展Id使能;
⑩Message buffer data size:CAN MainBox装载数据长度等。

2)CanConfigSet配置
切换CanConfigSet界面> 点击“+”Add new element with default values,添加Can配置,如下图左。
双击CanConfigSet_0 Index,进入下图右CanConfigSet配置界面:

从CanConfigSet配置界面,有两项配置内容:
①CanController:CAN控制器属性配置;
②CanHardwareObject:CAN硬件对象,即CAN MainBox(MB)配置;

首先,配置CanConfigSet>CanController> 点击“+”新建CanController配置> 双击Index进入CanController> General配置界面:

①Can Hardware Channel:CAN硬件通道,MPC5744P有3个CAN控制器:FlexCAN_A、FlexCAN_B、FlexCAN_C。这里用FlexCAN_A。
②Can Controller Activation:CAN控制器使能。
③Can Controller Id:CAN控制器Id号。
④Can Rx Processing Type:接收数据的处理方式,轮询(POLLING)或中断(INTERRUPT)。
⑤Can Tx Processing Type:发送数据的处理方式,轮询或中断。
⑥Can BusOff Processing Type,CAN BusOff事件处理方式,轮询或中断。
⑦Can Wakeup Processing Type:CAN Wakeup事件处理方式,轮询或中断。
⑧Can Controller Default Baudrate:CAN控制器默认的波特率配置。
⑨Can CPU Reference Clock:CAN模块引用的时钟,即Mcu模块中配置的McuClockReferencePoint_CAN_CLK。
⑩CanRxFifoWarningNotification:RxFifo Warning通知函数。
⑪CanRxFifoOverflowNotification:RxFifo Overflow通知函数。
⑫Can Error Notification Enable:Can Error通知函数。

完成了CanController通用配置后,需要配置CanController波特率:切换到CanControllerBaudrateConfig界面> 点击“+”新建CanControllerBarudrateConfig配置> 双击Index,进入CanControllerBaudrateConfig General配置界面:

主要配置项说明:
①Can Time Segments Checking:CAN时间段检测使能;
②Can Automatic Time Segments Calculation:自动时间段计算使能。若使能,则CanControllerPropSeg、CanControllerSeg1、CanControllerSeg2、CancontrollerSyncJumpWidth将禁用。
③Can Controller Prescaller:CAN控制器时钟分频。
④Can Controller Baudrate Config Id:CAN控制器波特率配置Id号,被SetBaudrate API使用。
⑤Can Controller Baudrate:设置CAN控制器的波特率。这里用100Kbps。
⑥Can Synchronization Segment:同步段的时间。
⑦Can Propagation Segment:传播段的时间。
⑧Can Phase Segment 1:采样点前的时间段。
⑨Can Phase Segment 2:采样点后的时间段。
⑩Can Resynch Jump Width:同步跳跃宽度(Synchronization Jump Width),用于重同步的时间。

对于CanController,还需配置CanFilterMask(滤波器mask),但Filter只用于Rx Basic CAN类型的MB。如下图:

完成CanController配置后,可进行CanHardwareObject配置。CAN硬件对象CanHardwareObject为CAN MainBox(MB)的抽象。
切换到CanHardwareObject界面> 点击“+”Add new element with default values,添加CanHardwareObject。示例涉及2帧报文:一帧发送、一帧接收。这里创建2个MB用来完成CAN报文的收发:

下图是接收类型CanHardwareObject的配置,主要配置内容如下:

①Can Implementation Type:FULL CAN(一个MB只能发送或者接收一帧CAN报文);BASIC CAN(一个MB可以发送或接收多帧CAN)。
②Can Id Message Type:CAN Id的类型,标准帧(Standard Identifier-11 bits)、扩展帧(Extended Identifier-29 bits)与混合模式(Mixed Mode)。
③CanIdValue(Message Id):结合CanFilterMask,定义CAN报文接收Id范围。
④Can Object Id(MB Handle):MB的Id号。
⑤Can MB Type:MB类型,接收(RECEIVE)或者发送(TRANSMIT)。
⑥Can Controler Reference:CAN控制器引用。这里涉及一个。
⑦Can Filter Mask Reference:引用滤波器掩码。

3)CanMainFunctionRWPeriods配置
示例中接收/发送数据等处理方式采用轮询模式,即通过周期性调用Can_MainFunction_Read()和Can_MainFunction_Write()实现报文收发,所以CanMainFunctionRWPeriods配置就是来设定轮询周期的,此处都配置成0.001s:

4)Can模块初始化函数

void Can_Init(const Can_ConfigTYpe *Config);

Base与Resource模块

Base、Resource 2模块与具体功能无关,不需要额外配置。Resource主要指示MCAL配置工具所支持的芯片信息,如MPC5744P_lqfq144。Base模块主要指示AUTOSAR规范版本、MCAL工具版本信息:


MCAL配置验证与代码生成

配置完MCAL模块后,可进行配置验证、代码生成。下图右起第二个按钮“Verify selected project”,点击后将进行配置验证;右起第一个按钮“Generate Code for the currently selected project”,点击后将进行MCAL代码生成。

MCAL工程最终生成的配置代码:


小结

1)介绍MPC5744P MCAL配置工具安装、创建工程的方法;
2)对MCAL各常用模块结合示例,进行了讲解;
3)介绍了各模块常用接口函数,展示示例MCAL模块相关代码实现。