1、模块介绍
GPT1/2(General Purpose Timer Unit)是 Aurix TC3XX 内部的通用定时器模块,提供高精度定时功能,GPT1/2 包含 GPT1 和 GPT2 两个子模块,通用定时器单元块 GPT1 和 GPT2 具有非常灵活的多功能定时器结构,可用于定时、事件计数、脉冲测量、脉冲产生、倍频等用途。
在 AutoSar 中,该硬件模块一般用于软件模块 GPT 的硬件定时器,或者作为 OS Tick,利用硬件 Timer 驱动 OS Counter。
2、功能介绍
2.1、功能列表
GPT1 包含三个定时器/计数器:核心定时器 T3 和两个辅助定时器 T2/T4。最大分辨率为 fGPT/4。
GPT1 的辅助定时器可选地配置为核心定时器的重新加载或捕获寄存器。
如下列表列出了支持的功能:
fGPT/4 最大分辨率
3 个独立的定时器/计数器
4 种操作模式:1、定时器模式。2、门控定时器模式。3、计数器模式。4、增量接口模式
重新加载和捕获功能
单独中断
GPT2 块包含两个定时器/计数器:核心定时器 T6 和辅助定时器 T5。最大分辨率为 fGPT/2。
附加的捕获/重新加载寄存器(CAPREL)支持捕获和重新加载操作,并具有扩展功能。
如下列表列出了支持的功能:
fGPT/2 最大分辨率
2 个独立的计时器/计数器
3 种操作模式:1、定时器模式。2、门控定时器模式。3、计数器模式
通过 16 位捕获/重载寄存器 CAPREL 扩展捕获/重载功能
单独中断
2.2、功能结构
GPT12 中两个子模块功能类似,其中 GPT1 的功能更多,以 GPT1 子模块为示例介绍 GPT12 硬件原理。如下图是 GPT1 模块内部结构图:
如上图所示 GPT1 包含了 3 个定时器 T2、T3、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 分别有各自内部时钟分频 Txl,其分频关系位 2^Txl。所以定时模式下定时器频率计算公式 为:
fTx = fGPT/(BPS1 * 2TxI )
一般我们配置 fGPT = fSPB = 100MHz,BPS1 选择 4,TxI 配置为 0,可得到 25MHz 的定时器频率。
2.3、独立运行模式
单独使用时 3 个定时器的功能一样,以 T3 为例,T3 的定时器的 Counter 值就存储在 GPT12_T3 寄存器中,可以通过软件进行读写,重置定时器或取出当前值。T3 的控制主要依赖控制寄存器 GPT12_T3CON 寄存器,其寄存器结构如下图所示:
T3R:控制 T3 运行的位,置 1 启动定时器,清 0 则停止寄存器。若是门控模式,则同时还需要引脚状态为激活态。
T3UDE:定时器支持累加/累减模式,当 T3UDE=0 时,该模式又 T3UD 控制;当 T3UDE=1 时,该模式由相连的输入引脚 T3EUD 控制。
T3的溢出控制连接关系如下图所示:
当 T3 溢出时,T3OTL 置位,并将该状态传递给相连的引脚 T3OUT。同时通过一个 shadowLatch 将延迟前后的信号传递给辅助定时器,当出现溢出时,这两个延迟信号之前存在电平差,从而触发辅助定时器的相关功能。
2.3.1、定时器模式
T3 作为定时器模式时的逻辑关系如下图所示:
当设置 T3M = 000B 时,T3 为定时器模式。T3M 位字段处于 T3CON 寄存器中。
如前所述,fGPT 传入之后经过两级分频 BPS1 和 T3I,并经过开关 T3R 之后,到达内部定时器,推动其进行运转。累加或累减则取决于下方的 T3UD、T3EUD、T3UDE 等状态。
当定时器溢出时,触发中断信号,实现定时中断。同时通过引脚 T3OUT 将溢出信号传出去。
另外溢出信号还传递到辅助寄存器,实现 T3 的重载、捕获等功能。因为 T3 是没有内部重载的逻辑的,所以如果需要使用连续的定时功能,如 OS Tick,则需要使用一个辅助寄存器,进行定时值的重载。
2.3.2、门控定时器模式
门控定时器逻辑整体和定时器模式相同,只是在入口处增加了一个与门逻辑 GateCtrl。
当 T3M = 010b 时,T3IN 的低电平有效,会启动定时器,高电平则停止定时器;
当 T3M = 011b 时,则相反是高电平启动定时器。
2.3.3、计数器模式
当设置 T3M = 001B 时,T3 为计数器模式,其逻辑关系如下图所示:
在 Counter 模式下,T3I 用来控制引脚输入的计数模式,比如上升沿计数、下降沿计数或双边沿计数。具体参考如下表:
需要注意的是计数的最高分辨率等于经过 BPS1 分频后的时钟频率。
2.3.4、增量接口模式
当设置 T3M = 110B 或 111B 时,T3 为增量接口模式。其逻辑关系图如下图所示:
在增量接口模式下,与主定时器 T3(T3IN,T3EUD)相关联的两个输入用于接口到增量编码器。T3 由一个或两个外部输入引脚上的每个转换进行时钟处理,以提供编码器输入的 2 倍或 4 倍分辨率。
2.4、协同运行模式
2.4.1、重载定时模式
如前所述,T3 定时器内部不具备重载的功能,因此要实现连续的周期定时功能,则需要依赖辅寄存器。在重载模式下需要将 T2(假定辅定时器为 T2)的 T2RC 设置为 1,表示该定时器的启动停由 T3 控制。同时模式 T2M 设置为 100B,表示重载模式。
重载定时模式的逻辑关系图如下图所示:
由上图可知,T3 正常按照定时器模式使用,同时溢出信号连接至 T2,用于触发 T3 的重载,重载值为 T2 中保存的值。
该模式下 T2 的值不在运转改变,而是仅作为 T3 的加载寄存器使用
另外使用该模式还可以组合实现 PWM 信号,但是 Aurix TC3xx 具有功能完备的 GTM 外设。因此 GPT12 硬件的 PWM 很少被使用。
2.4.2、串联定时模式
GTP12 中的每一个 Timer 都是 16 位定时器,因此在实现较长、精度较高的定时时,可以使用串联模式。其逻辑关系如下图所示:
如上图所示,T3 的溢出会输送到 T2 进行累加,因此可以实现位宽位 32 位的定时器。
若 T3OUT 使用单边沿触发 T2,则可以实现 33 位的定时器。
3、MCAL &ETAS 配置及代码
以使用 GPT12 的 T2 和 T3 组成一个重载定时器,用于系统的 1ms Tick。
3.1、MCU
首先需要在 MCU 中将需要使用的定时器资源分配到 GPT 软件模块。(这里的 GPT 是 AutoSar 中的软件抽象定义,区别于硬件 GPT12)具体操作如下图:
然后需要在 MCU 的 General 中,设置 GPT 的分配系数,这里 GPT1 设置 4 分配。如下图:
3.2、Irq
我们使用 T3 连续触发中断,实现 Tick,因此需要在 Irq 模块配置一个 T3 中断优先级。如下图
若使用 ETAS 的 ISOAB 工具配置,会使用 OS 模块中配置的优先级。
3.3、GPT
首先需要在 General 中,使能一些常规接口使能配置,按初始配置即可。如下图:
GptChannelId:通道 ID;
GptAssignedHwUnit:硬件单元,这里可选 GTM 和 GPT12,我们使用 GPT12;
GptChannelMode:通道模式,我们是连续,设置为 GPT_CH_MODE_CONTINUOUS;
GptTimerChannelUage:预设的通道频率,自行配置,选择 GPT_TIMER_CHANNEL_NORMAL
GptChannelTickFrequency 和 GptChannelTickValueMax 都不需要配置,硬件固定的;
GptEnableWakeup:GPT 唤醒功能,需要配合 EcuM 使用,休眠唤醒逻辑中使用
GptChannelClkSrcRef:关联的 GPT 时钟。
对于 GptNotification 选项卡,这里用来配置 Gpt 中断的通知函数,GPT 中断中会调用该函数。但是若使用 ETAS 中的 OS 模块,则不需要配置该选项。中断回调函数在 OS 模块中生成。
最后配置 Cpt12TimerOutputModleConfiguration 选项卡,这里配置 GPT12 的硬件定时器。选择定时器 T2 和 T3,主、辅没有顺序要求。若选择 GPT12 的 GPT2 子模块,则只能配置 T5 和 T6。
3.4、ETAS 工具中配置
ETAS 工具如下图:
3.5、代码
首先需要在 EcuM 中添加 Gpt 初始化函数,如下图:
StartTimer 的 Tick 值是根据分频算出的,T3 的时钟频率为 100/4/1 = 25MHz,因此定时器实现 1ms 的 Tick 值为 25000。如下图
最后在 Timer 的中断回调函数中添加调度表回调函数,如下:
ISR(GPTT3SR_ISR)
{
Os_IncrementCounter_Rte_TickCounter();
}