首页 > 其他分享 >AUTOSAR笔记:ECU级开发MCAL(六)

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

时间:2023-06-07 22:14:38浏览次数:38  
标签:AUTOSAR Dio 配置 MCAL ECU Adc 模块 通道 ADC

目录

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模块相关代码实现。

标签:AUTOSAR,Dio,配置,MCAL,ECU,Adc,模块,通道,ADC
From: https://www.cnblogs.com/fortunely/p/17464701.html

相关文章

  • AUTOSAR笔记:工程代码集成与调试(七)
    目录工程代码架构、集成方法代码编译链接代码调试MCU可执行文件下载完成AUTOSAR系统级、ECU级、SWC级相关开发和代码生成后,需要进行代码集成与调试。本文对AUTOSAR工程代码架构、集成、编译链接、调试方法进行简单介绍。工程代码架构、集成方法一套完整的符合AUTOSAR规范的ECU......
  • SecureCRT for Linux 9.3无限30天试用
    SecureCRTforLinux9.3无限30天试用最近从Windows转到Linux,xshell没有linux版本,其他的又不想用,就下载了securecrt,但是都知道这个是收费的,只能用30天,买又买不起,下载好deb包安装后,默认在当前用户家目录下生成一个.vandyke目录,没有的话进到crt里面,Option-->GlobalOptions可以看到......
  • 去除spring security的默认登录页
    在使用springsecurity时会默认带入一个登录页,使用SSO单点登录的时候也会跳出这个页面,我们的项目一般都会有自己的登录页面,所以这个默认页面其实是没什么用的在过滤器配置文件里面加上下面的代码,就可以把这个默认页面移除了@BeanpublicWebSecurityConfigurerAdapter......
  • Using generated security password
    springsecurity默认的用户名(user)和随机生成的密码,在控制台输出Usinggeneratedsecuritypassword:1dfdgki3-q234-76hj-6h7l-1re87f546r646也可以手动配置spring:security:user:name:123password:123......
  • 算法 in Golang:Recursion(递归)
    算法inGolang:Recursion(递归)递归算法场景:在套娃中找到宝石可以这样做while没找到:if当前项is宝石:return宝石elseif当前项is套娃:打开这个套娃if当前项is宝石:return宝石elseif当前项is套娃:打开这个套娃if当前项is宝石:............
  • KingbaseES V8R6集群运维系列 -- 修改ssh通信为 sys_securecmdd 通信
    一、适用于:本文档使用于KingbaseESV008R006版本。二、关于SYS_SECURECMDD:sys_securecmdd是KingbaseES集群自带的工具,集群监控、管理集群时通过sys_securecmdd安全执行命令而不使用ssh服务。sys_securecmdd主要包含以下文件:服务端sys_securecmdd默认监听8890端口,接受客......
  • 25)m2e-execution-not-covered 具体例子
    http://www.eclipse.org/m2e/documentation/m2e-execution-not-covered.html  这个插件定义的phase不包含在Eclipsem2e的生命周期内。(这种情况很正常,自己定义的插件所在的phase可以是各种各样的) 出现这种情况除了有个讨厌的红叉,不会影响正常的mavenbuild,只是eclipse......
  • m2e-execution-not-covered
    http://www.eclipse.org/m2e/documentation/m2e-execution-not-covered.htmlBackgroundM2Eclipse0.12andearlierexecutedsomepartsofMavenbuildlifecycleinsideEclipseandthenconfiguredtheEclipseprojectbasedonafter-executionstatecollectedinM......
  • 二、Spring Reactive Security自定义登录页
    添加配置类:@ConfigurationpublicclassMyReactiveSecurityConfig{@BeanpublicReactiveUserDetailsServicereactiveUserDetailsService(){UserDetailsuser=User.withUsername("user").password("12345")......
  • 一、Spring Reactive Security简单使用
    SpringReactiveSecurity是结合SpringWebFlux使用的。结合SpringBoot使用,简化了大量配置。 新建SpringBoot项目,添加依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>......