【CP AUTOSAR】Gpt Driver分析和使用


前言

本文介绍CP AUTOSAR 架构下的Gpt组件,基于S32K144芯片、NXP提供的MCAL包,使用EB Tresos工具进行配置的经验,不具体介绍芯片定时器外设的功能。
Gpt组件用来控制芯片上的定时器开关、获取定时器的值、触发定时器中断、触发定时器唤醒事件等,但芯片上不一定所有的定时器都是由Gpt控制,也有可能是Cdd控制。
Gpt组件为其他组件提供时基,比如PWM、ICU、OCU。
Gpt组件位于Microcontroller Drivers层里。
在这里插入图片描述


一、原理解析

Gpt组件统一实现了芯片大部分的定时器功能,如S32K144的FTM、LPIT、LPTMR、RTC就通过Gpt来控制。
Gpt有如下几个概念:
(一)、定时器通道:
拥有硬件定时器的软件定时器通道,比如将外设FTM0分配给软件定时器通道0。一个硬件定时器通道不能被不同的软件定时器通道拥有。软件定时器通道就是基于硬件定时器的计数器为其他组件提供时基,Gpt控制的基本单位就是软件定时器通道,以下说的定时器通道指的都是软件定时器通道。

(二)、定时器通道模式:
每个定时器通道可以配置成不同的模式。
单次模式:
定时器通道的计时器到达目标时间后,便停止计数器的运行。
连续模式:
定时器通道的计时器到达目标时间后,自动重启计时器,除非手动停止。

(三)、定时器通道状态:
定时器通道在开启停止中会有如下几种状态。

initialized:
Gpt在初始化完后定时器通道进入initialized状态。

running:
在调用Gpt_StartTimer()后开启定时器通道,定时器通道进入running状态。

expired:
在定时器通道配置为单次模式时,计数器到达目标时间后,该定时器通道状态变为expired状态。

stopped:
在调用Gpt_StopTimer()后停止定时器通道,定时器通道进入stopped状态。
在这里插入图片描述状态切换如上图所示。

在这里插入图片描述如上图,单次模式时,定时器通道开启后,当计时器到达目标时间后,从running变为expired,定时器通道停止后,从running变为stopped。
在这里插入图片描述如上图,连续模式时,定时器通道开启后,当计时器到达目标时间后,一直保持为running,并且计时器从0开始又重新计数,除非手动停止,变为stopped。

(四)、PredefTimer:
PredefTimer为自由运行计数器,能通过硬件定时器提供以下时基:
在这里插入图片描述软件定时器通道的功能应该与PredefTimer功能分开。

(五)、定时器模式:
Gpt驱动可以通过Gpt_SetMode()设为GPT_MODE_NORMAL或GPT_MODE_SLEEP。
在GPT_MODE_NORMAL下每个定时器通道计时器到达目标时间后可以触发通知,用户可以添加自己的回调函数,通常Gpt运行在NORMAL模式下。
在GPT_MODE_SLEEP下不能触发通知,如果没有一个定时器通道Wakeup事件,那就把所有定时器通道、PredefTimer都给关闭,如果期间用户调用Gpt_EnableWakeup()和Gpt_StartTimer()对定时器通道进行Wakeup后,Gpt开启PredefTimer并且使能定时器通道中断,定时器通道计时器到达目标时间后,如果使能了Gpt_EnableWakeup()便调用EcuM组件的EcuM_CheckWakeup()来寻找唤醒源,EcuM_CheckWakeup()会调用Gpt_CheckWakeup()判断唤醒源是否为GPT组件的如果是则调用EcuM_SetWakeupEvent()通知EcuM组件有GPT唤醒事件,虽然此时定时器通道有在工作,但Gpt模式还是在GPT_MODE_SLEEP模式,要调用Gpt_SetMode()设置为GPT_MODE_NORMAL。
Gpt从GPT_MODE_SLEEP模式变为GPT_MODE_NORMAL模式或者在GPT_MODE_SLEEP模式触发Wakeup事件要用到定时器通道工作,都要先调用一遍Gpt_StartTimer()来开启定时器通道。
通过Gpt的GPT_MODE_SLEEP和Wakeup事件可以满足ECU的定时唤醒功能。
通过Gpt_SetMode()使Gpt处于GPT_MODE_SLEEP时如果唤醒事件已经开着那么不会使定时器通道停止只是不能触发定时器通道的通知,如果唤醒事件没开那么定时器通道关闭。
在这里插入图片描述

二、代码架构

Gpt组件里有Gpt.c、Gpt_Ipw.c、Gpt_Ftm.c、Gpt_LPit.c、Gpt_Lptmr.c、Gpt_SRtc.c源文件,其中Gpt_Ipw.c封装各个外设定时器的寄存器操作提供给Gpt.c为接口,Gpt.c实现AUTOSAR接口供外部组件使用。

三、主要变量和类型描述

无。

四、主要代码描述

Gpt_Init():
实现Gpt组件的初始化。

Gpt_DeInit():
实现Gpt组件的反初始化。

Gpt_GetTimeElapsed():
用来获取定时器通道计时器已经累加的值。

Gpt_GetTimeRemaining():
用来获取定时器通道距离目标时间剩下的值。
在这里插入图片描述Gpt_StartTimer():
用来开启定时器通道,入参value为目标时间,如果该定时器通道的频率设置为40000000HZ,想要0.001S周期触发通知,那value的值就要写入40000000*0.001=40000。

Gpt_StopTimer():
用来停止定时器通道。

Gpt_EnableNotification():
用来使能定时器通道通知,当Gpt处于GPT_MODE_NORMAL模式下,计时器到达目标时间后,便调用该定时器通道的回调函数。

Gpt_SetMode():
设置Gpt驱动为GPT_MODE_NORMAL或GPT_MODE_SLEEP,当Gpt处于GPT_MODE_SLEEP后如果想要开启定时器通道,就要调用Gpt_StartTimer()。

Gpt_EnableWakeup():
用来触发定时器通道的唤醒事件。当Gpt处于GPT_MODE_SLEEP并且定时器通道开启时,如果某个定时器通道有唤醒事件,便会通知EcuM组件有唤醒事件。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

五、EBTresos配置

主要配置如下:
在这里插入图片描述
在这里插入图片描述

此处地方Gpt是否用外设上的定时器通道。

在这里插入图片描述
此处地方设置Gpt定时器通道的参考时钟频率。参考时钟频率用于硬件定时器的时钟。
在这里插入图片描述此处地方设置定时器通道的硬件定时器通道、定时器通道模式、参考时钟频率等。
如LPIT的时钟树如下图
在这里插入图片描述
那这LPIT的参考时钟就要选择之前定义的GptClockReferencePoint_SPLL_DIV2_CLK_80,而GptClockReferencePoint_SPLL_DIV2_CLK_80又跟Mcu组件的参考时钟关联,所以参考时钟要在Mcu组件配置时就要设置好。

六、使用范例

(一)、定时器通道开启通知

/**忽略中断配置、时钟配置、引脚配置等**/
Gpt_Init(&GptChannelConfigSet);
Gpt_StartTimer((Gpt_ChannelType) 0u, (Gpt_ValueType) ((uint32) (0xFFFF)));
Gpt_EnableNotification(0u);

(二)、在进入休眠后,定时器通道开启定时唤醒

/**忽略中断配置、时钟配置、引脚配置等**/
Gpt_Init(&GptChannelConfigSet);
Gpt_StartTimer((Gpt_ChannelType) 0u, (Gpt_ValueType) ((uint32) (0xFFFF)));
Gpt_EnableNotification(0u);
...
Gpt_EnableWakeup((Gpt_ChannelType) 0u);
Gpt_SetMode(GPT_MODE_SLEEP);

七、参考资料

https://www.autosar.org/fileadmin/standards/R23-11/CP/AUTOSAR_CP_SWS_GPTDriver.pdf
https://www.autosar.org/fileadmin/standards/R23-11/CP/AUTOSAR_CP_SRS_GPTDriver.pdf
https://www.autosar.org/fileadmin/standards/R23-11/CP/AUTOSAR_CP_EXP_LayeredSoftwareArchitecture.pdf


总结

Gpt使用芯片上的各种硬件定时器来为其他组件提供时基、通知,并且配合唤醒事件实现ECU周期唤醒的功能。
要注意涉及到的外设有没有与其他组件使用的外设相冲突,比如Gpt和Pwm都用到了FTM这个外设,那Gpt的硬件定时器就应该去选择LPIT或其他。

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值