自学内容网 自学内容网

英飞凌Aurix2G TC3XX GPT12模块详解

英飞凌Aurix2G TC3XX GPT12模块详解

本文主要介绍英飞凌 Aurix2G TC3XX系列芯片GPT12模块硬件原理、MCAL相关配置和部分代码实现。

1 模块介绍

GPT12(General Purpose Timer Unit )是Aurix TC3XX内部的通用定时器模块,提供高精度定时功能。GPT12包含GPT1和GPT2两个子模块,通用定时器单元块GPT1和GPT2具有非常灵活的多功能定时器结构, 可用于定时、事件计数、脉宽测量、脉冲产生、倍频等用途。

在Autosar中,该硬件模块一般用于软件模块GPT的硬件定时器,或者作为OS Tick,利用硬件Timer驱动OS Counter。

2 功能介绍

2.1 结构

GPT12中的两个子模块功能类似,其中GPT1的功能更多,这里以GPT1子模块作为示例介绍GPT12硬件原理。如下图是GPT1模块内部结构图。
在这里插入图片描述

我们可以看到,GPT1内部包含了3个可用定时器T2、T3和T4,其中T3为主定时器,T2和T4为辅寄存器。每个定时器的位宽都是16位。单独使用时其功能相同,组合使用时T2或者T4可以用来重载T3,或者捕获T3的值。

每个定时器有两个输入,一个TxIN和一个TxEUD。TxIN可以用作门控模式,控制定时器启停,TxEUD可输入高低信号用定时器计数。

T3有一个输出引脚T3OUT,可将T3的溢出状态向外从引脚输出。

3个定时器各自都有一个中断请求源,连接中断路由模块IR,实现定时器中断。

如前所述,GPT1的时钟源是fGPT,在到达GPT1模块之后有一个可选分频BPS1,分频值可选4、8、16、32。然后T2~T4分别有各自的内部时钟分频TxI,其分频关系为2^TxI。所以定时模式下定时器频率计算公式为:

f T x = f G P T B P S 1 ∗ 2 T x I \begin{equation} f_{Tx} = \frac {f_{GPT }} {BPS1*2^{TxI}} \end{equation} fTx=BPS12TxIfGPT

一般我们配置fGPT=fSPB=100MHz,BPS1选择4,TxI配置为0,可得到25MHz的定时器频率。

2.2 独立运行模式

单独使用时3个定时器的功能一样,这里以T3为例。T3的定时器的Counter值就存储在GPT12_T3寄存器中,可以通过软件进行读写,重置定时器值或者读取当前值。T3的控制主要依赖控制寄存器GPT12_T3CON寄存器,其寄存器结构如下图所示。

在这里插入图片描述

其中T3R用来控制T3的运行,置1则启动定时器,清0则停止寄存器。如果是门控模式,则同时还需要引脚状态为激活态。

定时器支持累加/累减模式,当T3UDE=0时,该模式由T3UD控制;当T3UDE=1时,该模式由相连的输入引脚T3EUD控制。

T3的溢出控制连接关系如下图所示:

在这里插入图片描述

当T3溢出时,T3OTL置位,并将该状态传递给相连的引脚T3OUT。同时通过一个ShadowLatch将延迟前后的信号传递给辅助定时器,当出现溢出时,这两个延迟信号之前存在电平差,从而触发辅助定时器的相关功能。

2.2.1 定时器模式

T3作为定时器模式时的逻辑关系图如下图所示:

在这里插入图片描述

当设置T3M=000b时,T3为定时器模式。

如前所述,fGPT传入之后经过两级分频BPS1T3I,并经过开关T3R之后,到达内部定时器,推动其进行运转。累加或累减则取决于下方的T3UD、T3EUD、T3UDE等状态。

当定时器溢出时,触发中断信号,实现定时中断。同时通过引脚T3OUT将溢出信号传出去。

另外溢出信号还传递到辅助寄存器,实现T3的重载、捕获等功能。因为T3是没有内部重载的逻辑的,所以如果需要使用连续的定时功能,如OS Tick,则需要使用一个辅助寄存器,进行定时值的重载。

2.2.2 门控定时器模式

在这里插入图片描述

门控定时器逻辑整体和定时器模式相同,只是在入口处增加了一个与门逻辑GateCtrl。

当T3M=010b时,T3IN的低电平有效,会启动定时器,高电平则停止定时器;如果T3M=011b时,则相反是高电平启动定时器。

2.2.3 计数器模式

当设置T3M=001b时,T3为定时器模式。其逻辑关系图如下图所示。

在这里插入图片描述

在Counter模式下,T3I用来控制引脚输入的计数模式,比如上升沿计数、下降沿计数或双边计数。具体参考下表。
在这里插入图片描述

需要注意的是计数的最高分辨率等于经过BPS1分频后的时钟频率。

2.2.4 增量接口模式

当设置T3M=110b或111b时,T3为2.2.4 增量接口模式。其逻辑关系图如下图所示。

在这里插入图片描述

在增量接口模式下,与主定时器T3(T3IN, T3EUD)相关联的两个输入用于接口到增量编码器。T3由一个或两个外部输入引脚上的每个转换进行时钟处理,以提供编码器输入的2倍或4倍分辨率。

2.3 协同运行模式

GPT12的设计使用了一些协同设计,即主定时器和辅定时器在一起实现相关的功能。

2.3.1 重载定时模式

如前所述,T3定时器内部不具备重载的功能,因此要实现连续的周期定时功能,则需要依赖辅寄存器。在重载模式下需要将T2(假定辅定时器为T2)的T2RC设置为1,表示该定时器的启停由T3控制。同时模式T2M设置为100b,表示重载模式。

重载定时模式的逻辑关系图如下图所示。

在这里插入图片描述

从图中可以看出,T3正常按照定时器模式使用,同时其溢出信号连接至T2,用于触发T3的重载,重载值为T2中保存的值。

该模式下T2的值不再运转改变,而是仅作为T3的加载寄存器使用。

另外使用该模式还可以组合实现PWM信号,但是Aurix TC3XX配备了功能完备的GTM,因此GPT12硬件的PWM很少被使用,感兴趣的读者可自行研究。

2.3.2 串联定时模式

如前所述,GPT12中的每一个Timer都是16位定时器,因此在实现较长、精度较高的定时时,就可以使用串联模式。其逻辑关系图如下图所示。

在这里插入图片描述

如图所示,T3的溢出会输送到T2进行累加,因此该组合内定时器的最大位宽为两个定时器之和,即32位定时器。如果T3OUT使用单边沿触发T2,则可以实现33位的定时器。

3 MCAL配置及代码示例

这里使用GPT1的T2和T3组成一个重载定时器,用于系统的1ms Tick,来实现一个示例。

3.1 MCU

首先我们需要到MCU->McuHardwareResourceAllocationConf->McuGpt12ModuleAllocationConf中将我们需要使用的定时器资源分配到GPT软件模块。(这里的GPT是Autosar中的软件抽象定义,区别于硬件GPT12)

在这里插入图片描述

然后我们来到MCU->General,拉到McuGpt12PrescalerConf,前面一步配置了这里才允许配。我们使能GPT1,使用4倍分频。

在这里插入图片描述

3.2 Irq

我们需要使用T3连续触发中断,实现Tick,因此需要在Irq模块配置一个T3中断优先级。

在这里插入图片描述

这里中断优先级选择一个未使用的即可,中断类型选择一类,如果是用作OS Tick的话选作二类,我这里只有MCAL基础包,只能选择一类;方向选择CPU0即可,如果是多核,可以根据需求设置。

3.3 GPT

在这里插入图片描述

首先来到General,照例General中还是一些常规接口使能配置,按初始配置即可,把需要使用的接口使能。

在这里插入图片描述

然后来到GptChannelConfiguration,这里我配置了一路通道。

  • GptChannelId:通道ID;

  • GptAssignedHwUnit :硬件单元,这里可选GTM和GPT12,我们使用GPT12;

  • GptChannelMode:通道模式,我们是连续,设置为GPT_CH_MODE_CONTINUOUS

  • GptTimerChannelUsage:预设的通道频率,这里我们自行配置,选GPT_TIMER_CHANNEL_NORMAL即可;

  • GptChannelTickFrequency和GptChannelTickValueMax都不需要配置,硬件固定的;

  • GptEnableWakeup:GPT唤醒功能,需要配合EcuM使用,休眠唤醒逻辑中使用;

  • GptChannelClkSrcRef:这里配不配都行,我们是硬件自行设置的频率,不用参考;

    在这里插入图片描述

    然后来到第二页选项卡GptNotification,这里用来配置Gpt中断的通知函数,GPT中断中会调用该函数。

    在这里插入图片描述

最后我们来到Gpt12TimerOutputModuleConfiguration选项卡,这里配置GPT12的硬件定时器。我们选择定时器T2和T3,主、辅没有顺序要求,工具会自动识别。这里如果选择GPT12的GPT2子模块,则只能配置T5和T6。

3.4 代码及示例

首先是初始化,我们需要初始化GPT硬件,配置中断。

然后需要EnableNotification函数去使能GPT12内部相关中断,并使能通知。

StartTimer的Tick值是根据分频算出来的,前面提到我们SPB=100MHz,BPS1在MCU中配置为4分频,T3I=0,则T3的时钟频率为100/4/1=25MHz,因此定时器实现1ms的Tick值为25000。

IrqGpt_Init();
SRC_GPT120T3.B.SRE = 1;     /* Enable GPT12 T3 Source. */

Gpt_EnableNotification(GptConf_GptChannelConfiguration_LwipTimer);
Gpt_StartTimer(GptConf_GptChannelConfiguration_LwipTimer, 25000);  /* 1ms */

然后每次Timer到期都会进入中断,然后执行上文所配置的Notification函数,然后我们在Notification函数中进行Tick的累加和Tick标志位的置位。

void SystemTickIsr()
{
  SystemTickUpdateFlag = TRUE;
}

在main中我们轮询标志位和Tick,实现简单的1ms周期系统,并在其中切换LED灯的状态。

while(!SystemTickUpdateFlag){
    /* wait for tick update. */
}
SystemTickUpdateFlag = FALSE;
localSysTick++;

if(localSysTick%500 == 0){
    Dio_FlipChannel(DioConf_DioChannel_LED1);
}

这样我们就实现了一个简单的1ms系统Tick,观察LED灯。

1ms系统Tick的LED灯

4 小结

本文详细介绍了英飞凌Aurix TC3XX中的GPT12模块,对其内部硬件结构和原理进行了拆解说明。最后在MCAL中GPT模块进行了配置,并结合代码使用GPT12实现了1ms的系统Tick。GPT12功能相对来说比较简洁,常用于实现Autosar OS中的系统Timer,也常用于EcuM中的系统定时器。但该模块资源也有限,一共5个Timer,且实现连续定时器功能时由于需要主从配合,只能提供两个连续定时器。

参考资料

  1. Infineon-AURIX_TC3xx_Part1-UserManual-v02_00-EN.pdf
  2. Infineon-AURIX_TC3xx_Part2-UserManual-v02_00-EN.pdf

如您有任何问题,欢迎关注公众号【TechLink汽车软件】与我们联系!


原文地址:https://blog.csdn.net/weixin_44000419/article/details/143667117

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!