文章目录
- 1. GTM结构框图
- 1.1 模块简介
- 1.2 ARU数据路由原理
- 2. 时钟管理单元(==CMU==)
- 2.1 可配置的时钟生成模块(==CFGU==)
- 2.2 固定时钟生成(==FXU==)
- 3.时间基准单元(==TBU==)
- 4.定时器输入模块(==TIM==)
- 4.1 TIM滤波功能(FLT)
- 4.2 TIM滤波模式
- 4.2.1==即时边缘传播模式==
- 4.2.2 ==独立去毛刺时间模式(上下计数器)==
- 4.2.3==独立去毛刺时间模式(保持计数器)==
- 4.3 超时检测单元(TDU)
- 4.4 TIM通道测量模式
- 4.4.1 ==PWM测量模式(TPWM)==
- 4.4.2 ==外部捕获TIM PWM测量模式(TPWM)==
- 4.4.3 ==脉冲积分模式(TPIM)==
- 4.4.4 ==TIM输入事件模式(TIEM)==
- 5. 定时器输出模块(TOM)
- 5.1 TOM全局通道控制(TGC0、TGC1)
- 5.2 TOM通道(TOM_CHx)
- 5.2.1仅同步更新占空比
- 5.2.2仅异步更新占空比
- 5.2.3 ==TOM通道连续模式==
- 5.2.4 ==TOM通道单次模式==
- 5.2.5==Up-Down模式(中心对齐模式==)好像TC3xx系列中才有这个模式(TC275数据手册上没有介绍到----有待考证)
- 5.2.6 TOM BLDC支持
- 6. 高级定时器输出模块(ATOM)
- 7. 传感器相位评估模块(SPE)
- 代码
- 效果如下
GTM构建了一个多功能的计时器平台,它能够支持各种应用程序和不同的应用领域。这个平台能够根据应用领域的需求,灵活地配置多种子模块,比如 ATOM、BRC、MCS、PSM、SPE、TIM、TOM等,以满足不同设备的需求。
1. GTM结构框图
GTM模块的系统框图如下图所示
1.1 模块简介
GTM的核心部件是高级路由单元(ARU),它位于整个系统的中心,大多数子模块都围绕它布置并与之相连。这个高级路由单元与广播模块(BRC)和参数存储模块(PSM)共同构成了GTM的基础架构。ARU的功能是将数据从一个子模块传输到另一个子模块,这个过程是确定性的,通过循环调度连接通道来完成,确保了数据传输的最坏情况下的往返时间。
在数据传输方面,ARU处理的数据字长度为53位。这些数据字在逻辑上可以划分为三个部分:位0到23和位24到47通常用于存储GTM操作寄存器的数据;而位48到52则用于携带控制信息,这些信息可以在子模块之间传递。这些控制位被称为ARU控制位(ACB),它们对于不同的子模块来说可能具有不同的意义和用途。简而言之,ARU通过精确的数据路由和控制位管理,确保了GTM系统内部数据传输的高效和有序。
BRC能够将数据从一个源模块分发连接到ARU的多个目标模块。PSM子模块由三个子单元组成,即AEI-to-FIFO数据接口(AFD)、FIFO-to-ARU接口(F2A)和FIFO本身。PSM可以作为传入数据特征的数据存储器,也可以作为传出数据的参数存储器。该数据存储在一个逻辑上位于FIFO子单元内的RAM中。
信号首先通过计时器输入模块(TIM)进入GTM系统。TIM模块的功能是接收外部信号,并对其进行处理。它们具备过滤输入信号的能力,并能够为这些信号添加额外的信息。
时钟管理单元(CMU)为GTM系统提供多达13个内部时钟和3个外部时钟,作为系统时钟的分配器。它还负责驱动其他子模块中的计数器。
时间基准单元(TBU)为GTM提供三个独立的公共时间基准,其中两个可以通过数字锁相环(DPLL)处理,以生成更高频率的时钟信号。这些信号的选择和处理在TIM0和MAP子模块中进行。
输出信号由定时器输出模块(TOM)和高级定时器输出模块(ATOM)生成,TOM可以产生PWM信号,ATOM则用于更复杂的输出控制。TOM还集成了驱动无刷直流电机的功能,并与TIM模块和传感器模式评估模块(SPE)配合,支持无刷电机应用。MCS模块能够从ARU读取数据,处理TIM模块路由的传入数据,以及操作其RAM中的数据。比较模块(CMP)和监控模块(MON)负责安全功能,CMP比较ATOM或TOM的输出,并将结果传递给MON,MON还监控ARU和CMU的活动。GTM的子模块产生的中断源被集中到中断集中器模块(ICM),简化了中断管理。
1.2 ARU数据路由原理
ARU的功能如下:它像一个循环的邮递员一样,依次访问每个连接的模块,检查它们是否需要数据。如果一个模块请求数据,并且相应的数据源有数据准备好,ARU就会把数据送过去,并且告诉数据源和目的地数据已经在路上了。一旦数据送达,数据源就会标记这些数据为“已送出”,表示目的地已经接收并使用了这些数据。
2. 时钟管理单元(CMU)
时钟管理单元负责计数器和GTM的时钟生成。CMU由三个子单元组成,它们为整个GTM产生不同的时钟源。下图显示了CMU的方框图。可配置的时钟生成(CFGU)子单元为以下GTM子模块提供了8个专用的时钟源: TIM、ATOM、TBU和MON。该子模块的每个实例可以选择任意时钟源,以指定宽度的时基。
固定时钟生成(FXU)子单元为TOM子模块和MON子模块生成预定义的不可配置时钟CMU_FXCLK[y](y:0-4)。
2.1 可配置的时钟生成模块(CFGU)
CFGU(Configurable Clock Generation Unit,可配置时钟生成模块)是时钟管理单元(CMU)的核心部分,它能够产生多种时钟信号供GTM内部的多个模块使用。CFGU具备高度的灵活性,可以根据需要生成不同频率的时钟信号,以适应不同模块的时钟需求。CFGU的主要功能包括:
•为GTM的多个模块(如TIM、ATOM、TBU等)提供多达8路不同频率的时钟输出。。
•支持24位的参数配置,实现非常精确的时钟分频。
•与GTM总时钟源之间存在三层分频机制,分别是:第一层:通过簇0分频得到CLS0_CLK。第二层:通过Global Clock Divider得到CMU_GCLK_EN。第三层:通过Clock Sourcex Divider分频得到CMU_CLKx。
CFGU的工作原理可以通过以下公式表示:
其中, f_CMUCLKx是CMU通道x的可配置时钟输出,f_GTM是GTM模块的主时钟,CLS0CLKDIV是簇0的分频系数,默认值为2,CLOBALDIV是全局分频值,CLKCNT_x是CMU时钟通道x的分频系数。
2.2 固定时钟生成(FXU)
固定时钟生成模块提供固定分频的时钟源供GTM内部的其他模块使用。FXU的特点是其提供的时钟频率是预定义的,不可通过配置寄存器进行调整,因此被称为“固定”时钟。
FXU的主要特点包括:
•固定分频:FXU提供固定的时钟分频选项,这些分频选项在设计时已经确定,用户无法更改。
•有限通道:FXU通常有有限数量的通道,每个通道提供不同的固定时钟频率。
•专用时钟源:FXU的时钟源可以是CMU的某个输出,或者其他预定义的时钟源。
•模块使用:FXU提供的时钟通常用于GTM内部的特定模块,如TOM和MO等。
FXU的工作原理相对简单,它根据预定义的分频参数,从其时钟源获得输入时钟,并生成固定频率的输出时钟。例如,如果FXU的某个通道被配置为从CMU的某个输出获取时钟,并具有特定的分频参数,那么它将不管输入时钟如何变化,始终输出一个固定频率的时钟。
3.时间基准单元(TBU)
时间基准单元(TBU)在GTM系统中的作用是提供稳定的时间基准信号,这些信号用于确保GTM内部不同子模块的事件能够同步进行。TBU的工作基于通道,每个通道都可以独立提供时间基准。
TBU还与GTM的其他子模块如TIM、ATOM等协同工作,实现如无刷直流电机控制等复杂功能。通过TBU,可以实现对输入事件的时间戳记录,以及使用这些时间戳作为参考,实现不同定时器输出事件的同步开始。
4.定时器输入模块(TIM)
定时器输入模块(TIM)在GTM系统中负责接收和处理输入信号,它能够测量信号的上升沿或下降沿的时间戳、当前电平状态、自通道启用以来的边缘计数,以及PWM信号的周期和持续时间,从而为系统提供精确的信号特性数据。
TIM系统框图如下所示:
在GTM系统中,每个专用输入信号都会在TIM模块的FLTx子单元中进行滤波处理。由于输入信号与系统时钟(SYS_CLK)同步,这会导致信号在滤波后有大约两个SYS_CLK周期的延迟。滤波完成后,信号会被传送到相应的TIM通道。测量结果可以通过AEI总线直接被CPU读取,或者通过ARU路由到GTM的其他子模块。此外,每个TIM通道都配备了一个超时检测单元(TDU),用于检测输入信号在指定时间内是否没有后续边缘。同时,来自TBU的2/3个时间基准信号被连接到TIM通道,以便为传入的信号提供精确的时间戳。
4.1 TIM滤波功能(FLT)
TIM子模块为每个输入信号提供了一个可配置的滤波器机制。这些过滤机制提供在FLT亚单元内部。FLT架构如图25-23所示。该滤波器包括时钟同步单元(CSU)、边缘检测单元(EDU)和与滤波器单元(FLTU)相关联的滤波器计数器。
滤波器模式可以单独应用于输入信号的下降和上升边缘。提供以下过滤器模式:
•即时边缘传播模式;
•独立故障消除时间模式(上/下计数器);
•独立故障消除时间模式(保持计数器)。
4.2 TIM滤波模式
4.2.1即时边缘传播模式
在检测到边缘后的即时边缘传播模式下,F_IN_SYNC上的新信号电平传播到F_OUT,一个TFLT_CLK周期内新信号电平保持不变,直到配置的接受时间到期。在接受时间期间,输入F_IN_SYNC上的每个信号变化对输出信号电平没有影响。
从上图可以看到,当输入信号F_IN_SYNC边沿发生跳变(上升沿)时,计数器FLT_CNT立即开始向上计数,在F_IN_SYNC上检测到的边缘被直接转移到F_OUT上。在计数器没有达到接受的时间FLT_RE时,就算有新的跳变沿发生F_OUT的输出不会发生变化。
下图给出了一个更复杂的TIM滤波器示例,其中上升沿和下降沿都配置为立即边缘传播模式。
如果FLT_CNT已经达到特定信号边缘(FLT_RE)的接受时间,而信号F_IN_SYNC已经改变到F_OUT的相反电平,则将相反的信号电平设置为F_OUT,并立即开始接受时间测量.
4.2.2 独立去毛刺时间模式(上下计数器)
在单个去故障时间模式(上/下计数器)中,输入信号的每个边缘可以用寄存器中提到的单个去故障阈值滤波值进行滤波FLT_RE和FLT_FE。
当F_IN_SYNC上的信号电平不等于F_OUT上的信号电平时,滤波器计数器寄存器FLT_CNT递增,当F_IN_SYNC等于F_OUT时,FLT_CNT递减。如果FLT_CNT在减少期间达到零值后,计数器立即停止。
4.2.3独立去毛刺时间模式(保持计数器)
当F_IN_SYNC上的信号电平不等于F_OUT上的信号电平时,滤波器计数器寄存器FLT_CNT递增,当F_IN等于F_OUT时,FLT_CNT的计数器值保持不变。
4.3 超时检测单元(TDU)
超时检测单元(TDU)负责TIM输入信号的超时检测,具体操作详见数据手册,就不一一赘述了。
4.4 TIM通道测量模式
4.4.1 PWM测量模式(TPWM)
在TIM PWM测量模式中,TIM通道可以测量传入PWM信号的占空比和周期。DSL位定义了待测量的PWM信号的极性。
当要求测量脉冲高电平时间和周期时(具有高电平占空比的PWM,DSL=1),通道在滤波器检测到第一个上升边缘后开始测量。测量采用CNT寄存器计数,配置的时钟来自CMU_CLKx,直到检测到下降的边缘。然后将计数器值存储在影子寄存器CNTS中(如果是CNTS_SEL = 0),计数器CNT连续计数,直到达到下一个上升边。在接下来的上升边缘上,CNTS寄存器的内容被转移到GPR0,CNT寄存器的内容被转移到GPR1。这样,GPR0包含占空比长度,而GPR1包含周期,占空比也就是GPR0/ GPR1。
当要求测量具有低电平占空比的PWM(DSL=0),通道在滤波器检测到第一个下降沿后开始测量。低水平占空比时间首先存储在CNTS中,最后存储在GPR0中,周期存储在GPR1中(和高占空比的相反就行了)。
4.4.2 外部捕获TIM PWM测量模式(TPWM)
如果启用了外部捕获,则会连续进行PWM测量。如果发生外部捕获事件,实际测量值将被捕获到GPRx。
4.4.3 脉冲积分模式(TPIM)
在TIM脉冲集成模式中,每个TIM通道能够测量输入信号上的脉冲高低时间的总和.当脉冲具有指定的信号电平DSL时,就通过增加TIM通道计数器CNT来测量脉冲时间。当输入信号具有相反的信号电平时,计数器就会停止。
4.4.4 TIM输入事件模式(TIEM)
在TIM输入事件模式下,TIM通道能够计数边沿。计算上升沿、下降沿或两种边沿是可配置的,通过使用TIMi_CHx_CTRL寄存器中的位字段DSL和ISL来完成。此外,当接收到配置的边缘并启用此中断时,会引发一个TIM[i]_NEWVAL[x]_IRQ中断。
5. 定时器输出模块(TOM)
TOM系统框图如下所示:
TGC0和TGC1两个子模块是全局通道控制单元,它们控制通道及其输出的启用/禁用,以及周期和占空比寄存器的更新。
TOM模块接收两/三个时间戳值TBU_TS0、TBU_TS1(和TBU_TS2),以代表一个公共时间基实现同步输出行为。5个专用时钟线输入CMU_FXCLK提供可选择为输出针时钟的分割时钟。
5.1 TOM全局通道控制(TGC0、TGC1)
两个全局通道控制单元(TGC0和TGC1),可以通过外部或内部事件同步驱动多个单独的TOM信道。每个TG最多可以驱动8个TOM通道,其中TGC0控制TOM通道0到7,TGC1控制TOM通道8到15。
5.2 TOM通道(TOM_CHx)
每个单独的TOM通道包括计数器比较单元0(CCU0)、计数器比较单元1(CCU1)和信号输出产生单元(SOU)。通道之间有些许差异,通道 8-15 不支持 SPE,通道 0-7 如图所示:
CCU0 中包含一个 16 位累加器 CN0 和一个 16 位比较器 CM0,CCU1 主要包含一个 16 位比较器 CM1。CN0 在通道启动后会持续累加,在不同模式下有不同的归零逻辑;CM0 和 CM1 两个比较器用于控制通道输出的周期和占空比,无法直接修改,需要通过操作 SR0 和 SR1 两个影子寄存器来进行修改。TOM模块可以配置为连续模式或单次模式。在连续模式下,CN0计数器和CM0比较值匹配后溢出,CN0归零并重新开始计数,产生连续的PWM波。而在单次模式下,CN0匹配后溢出不会自动归零,需要重新复位才能开始下一次计数,每次触发只产生一个脉冲。
5.2.1仅同步更新占空比
只占空比的同步更新可以通过简单地写入所需的新值到SR1,而无需禁用更新机制。然后在寄存器SR1更新之后的期间应用新的占空比。
5.2.2仅异步更新占空比
如果占空比的更新应独立于新周期的开始(异步)执行,则可以直接写入所需的新值以注册CM1。在这种情况下,建议在整体上禁用同步更新机制。
5.2.3 TOM通道连续模式
**如果将计数器CN0从CM0重置为零,则在TOM输出通道处生成一个周期的第一个边。如果CN0已达到CM1,则会生成该周期的第二个边。**每次计数器CN0达到CM0的值时,它将被重置为零,并继续递增。
5.2.4 TOM通道单次模式
在单次模式下,TOM信道产生一个由通道配置寄存器TOMi_CHx_CTRL中的配置位SL指定的信号电平的脉冲如果将计数器CN0从CM0重置为零,则会生成TOM输出通道处的第一条边。如果CN0大于或等于CM1则生成第二条边
5.2.5Up-Down模式(中心对齐模式)好像TC3xx系列中才有这个模式(TC275数据手册上没有介绍到----有待考证)
在 Up-Down 模式下,CN0 仍然会持续累加,但是在到达 CM0 之后不归零,而是反向递减,之后到达 0 之后再累加。递增经过 CM1 时,设置电平为 SL,递减经过 CM1 时,设置电平为 SL 取反。其输出波形与寄存器关系如下图所示:
在该模式下其电平起点在周期中间,因此称为中央对齐,一般为电机控制使用。在该模式下其周期Tick值为2*CM0,占空比仍为 CM1/CM0。
5.2.6 TOM BLDC支持
TOM子模块与SPE子模块结合提供了BLDC支持。要驱动BLDC引擎,可以使用TOM通道0到7。BLDC可以通过在TOMi_CH[z]_CTRL寄存器中设置SPEM位来配置支持。当设置该位时,TOM通道输出通过来自SPE子模块的SPE_OUT (z)信号进行控制。
6. 高级定时器输出模块(ATOM)
ATOM模块在GTM系统中能够独立于CPU生成复杂的输出信号。它与TOM模块在结构上相似,但有其独特之处。ATOM的工作时钟可以选择来自CMU模块提供的8种配置时钟(CMU_CLK0-7)之一,或者如果需要时间戳功能,可以选择TBU模块生成的3种时间基准信号(TBU_TS0-2)之一。ATOM包含8个输出通道,这些通道的选取和控制由AGC(Advanced Generation Control)单元负责,其作用类似于TOM模块中的TGC(Timer Generation Control)控制器。
ATOM系统框图如下所示:
ATOM通道能够代表时间戳产生信号,也能够代表内部移位寄存器产生串行输出信号。每个ATOM通道提供四种操作模式:
•ATOM信号即时输出模式(SOMI):在收到ARU数据后立即生成输出信号。
•ATOM信号比较输出模式(SOMC):输出信号代表操作寄存器中的时间戳,与TBU生成的时间戳比较。
•ATOM信号PWM输出模式(SOMP):能够产生具有不同占空比和周期的复杂PWM信号。占空比和周期可以同步和异步地改变。
•ATOM信号串行输出模式(SOMS):输出移位寄存器生成的串行位流。
ATOM通道结构与TOM通道相似,但ATOM模块中操作寄存器和影子寄存器等计数器都是24位,提高了计数器的精度。ATOM通道主要由CCU0、CCU1、SOU和ACI四个子单元构成,其中ARU通道接口单元负责ATOM模块与ARU之间的数据交换。
ATOM信道具有一个ARU通信接口(ACI)子单元,负责从ARU之间和与ARU之间的数据交换。传入的ARU数据被ACI分成三部分,并通信到ATOM信道寄存器。在SOMI、SOMC、SOMP和SOMS模式中,传入的ARU数据的分割方式是,低24位存储在SR0寄存器中,高24位存储在SR1寄存器中,而从52位到48位以SOMI、SOMP和SOMS模式存储在寄存器ATOM[i]_CH[x]_STAT的ACBI位字段中,在SOMB模式下存储在内部ACB_SR寄存器中。
ATOM的用法与TOM相似,具体的特殊功能用法详见数据手册。
7. 传感器相位评估模块(SPE)
传感器相位评估模块(SPE)可用于评估三个霍尔传感器的输入,并与TOM模块一起使用,以支持BLDC电机的驱动。因此,输入信号已经在所连接的TIM通道中被滤波。此外,如果使用DPLL计算一个或两个电机的转速,SPE子模块可以作为MAP子模块的输入级。SPE模块架构图如下图所示。
SPE子模块能够确定组合的TIM[i]_CHx、TIM[i]_CHy和TIM[i]_CHz(每个信号都有48个样本)的旋转方向。它通过应用模式匹配算法来分析这些输入信号之间的时间关系,从而生成一个名为SPEx_DIR的信号。下图展示了可能的输入信号样本模式。通常,这些输入模式在SPE子模块中是可以进行编程设置的。
上图表示的模式有:100-110-010-011-001-101-100,其中第一位(最小圆)代表TIM[i]_CH[x](48),第二位代表TIM[i]_CH[y](48),第三位(最大圆)代表TIM[i]_CH[z](48)。SPE模块每个新模式只有三个输入信号中的一个改变其值。
从三个输入的样本中,可以检测和信号编码的旋转方向和输入模式序列的有效性。当检测到有效的输入模式时,SPE子模块可以控制专用连接的TOM子模块的输出。
TOM[i]_CH0_TRIG_CCU[x]和TOM[i]_CH[x]_SOUR信号线用于评估TOM输出的当前状态,而SPE[i]_OUT输出向量用于根据新的输入模式控制TOM输出。内部SPE子模块架构如下图所示。
通过编程SPEi_PAT寄存器来定义输入模式,并根据模式顺序控制旋转方向。当检测到有效输入模式时,会触发信号并更新输出控制。此外,模块还能与TOM子模块协同工作,通过配置实现延迟更新输出控制寄存器。同时,模块具有错误检测功能,能够识别无效的输入模式组合并触发中断。CPU可以通过分析寄存器中的模式历史来诊断传感器问题。模块还提供了快速关闭所有相关TOM通道的功能,以响应紧急情况。
代码
GTM.c
#include "Ifx_Types.h"
#include "IfxGtm_Atom_Pwm.h"
#include "IfxGtm_Tom_Pwm.h"
#include "IfxGtm_Tim_In.h"
#include "System_delay.h"
#define TOM_PWM_OUT IfxGtm_TOM0_0_TOUT76_P15_5_OUT /* TOM PWM 输出引脚 */
#define PWM_IN IfxGtm_TIM0_0_P02_0_IN /* TIM 测量引脚 */
#define TOM_PWM_PERIOD 10000 /* TOM PWM 周期 */
#define TOM_DUTY_CYCLE TOM_PWM_PERIOD / 4 /* TOM PWM 占空比 */
#define LED IfxGtm_ATOM0_3_TOUT49_P22_2_OUT /* ATOM PWM 输出LED引脚 */
#define ATOM_PWM_PERIOD 5000 /* ATOM PWM 周期 */
#define FADE_STEP ATOM_PWM_PERIOD / 10 /* LED呼吸灯PWM占空比加减步长 */
uint32 LED_PwmValue = 0;
sint8 PWM_Dir = 0;
float32 g_measuredPwmDutyCycle = 0.0;
float32 g_measuredPwmFreq_Hz = 0.0;
uint8 g_dataCoherent = 0;
IfxGtm_Tim_In g_driverTIM;
IfxGtm_Atom_Pwm_Config atomConfig;
IfxGtm_Atom_Pwm_Driver atomHandle;
/*****************************************************************************************************
* @projectName: void init_TIM(void)
* @introduction: 初始化TIM模块
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/9/20
* @version: 1.0
*****************************************************************************************************/
void init_TIM(void)
{
IfxGtm_enable(&MODULE_GTM); /* 使能 GTM */
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK0); /* 使能 CMU 时钟0 */
IfxGtm_Tim_In_Config configTIM;
IfxGtm_Tim_In_initConfig(&configTIM, &MODULE_GTM);
configTIM.filter.inputPin = &PWM_IN;
configTIM.filter.inputPinMode = IfxPort_InputMode_pullDown;
IfxGtm_Tim_In_init(&g_driverTIM, &configTIM);
}
/*****************************************************************************************************
* @projectName: void initGtm_TomPwm(void)
* @introduction: 初始化TOM模块
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/9/20
* @version: 1.0
*****************************************************************************************************/
void initGtm_TomPwm(void)
{
IfxGtm_Tom_Pwm_Config tomConfig;
IfxGtm_Tom_Pwm_Driver tomDriver;
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK); /* 使能 FXU 固定时钟 */
IfxGtm_Tom_Pwm_initConfig(&tomConfig, &MODULE_GTM);
tomConfig.tom = TOM_PWM_OUT.tom;
tomConfig.tomChannel = TOM_PWM_OUT.channel;
tomConfig.period = TOM_PWM_PERIOD;
tomConfig.dutyCycle = TOM_DUTY_CYCLE;
tomConfig.pin.outputPin = &TOM_PWM_OUT;
tomConfig.synchronousUpdateEnabled = TRUE;
tomConfig.clock = IfxGtm_Tom_Ch_ClkSrc_cmuFxclk0;
IfxGtm_Tom_Pwm_init(&tomDriver, &tomConfig);
IfxGtm_Tom_Pwm_start(&tomDriver, TRUE);
}
/*****************************************************************************************************
* @projectName: void initGtm_ATomPwm_LED(void)
* @introduction: 初始化ATOM模块
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/9/20
* @version: 1.0
*****************************************************************************************************/
void initGtm_ATomPwm_LED(void)
{
IfxGtm_enable(&MODULE_GTM);
float32 frequency = IfxGtm_Cmu_getModuleFrequency(&MODULE_GTM);
IfxGtm_Cmu_setGclkFrequency(&MODULE_GTM, frequency);
IfxGtm_Cmu_setClkFrequency(&MODULE_GTM, IfxGtm_Cmu_Clk_1, frequency);
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK1);
IfxGtm_Atom_Pwm_initConfig(&atomConfig, &MODULE_GTM);
atomConfig.atom = LED.atom;
atomConfig.atomChannel = LED.channel;
atomConfig.period = ATOM_PWM_PERIOD;
atomConfig.pin.outputPin = &LED;
atomConfig.synchronousUpdateEnabled = TRUE;
IfxGtm_Atom_Pwm_init(&atomHandle, &atomConfig);
IfxGtm_Atom_Pwm_start(&atomHandle,TRUE);
}
/*****************************************************************************************************
* @projectName: void measure_PWM(void)
* @introduction: 测量PWM频率和占空比
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/9/20
* @version: 1.0
*****************************************************************************************************/
void measure_PWM(void)
{
IfxGtm_Tim_In_update(&g_driverTIM); /* Update the measured data */
g_measuredPwmFreq_Hz = 1/IfxGtm_Tim_In_getPeriodSecond(&g_driverTIM); /* Get the period of the PWM signal */
g_measuredPwmDutyCycle = IfxGtm_Tim_In_getDutyPercent(&g_driverTIM, &g_dataCoherent); /* Get the duty cycle */
}
/*****************************************************************************************************
* @projectName: void Breathing_LED(void)
* @introduction: 用ATOM产生PWM达成呼吸灯效果
* @parameter: void
* @return: void
* @author: Unicorn
* @date: 2024/9/20
* @version: 1.0
*****************************************************************************************************/
void Breathing_LED(void)
{
if(LED_PwmValue >= ATOM_PWM_PERIOD)
{
PWM_Dir = -1;
}
else if(LED_PwmValue <= 0)
{
PWM_Dir = 1;
}
LED_PwmValue += PWM_Dir * FADE_STEP;
atomConfig.dutyCycle = LED_PwmValue; /* Set duty cycle */
IfxGtm_Atom_Pwm_init(&atomHandle, &atomConfig); /* Re-initialize the PWM */
}
main.c
#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxScuWdt.h"
#include "GTM.h"
#include "System_delay.h"
#include "OLED_IIC.h"
#include "OLED_Data.h"
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;
void core0_main(void)
{
IfxCpu_enableInterrupts();
/* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
* Enable the watchdogs and service them periodically if it is required
*/
IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
/* Wait for CPU sync event */
IfxCpu_emitEvent(&g_cpuSyncEvent);
IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
init_TIM();
initGtm_TomPwm();
initGtm_ATomPwm_LED();
OLED_Init();
while(1)
{
measure_PWM();
OLED_ShowString(30,0,"GTM_TEST",OLED_8X16);
OLED_ShowString(0,16,"Freq:",OLED_8X16);
OLED_ShowString(0,32,"Duty:",OLED_8X16);
OLED_ShowNum(60, 16 , g_measuredPwmFreq_Hz , 6, OLED_8X16);
OLED_ShowNum(60, 32 , g_measuredPwmDutyCycle , 3, OLED_8X16);
OLED_Update();
Breathing_LED();
}
}
上述代码的作用是使用TOM输出一个PWM波并使用TIM模块去捕获测量这个PWM信号的频率(HZ)和占空比,显示在OLED屏幕上。另外使用ATOM模块产生PWM达到呼吸灯的效果。
效果如下