英飞凌 Aurix2G TC3XX GTM 模块详解_英飞凌gtm模块-程序员宅基地

技术标签: c语言  英飞凌Aurix2G TC3XX芯片实战  

英飞凌 Aurix2G TC3XX GTM 模块详解

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


1 模块简介

GTM(Generic Timer Module,通用定时器)是德国博世公司开发的定时器内核架构,它包含一个模块框架,其中包含具有不同功能的子模块。这些子模块可以以可配置的方式组合起来,形成一个复杂的计时器模块,为不同的应用程序域和一个应用程序域中的不同类提供服务。由于这种可伸缩性和可配置性,计时器被称为通用计时器。

GTM 具有多个子模块,模块可单独工作,包括高精度定时功能、Pwm 波输出功能和 Icu 波形监控功能,也可进行组合实现各种复杂功能,如电机半桥死区输出功能霍尔电机控制功能等。

GTM 模块具有独立的内核,支持对其进行编程调试,也可作为芯片外设,通过外设寄存器进行访问控制。Aurix2G 系列芯片中集成的版本为 GTM IP v3.1.5.1,支持作为外设使用,通过 SPB 总线控制,且与芯片内部其他模块如中 IR 中断路由模块、Adc 模块等进行了连接设计,可配合实现复杂外设功能,同时解放 CPU 负载。

本文结合代码和配置,主要介绍时钟控制模块 CMU、定时器输出模块 ATOM/TOM、定时器输入模块 TIM,同时还将介绍 Aurix2G 芯片中 GTM 与 Port、Adc等连接的查询方式。

2 功能介绍

作为定时器模块,时钟的频率计算至关重要。Aurix2G 中 Gtm 的时钟源有两个,取决与用户设置的时钟频率。其计算公式如下:

f G T M = f S O U R C E G T M G T M D I V \begin{equation} f_{GTM} = \frac {f_{SOURCEGTM}} {GTMDIV} \end{equation} fGTM=GTMDIVfSOURCEGTM

f S O U R C E G T M = f S P B ∗ 2 i f G T M D I V = = 1 e l s e f S O U R C E G T M = f S O U R C E 0 \begin{equation} f_{SOURCEGTM} = f_{SPB}*2 if GTMDIV==1 else f_{SOURCEGTM} = f_{SOURCE0} \end{equation} fSOURCEGTM=fSPB2ifGTMDIV==1elsefSOURCEGTM=fSOURCE0

  • GTMDIV:GTM 分频系数,为寄存器 CCUCON0.GTMDIV 的值,0 表示 GTM 模块关闭
  • fSPB:外设总线时钟值,一般为 100MHz
  • fSOURCE0:系统总线时钟值,一般为 300MHz

也就是说,当 GTMDIV==1 时,GTM 的输入时钟频率等于外设总线时钟的 2 倍,否则等于系统时钟除以分频系数 GTMDIV。比如 SPB 为 100MHz 时,配置 GTMDIV 为 1,则 GTM 模块时钟为 2*100MHz=200MHz;系统时钟为 300MH 时,配置 GTMDIV 为 3,则 GTM 模块时钟为 300/3=100MHz。GTM 手册推荐时钟频率不高于 100MHz,主要考虑因素为功耗。

2.1 GTM 总览

GTM 子模块包括 ARU、BRC、FIFO、AFD、F2A、CMU、CCM、TBU、TIM、TOM、ATOM、DTM、MCS、MCFG、MAP、DPLL、SPE、ICM、CMP、MON,其架构框图如下图所示:

在这里插入图片描述

如图所示,GTM 内部由多个簇(cluster)组成,有些模块如 ATOMTOMSPE 在多个簇里面存在,每个簇中功能相同,具体的数量取决于芯片型号;而有些模块如 CMUTBU 只在主簇(Cluster0)中存在。每个簇有一个独立的输入时钟源,多个输入信号到 TIM 模块,多个输出经过 TOM/ATOM 然后从 DTM 输出;输入/输出信号一般是通过 Port 与外部进行信号交互,也可与其他模块如 Adc、Iom 等模块进行交互。

每个簇及其中的模块都有相应的配置寄存器,可直接通过 Aurix2G 的外设总线进行设置。

下面我们主要介绍 CMUTOMATOMTIM 模块。

2.2 CMU(Clock Management Unit)

2.2.1 功能介绍

时钟管理单元(Clock Management Unit, CMU)负责生成计数器和 GTM 的时钟。CMU 由三个子单元组成,包括 CFGUFXUEGU,为整个 GTM 模块生成不同的时钟源。CMU 的主时钟源是簇 0 时钟信号 cls0_clk,该信号由寄存器 GTM_CLS_CLK_CFG 中的位字段 CLS0_CLK_DIV 的值定义(默认为 2)。CMU 模块框图如图示。

在这里插入图片描述

CFGU(Configurable Clock Generation Unit,可配置时钟生成模块)可根据用户需求进行较大范围的时钟配置(分频参数为 24 位宽),是 CMU 主要的时钟控制单元。其输入源为簇 0 的输入时钟 CLS0_CLK,可输出 8 路不同频率的时钟,供 TIM, ATOM, TBU 等模块使用,且连接丰富,例如同一 ATOM 模块内部多个通道可使用不同的 CMU_CLK。每路 CMU_CLK 与 GTM 总时钟源之间有 3 层分频,第一层经过簇 0 分频得到 CLS0_CLK,第二层经过 Global Clock Divider 得到 CMU_GCLK_EN,然后经过 Clock Sourcex Divider 分频得到 CMU_CLKx。计算公式如下:

f C M U C L K x = f G T M C L S 0 C L K D I V ∗ G L O B A L D I V ∗ C L K C N T x \begin{equation} f_{CMUCLKx} = \frac {f_{GTM}} {CLS0CLKDIV*GLOBALDIV*CLKCNTx} \end{equation} fCMUCLKx=CLS0CLKDIVGLOBALDIVCLKCNTxfGTM

  • fCMUCLKx:CMU 通道 x 可配置时钟输出,x 取 0~8
  • fGTM:GTM 模块主时钟
  • CLS0CLKDIV:簇 0 分频系数,寄存器 CLS0_CLK_DIV,只可选 1 或者 2,默认为 2,即半分频
  • GLOBALDIV:全局分频,为 GCLK_NUM/GCLK_DEN 的值
  • CLKCNTx:CMU 时钟通道 x 分频系数,对应寄存器 CLK_CNT

FXU(Fixed Clock Generation Unit)为固定分频时钟,所有通道共用一个时钟源,时钟源可选 CFGU输出的通道时钟或者 CMU_GCLK_EN 时钟,如图所示其每路分频参数不可配置。FXU 主要供 TOM 模块使用。当选择 CMU_GCLK_EN 为时钟源时,计算公式如下:

f C M U C L K x = f G T M C L S 0 C L K D I V ∗ G L O B A L D I V ∗ F X C L K D I V x \begin{equation} f_{CMUCLKx} = \frac {f_{GTM}} {CLS0CLKDIV*GLOBALDIV*FXCLKDIVx} \end{equation} fCMUCLKx=CLS0CLKDIVGLOBALDIVFXCLKDIVxfGTM

与可配置 CMU 时钟的计算公式仅有 FXCLKDIV 不同。

EGU(External Generation Unit)可供外部外设使用,也可作为第二时钟域输出到其他 GTM 模块使用。

2.2.2 MCAL 配置

GTM 在 MCAL 中没有专门的模块,而是依附在 MCU 模块内的。详细配置如下:

  1. 这里我们先来到 MCU->GtmGlobalConfiguration_0->GtmClusterConf_0,配置 Cluster0 的分频值,也就是上文的 CLS0CLKDIV,这个值只能选 0,1,2,0 表示关闭该簇。
    在这里插入图片描述

  2. 然后我们回到 MCU->GtmGlobalConfiguration_0->General,这里有两个参数,就是上文中决定全局分频 GLOBALDIVGCLK_NUMGCLK_DEN,这里一般都配置成 1,也就是全局 1 比 1 分频。
    在这里插入图片描述

  3. 然后下面有一个 FixedClock 配置,前面提到因为 FXU 是不可配置分频的,但是可以配置时钟源和开关,就是下面这两个配置参数。
    在这里插入图片描述

  4. 然后再往下就是 CFGU 的分频配置了,一共有 8 路,和对应的时钟开关。这里注意 CLKCNTx 等于配置参数加 1,也就是说 0 代表 1 比 1 分频,3 表示四分之一分频
    在这里插入图片描述

  5. 然后对应用到 FXU 的模块比如 TOM,使用时的分频值就需要根据上图选用的 FXU 中的固定分频比进行计算。

这里我们完成了 CMU 的时钟配置,假设我们配置的 GTM 总时钟为 100MHz,结合上面的配置,Cluster0 经过 2 倍分频得到 CLS0_CLK=50MHz**,全局分频配置为 1 则 CMU_GCLK_EN**=50MHz。CMU_CLKx 的分频参数全部为 1,也就是 CMU_CLKx(x=0~7)=50MHz。FXU 时钟源选择 CMU_GCLK_EN=50MHz,则各路 CUM_FXCLK 根据固定分频比计算得出。

2.3 TOM(Timer Output Module)

2.3.1 功能介绍

定时器输出单元 TOM 是 GTM 的主要输出模块之一,负责输出 Pwm****波形,一般每个 GTM 簇内有一个 TOM 模块,一个 TOM 模块内最多 16 个通道,每个通道可以独立输出,也可以进行关联做 Pwm 波的相位对齐,TOM[i]_CH[x]_OUT 表示 TOMi 的通道 x 输出。TOM 模块的模块框图如图所示:

在这里插入图片描述

每个 TOM 模块内部有两个 TGC 子模块,分别控制 8 个通道的使能及配置更新;每个 TGC 可从 TBU 模块选择一路通道作为时间基准以进行对齐同步。右上角的 CMU_FXCLK 为 TOM 输入时钟,是计算 Pwm****周期占空比的 Tick 基准,这里每路通道都可任意从 5 路 CMU_FXCLK 通道中任选其一,可以灵活配置精度。

2.3.2 TOM 通道

每个 TOM 模块有 16 个通道,每个通道包含两个比较单元 CCU0CCU1,以及一个输出单元 SOU。通道之间些许差异,通道 8~15 不支持 SPE,通道 0~7 如图所示:

在这里插入图片描述

CCU0 中包含一个 16 位累加器 CN0 和一个 16 位比较器 CM0,CCU1 主要包含一个 16 位比较器 CM1。CN0 在通道启动后会持续累加,在不同模式下有不同的归零逻辑;CM0 和 CM1 两个比较器用于控制通道输出的占空比和周期,无法直接修改,需要通过操作 SR0SR1 两个影子寄存器来进行修改。通道有两种输出模式,一种是持续累加模式(边缘对齐),一种是 Up-Down 模式(中央对齐)。

持续累加模式(边缘对齐)

持续累加模式下 CN0 会从 0 开始累加,达到 CM0 之后归零继续累加。

当 CN0 归零时,SOU 会根据 SL(Signal Level)输出起始电平;当 CN0 到达 CM1 时,SOU 会翻转电平。因此 CM0 的值为周期 Tick 值占空比****为 CM1/CM0。其输出波形与寄存器的值如下图所示,为边缘对齐:

在这里插入图片描述

Up-Down 模式(中央对齐)

在 Up-Down 模式下,CN0 仍然会持续累加,但是在到达 CM0 之后不归零,而是反向递减,之后到达 0 之后再累加。递增经过 CM1 时,设置电平为 SL,递减经过 CM1 时,设置电平为 SL 取反。其输出波形与寄存器关系如下图所示:

在这里插入图片描述

在该模式下其电平起点在周期中间,因此称为中央对齐,一般为电机控制使用。在该模式下其周期 Tick 值为 2*CM0占空比****仍为 CM1/CM0

除了以上两种模式 TOM 还支持通道相位对齐功能,即前一个通道复位时发出 Trigger 信号,当前通道收到信号后 CN0 归零,电平复位为初始电平,最终实现对齐功能。

2.3.3 MCAL 配置

TOM 可以被很多 MCAL 使用,比如 ADC、PWM、WDG、GPT、OGU 等,因此 TOM 的资源分频和引脚选择在 MCU 配置中,详细的其他配置在对对应的使用模块中。这里使用 TOM 实现一路 PWM 波作为实例,实现一个每秒闪烁一次的 LED 灯功能。

  1. 首先我们来到 MCU->McuGtmAllocationConf_0->McuGtmTomAllocationConf_0->McuGtmTomChannelAllocationConf_13,这里我们选用 TOM0_13,将硬件资源分配给 PWM
    在这里插入图片描述

  2. 然后我们来到 MCU->GtmGlobalConfiguration_0->GtmTomGlobalConf_0->GtmTomGroupConf_0,这里有一个 TBU 时间基准模块的选择,这里我们不需要动,直接用默认的 TOM_ACT_TB_TBU_TS0 就行,这个不影响输出的 PWM 波形,只是不同模块的同步基准。
    在这里插入图片描述

  3. 然后在 MCU->GtmGlobalConfiguration_0->GtmTomGlobalConf_0->GtmTomChannelConf_13,选择我们需要输出的 PIN 脚,GTM 与 Port 的连接关系我们下文会讲,这里我们根据硬件 LED 等的位置,选择 P00.6
    在这里插入图片描述

  4. 然后在 PWM 模块配置一路通道。如下硬件选择 GTMPwmDutycycleDefault占空比 TICK 值,PwmPeriodDefault周期 TICK 值,关于周期占空比的计算,下面我们会讲。PwmPolarity 极性选择起始高电平。
    在这里插入图片描述

  5. 然后我们来到下一页 PwmChannelClass,这里配置成 PWM_VARIABLE_PERIOD,能够运行时修改波形参数。
    在这里插入图片描述

  6. 然后我们来到 GtmTimerOutputModuleConfiguration 这里,配置 PWM 使用 TOM 通道和时钟源,这里我们选择刚才 MCU 中配置的 TOM0_13,然后根据需求选择分频值。
    在这里插入图片描述
    这里我们讲一下怎么计算周期和选择时钟源,因为我们的目标是实现 LED 灯一秒闪烁一次,也就是周期为 1s,占空比为 50%,注意 TOM 的时钟 TICK 是 16 位的,也就是最高 65535,因此频率选择太高的话分不出低频的信号。通过前面计算我们得出 FXU 的输入时钟为 50****MHz,如果我们选择 FIXED_CLOCK1,分频 2 的 4 次方为 16 分频,那么频率为 3.125MHz,根据公式:
    f = T I C K T \begin{equation} f = \frac {TICK} {T} \end{equation} f=TTICK
    那我们的 TICK 最小为 3.125*10^6,65535 是肯定不够的。通过计算选择 FIXED_CLOCK2 也是不够的,因此我们选择 FIXED_CLOCK3,分频为 2 的 12 次方,通过计算得出 FIXED_CLOCK3 时钟频率为 50MHz/2^12=12207****Hz,小于我们的 TICK 位宽的。

    然后再根据上面公式,算出周期 TICK=Tf=12207Hz1s=12207次。占空比我们选择 50%,因此占空比 TICK=12207*50%=6103.这里我们在周期 TICK 配置参数填上 12207,但是占空比这里不能直接填 6103,因为 MCAL 中对占空比的配置有额外定义。我们看这个配置的描述:
    在这里插入图片描述
    这段话的意思是如果通道 Class 没有配置为 PWM_FIXED_PERIOD_SHIFTED,则计算的时候 0 表示 0 占空比,0x8000 表示 100% 占空比,只有当配置了 PWM_FIXED_PERIOD_SHIFTED 的时候,才是按照实际占空比计算。因此我们需要配置 50% 占空比,TICK 为 0x4000,也就是上图中的 16384

    但是配置生成的代码这里,我们可以看出工具帮我们计算了的,得到的寄存器值实际还是我们计算出来的值(16 进制):
    在这里插入图片描述

  7. 最后我们还需要配置一下 Port,根据 DataSheet 选择对应的输出模式 ALT1(DataSheet 中查询引脚模式对应功能)。
    在这里插入图片描述

到这里我们就完成了 LED 闪烁的配置,代码中只需要对 Port 和 Pwm 模块进行初始化,TOM 通道就会发波,LED 灯就会闪烁。

	Port_Init(&Port_Config);
	Pwm_17_GtmCcu6_Init(&Pwm_17_GtmCcu6_Config);    
	/* 17是Infineon识别号,Pwm可以用Gtm也可以用Ccu6,所以这里名字后缀包含了二者 */

Pwm控制LED灯闪烁

2.4 ATOM(ARU-connected Timer Output Module )

ATOM 和 TOM 一样同为定时器输出单元,能够实现 TOM 的功能,同时功能更加强大。ATOM 和 TOM 主要有以下几点不同:

  • ATOM 可以通过路由功能和其他模块如 MCS、DPLL、PSM 进行数据交互,实现复杂功能
  • ATOM 可跟根据 TBU 的时间基准进行输出
  • ATOM 可以进行串行数据输出
  • ATOM 定时器位宽为 24 位,比 TOM 多了 8 位
  • ATOM 使用的时钟源为 CFGU,也就是有更灵活的分频配置的时钟源,而 TOM 使用 FXU
  • 一路 ATOM 为 8 通道,而一路 TOM 为 16 通道

除此之外,ATOM 和 TOM 在使用方法上基本相同。

2.4.1 功能介绍

ATOM 的结构和 TOM 类似,内部有一个 AGC 控制单元,和 8 路通道控制单元,有 TBU 时间基准输入和 CMU_CLK 时钟输入。

在这里插入图片描述

AGC 类似 TOM 的 TGC,主要控制模块的使能、通道参数等,通道控制单元 ATOM_CHx 负责通道的输出。这里我们注意到,和 TOM 一样,ATOM 也可以进行关联触发,图上位置 ATOM_TRIG_[i-1]表示可以接收来自上一个 ATOM 的触发,同时可以向下传递生成 ATOM_TRIG_[i],以进行通道的相位同步。

2.4.2 ATOM 通道

ATOM 通道相对于 TOM 通道,多了一个 ARU 通信接口 ACI,用来进行 ARU 数据路由的交互。

在这里插入图片描述

ATOM 通道中也是有两个比较单元 CCU0CCU1,在不同的 ATOM 模式下有不同的功能。ATOM 模块有以下功能:

  • ATOM Signal Output Mode Immediate (SOMI)
  • ATOM Signal Output Mode Compare (SOMC)
  • ATOM Signal Output Mode PWM (SOMP)
  • ATOM Signal Output Mode Serial (SOMS)
  • ATOM Signal Output Mode Buffered Compare (SOMB)

其中 SOMI 模式为立即输出模式,即通过 ACI 接口接收 ARU 路由数据,进行通道的立即输出。

SOMC 为比较输出模式,可以与 TBU 模块的时间基准进行比较,根据结果进行通道输出。

SOMP 即 PWM****输出模式,也是最常用的模式,功能上同 TOM。同样可以实现边缘对齐和中央对齐波形输出。

SOMS 模式下,ATOM 可以进行串行数据输出。

SOMB 模式可根据 CM0 和 CM1 两个 Buffer 中的值与 TBU 的比较结果进行 PWM 输出。

另外需要注意不同的模式下寄存器的功能有所不同,使用上需要参考手册的描述。

2.4.3 MCAL 配置

在 MCAL 中 ATOM 一般使用 SOMP 模式,与 TOM 功能类似,如果要进行复杂的功能,则需要进行手写来实现。这里在功能上 ATOM 的配置和 TOM 的配置基本类似,就不加以赘述了。

2.5 TIM(Timer Input Module)

2.5.1 功能介绍

定时器输入单元 TIM 是 GTM 中的重要模块,负责过滤和捕获 GTM 的输入信号。可以在 TIM 通道内测量输入信号的几个特性。对于高级数据处理,TIM 模块检测到的输入特性可以通过 ARU 路由到 GTM 的后续处理单元。单个 TIM 模块的功能框图如图所示:

在这里插入图片描述

每个 TIM 内部的通道数量取决于硬件型号,一般是 8 路。每路有两个输入信号,一个是 TIM 主输入 TIM_IN,一般用于连接外部 Port 口;另一个是辅助输入 AUX_IN,用于采集测量 GTM 中 TOM 或 ATOM 的输出信号。TIM 的输入时钟源为 CMU 的 CFGU 模块,也就是灵活可配置时钟源。同样 TIM 也有 TBU 时间基准模块输入。

2.5.2 TIM 通道

TIM 通道内部有输入选择模块、过滤模块、中断输出模块、超时检测模块 TDU、和 TIM 测量单元 TIM_CHx

在这里插入图片描述

输入选择模块主要用来进行输入源的选择,TIM 的输入不仅可以选择本通道,还可选择 x-1 通道,以及辅助通道。

在这里插入图片描述

TIM 过滤模块 FLT 负责信号的过滤,我们知道既然是采样测量就有可能出现信号抖动,那就需要过滤模块。该模块有不同的模式,在这里就不展开讨论了。

TIM 采样测量单元 TIM_CHx 是 TIM 通道的核心模块,用于进行信号的测量,根据不同的模式,有不同的测量输出内容。

在这里插入图片描述

每个 TIM 通道都可以从 8 路 CMU_CLK 可配置时钟源中灵活选用。FEDGE_DETx 则是通道经过过滤后的信号输入,如果没有使能过滤功能,FEDGE_DETx 就是直接的外部输入。输入信号每次上升沿和下降沿都可以产生对应的中断信号。FEDGE_DETx 最终也会输入到信号测量单元(SMU)中,以进行基于不同模式下的测量。同时 TIM 也会使用右上角的 TBU 时间基准输入,进行时间戳功能的实现。最后测量的结果会输出到 GPR0GPR1 中,不同的模式下这两个寄存器有不同的含义。

TIM PWM Measurement Mode (TPWM)

TIM 的 PWM 输入测量模式是最常用的模式,用来测量信号的 PWM 输入信号的周期和****占空比信号。

根据上图,在 TPWM 模式下,在每一个上升沿(假设高电平为起始),CNT 会从零开始计数,CNT 值会根据 CMU_CLKx 的输入进行累加,当出现下降沿时,会将值保存到 CNTS 中,CNT 继续累加。在下一个上升沿时 CNTS 中存储的值会传递到 GPR0 中,CNT 中的值会传递到 GPR1 中。因此 GPR1 为周期 TICK 值,GPR0 为占空比****TICK 值。至此完成了一个周期的测量。如果测量成功且值合理,则 TIM[i]_CH[x]_IRQ_NOTIFY 寄存器中的 NEWVAL 位会置位。

**TIM Pulse Integration Mode (TPIM) **

TIM 脉冲积分模式可以用来测量某个脉冲的边沿时间,比如设置 DSL**=1**,测量高电平时间,那在上升沿时 TIM 通道开始进行采样,当下降沿时测量结束,测量结果值可根据配置选择存放到 GPR0 或者 GPR1,具体可查询寄存器 EGPR0_SEL, EGPR1_SEL, GPR0_SEL, GPR1_SEL。

**TIM Input Event Mode (TIEM) **

在 TIM 输入事件模式下,TIM 能够进行边沿计数。可以通过配置选择上升或者下降沿计数,也可以双边计数。计数的结果同样可以选择配置到 GPR0 或者 GPR1,在每次计数值 CNT 发生变化时,结果寄存器都会更新。

**TIM Input Prescaler Mode (TIPM) **

TIM 输入分频模式下,可通过设置触发中断的 Cnt 数量,来进行分频信号接收。通过设置 CNTS 寄存器的值,来决定输入信号多少次跳变以后,TIM[i]NEWVAL[x]****IRQ会置位,以进行中断触发,以达到分频计数的功能。

**TIM Bit Compression Mode (TBCM) **

位压缩模式下可进行多路组合的位检测功能,比如将多路的输入连接到一起,任意一路信号都可触发中断通知。同时组合的数据也能够被 ARU 路由到其他模块。

在这里插入图片描述

**TIM Gated Periodic Sampling Mode (TGPS) **

在门控采样下,可以设置电平的定时触发功能。比如信号发生上升沿跳变,且高电平大于 N 个时钟周期则触发中断。可配置目标输入电平 DSL,目标时钟 TICK 数来进行门控电平时间长度捕获。

**TIM Serial Shift Mode (TSSM) **

在 TIM 串口输入模式下,可进行输入的串行输入功能,配合对端 GTM 模块的 ATOM 串口输出或其他数据串口输出,可进行数据交互。

2.5.3 MCAL 配置

TIM 具有多种采样模式,最常见的就是 PWM 采样模式,本文就以该模式为例,进行输入采样配置。需要配置的模块有 Icu 和 MCU。我们配置 P02.4 为 Pwm 输出,使用 TOM0_12,周期 1ms,占空比 50%。这里参考上文中 TOM 配置,不再详细赘述。配置 P02.5 为 Icu 输入,使用 TIM0_5,捕获 P02.4 的输出内容。

  1. 首先我们来到 MCU->McuGtmAllocationConf_0->McuGtmTimAllocationConf_0->McuGtmTimChannelAllocationConf_5,将硬件资源分配给 Icu 模块。
    在这里插入图片描述

  2. 然后在 MCU->GtmGlobalConfiguration_0->GtmTimGlobalConf_0->GtmTimChannelConf_5,为 TIM0_5 选定引脚:
    在这里插入图片描述

  3. 然后我们来到 Icu 模块中,创建一路 Icu 通道,选择上升沿起始,选择 SIGNAL_MEASUREMENT,硬件选择 GTM:
    在这里插入图片描述

  4. 然后在 IcuSignalMeasurement_0 页面配置为 PWM 采样(ICU_DUTY_CYCLE):
    在这里插入图片描述

  5. 然后到 GtmTimerInputConfiguration_0 配置采样相关参数设置,这里我们选定 TIM0_5 通道即可,其他配置不使用。这里需要注意的是 TimChannelClockSelect 参数,该参数决定 TIM 通道使用的时钟源,时钟源频率是计算采样数据的关键参数,因为采样得到的是 TICK 值,需要结合采样频率进行计算。
    在这里插入图片描述

  6. 最后我们需要在 Port 中将 P02.5 配置为输入模式即可(其实默认就是输入),与输出不同的是,输入不需要选择模式。
    在这里插入图片描述

  7. 然后在初始化中同样初始化 Icu 模块,并启动测量,然后在周期任务中读取结果(也可以直接读取寄存器 GPR0 和 GPR1)。

Icu_17_TimerIp_Init(&Icu_17_TimerIp_Config);    /* 初始化模块 */
Icu_17_TimerIp_StartSignalMeasurement(IcuConf_IcuChannel_IcuChannel_0); /* 启动测量 */

Task()
{
    
    Icu_17_TimerIp_DutyCycleType PwmMeasureValue;
    Icu_17_TimerIp_GetDutyCycleValues(IcuConf_IcuChannel_IcuChannel_0, &PwmMeasureValue);
}

在这里插入图片描述

最后我们需要对上面测量得到的结果进行换算,因为 TIM 口测量得到的是 TICK 值,我们可以根据 CMU 时钟分频,以及 TIM 通道时钟源选择,得出 TIM 当前使用的时钟源为 50MHz,根据频率时间公式,得出采样的周期和占空比:

周期:P=PeriodTime/f=50000/50MHz=0.001s,
占空比:Duty=ActiveTime/PeriodTime=24992/50000=50%。

这里有一个关键的注意事项,就是 TIM 采样寄存器的位宽问题,TIM 采样的宽度为 24 位,也就是最大结果为 0xFF FFFF,在 50MHz 输入时钟下,我们用频率时间公式得出最大测量周期为 335.5ms,超过该时长结果寄存器就会溢出,得到错误值

3 GTM 连接

在 Aurix2G 芯片中,GTM 和其他模块提供了非常丰富的连接,这些连接在使用中非常灵活,下面我们就通过实例介绍如何查询手册进行引脚连接,需要用到的手册包括芯片用户手册(芯片用户手册,非 Family 手册)、DataSheet

3.1 Port 连接

GTM 的输入和输出模块与 Port 引脚有着丰富的连接,GTM 与 Port 的连接中间存在 MultiPlexer 转接器,能够实现多对多的丰富连接,同一个Pin能够选择多个 GTM 通道,一个 GTM 通道也可以选择多个 Pin 脚。下面介绍如何查询。

3.1.1 TOM/ATOM 与引脚连接

下面我们通过实例讲解如何查询 Port 引脚与 ATOM/TOM 的连接。

在这里插入图片描述

  1. 第一步,如果选定了某个引脚,想要查询对应的 Port,首先打开 DataSheet,查询该引脚的输出信息。比如 P02.4,可以看到表中该引脚支持的所有功能以及配置选择,这里 GTM 输出选择 O1,我们得到 GTM_TOUT4 信息(IOM_REF0_4 为 IOM 监控连接,与输出无关)
    在这里插入图片描述

  2. 然后在芯片型号对应的用户手册中,查询 GTM 连接 Table 234,我们通过 TOUT4,得到查表信息:TOUTSEL0_SEL4
    在这里插入图片描述

  3. 点击 Page92 到对应的寄存器定义位置,可以看到 TOUTSEL0 的寄存器,然后查询 SEL5 位域,到这里我们就得到了这个引脚所能够连接的所有 GTM 对应的输出。
    在这里插入图片描述
    在这里插入图片描述
    如果要查询某个 TOM 能够输出到哪些 PIN 脚,则在用户手册中反向搜索即可,这里有一个技巧,在 MCAL 配置中可以直接下拉查看某个通道的可用 Pin 脚。
    在这里插入图片描述

3.1.2 TIM 与引脚连接

TIM 与其他模块的多对多关系如图所示。

在这里插入图片描述

TIM 的引脚连接相对简单,我们打开 DataSheet,搜索引脚即可以看到该引脚输入模式下能够连接的 TIM 通道:

在这里插入图片描述
打开用户手册在寄存器表格中也可以直接看到某路 TIM 通道能够连接的 Port 引脚。

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

3.2 ADC 连接

Aurix2G 中 GTM 和****ADC 之间提供了丰富的连接,用户可以用 GTM 进行硬件采样触发功能,关于 ADC 的内容,我们后续章节再讨论,本文中就只关注 GTM 与 ADC 的连接。

我们打开芯片用户手册(非 Family 手册)26.3.9 GTM to EVADC Connections 章节,可以看到 GTM 和 ADC 之间也存在一个 Multiplexer,以进行多对多连接。

在这里插入图片描述

从图上我们可以看出,从左侧 GTM 的输出从 ADCTRIG0ADCTRIG4 一共 5 路输出,每路输出共 12 组(Aurix2G 最多 12 路****ADC,此为对应),每组 16 个选择源。也就是说每路输出都可以连接任一 ADC 单元,且每路输出对任一路 ADC 单元提供最多 16 种选择。对于每路 ADC 硬件来说,也可以从 5 组 Trigger 中选择一组进行连接。

这里的连接比较复杂,也是最容易迷糊的地方。我们通过实例来为大家讲解具体连线及配置方式。

  1. 首先我们来到 Table 241 Connections of ADC_TRIGx Signals to ADC/SENT Modules,这里根据我们需要触发的 ADC,观察表种输出源,比如我们需要触发 ADC_G3,在表中 5 路 Trigger 中都能够支持,这里我们随机选择 Trigger2(先查询 GTM 资源,根据情况可以更换 Trigger)
    在这里插入图片描述

  2. 然后我们来到 Table 240 GTM to EVADC Connections Registers Overview,我们选择的是 Trigger2ADC_G3,则对应的寄存器为 ADCTRIG2OUT0(如果是 ADC_G8 到 G11,则需要查询 ADCTRIG2OUT1)。
    在这里插入图片描述

  3. 我们来到 ADCTRIG2OUT0 寄存器,因为选择 ADC_G3,所以我们对应的是 SEL3 位域(这里 ADC3 和 ADC4 的触发源相同,所以寄存器域定义相同),从中我们可以选择第 14 个,TOM1_15(这里视硬件资源情况而定,如果已经被占用则需要换其他路 Trigger)。
    在这里插入图片描述
    在这里插入图片描述

  4. 然后我们来到 MCAL 配置,MCU->GtmGlobalConfiguration_0->GtmTriggerForAdc,将 GtmTriggerForAdc_3 行的 GtmAdcTrigger2Select 列,置为 14。(这里代表对应的 ADC 硬件,代表对应的某路 Trigger)
    在这里插入图片描述

  5. 至此我们完成了 GTM 触发源的配置,然后需要到 ADC 中对应的通道选择该触发源,这里来到 ADC3 中的 Group,选择硬件触发,触发源刚才我们配置的 Trigger2,所以 AdcHwExtTrigSelect 这里选择 ADC_TRIG_10_GxREQTRK_GTM_ADCx_TRIG2
    在这里插入图片描述

  6. 然后 AdcHwTrigSignal 这页我们选择上升沿
    在这里插入图片描述

  7. GtmTriggerTimerConfig_0 这里就可以根据自己的实际触发需求,配置触发频率,这里我们选择 1ms 触发一次采样。这里需要注意触发间隔时间不能过长,否则超出定时器位宽,出现非预期的频率,原理同前面的 TIM 采样。
    在这里插入图片描述

  8. 然后我们在代码中,需要进行 Adc 的初始化,设置结果 Buffer硬件触发的使能(使能这里会自动配置 TOM 参数),然后在周期中读取结果值,也可配置中断读取。我这里没有打开中断,直接看的结果寄存器。

Adc_Init(&Adc_Config);
Adc_SetupResultBuffer(AdcConf_AdcGroup_AdcGroup_3_HW, &Adc3GroupHWResult);
Adc_EnableHardwareTrigger(AdcConf_AdcGroup_AdcGroup_3_HW);

在这里插入图片描述

4 小结

本文介绍了 Infineon Aurix2G TC3XX 系列芯片中 GTM 模块硬件原理,并借助配置及代码示例,描述了配置和开发过程。GTM 作为博世 IP 的芯片内核,有着非常强大的功能,且 Aurix2G 芯片对其做了丰富的连接集成,为开发者提供了广阔的创造空间。

参考资料

  1. GTM-IP Specification.pdf (Revision: 3.1.5.1 )
  2. Infineon-AURIX_TC37x-UserManual-v02_00-EN.pdf
  3. Infineon-SAK-TC37x-DataSheet-v01_01-EN.pdf
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44000419/article/details/135183415

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签