英飞凌Aurix2G TC3XX GPT12模块详解
本文主要介绍英飞凌 Aurix2G TC3XX系列芯片GPT12模块硬件原理、MCAL相关配置和部分代码实现。
文章目录
- 英飞凌Aurix2G TC3XX GPT12模块详解
- 1 模块介绍
- 2 功能介绍
- 2.1 结构
- 2.2 独立运行模式
- 2.2.1 定时器模式
- 2.2.2 门控定时器模式
- 2.2.3 计数器模式
- 2.2.4 增量接口模式
- 2.3 协同运行模式
- 2.3.1 重载定时模式
- 2.3.2 串联定时模式
- 3 MCAL配置及代码示例
- 3.1 MCU
- 3.2 Irq
- 3.3 GPT
- 3.4 代码及示例
- 4 小结
- 参考资料
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=BPS1∗2TxIfGPT
一般我们配置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传入之后经过两级分频BPS1和T3I,并经过开关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,且实现连续定时器功能时由于需要主从配合,只能提供两个连续定时器。
参考资料
- Infineon-AURIX_TC3xx_Part1-UserManual-v02_00-EN.pdf
- Infineon-AURIX_TC3xx_Part2-UserManual-v02_00-EN.pdf
如您有任何问题,欢迎关注公众号【TechLink汽车软件】与我们联系!