[GPTMR]计数器同步触发输入

一、前言

先楫的定时器的计数器同步触发输入功能,简称SYNCI,是用来同步每个通道的计数器,也就是当有同步触发信号时,通道的计时器清零,也就是会重置到0。

同步触发输入分为软件同步以及硬件同步两种,本文根据这两种同步进行阐述。

二、GPTMR定时器同步触发输入功能讲解

寄存器说明参考先楫用户手册,这里不做阐述。

在使用GPTMR的同步触发输入功能之前,必须做以下初始化

1、确保打开了GPTMR的工作时钟,保证GPTMR正常工作

比如打开gptmr3的工作时钟即可,在sdk中可以参考:

截图.png

这里的工作时钟的时钟源来源于默认pll,比如HPM5300系列,对于gptmr的时钟源默认就是PLL1CLK0,8分频得到100MHz工作时钟,故也可不用设置pll。

截图.png

若需要手工更改pll,也可使用先楫的clock tool配置:

 链接:https://tools.hpmicro.com/clock

比如以下,选择使用PLL0CLK2作为时钟源,经过四分频后也可以得到gptmr的100M工作频率。最后配置完成点击生成clock代码即可。

截图.png

2、硬件同步输入的引脚Pinmux功能位于互联管理器TRGM中,需要对应初始化输入和输出配置。

定时器的计数器硬件同步输入引脚来自互联管理器,在手册中也有类似说明,比如HPM6700系列

image.png

本文会使用先楫的pinmux tool进行阐述。

 链接:https://tools.hpmicro.com/pinmux

如果对应的MCU支持互联管理器,那么会在pinmux上有这么一栏,里面包含了IO,FIlter滤波器,DMA三个配置

image.png

在用户手册中,互联管理器的功能总结以下:

image.png

简单来说其实就是IO互联和DMA互联;所谓的IO互联,就是互联IO的输入输出相互连接,互联的IO输入和输出可以接多个外设,这使得可以让不同的外设可以通过互联管理器进行连接。在pinmux tools可以看到多种外设输入输出可配置。

image.png

image.png

所谓的DMA互联,就是把输入的外设DMA请求,通过互联管理器把该输入指向发送给DMA管理器,比如PWM外设的CMP0比较DMA请求,可以通过互联管理器连接到互联管理器的8个DMA请求之一,如此一来可以实现外设多个DMA请求场景。

image.png

在本文中,使用硬件同步输入的引脚连接在互联管理器上,需要与实际的IO或者其他外设本身的输出连接在一起。

这里可以选择定时器某个通道的比较输出作为输入,输出给定时器的硬件同步输入,也就是说 GPTMR0的通道2比较输出作为GPTMR的硬件同步输入,连接类型就是输出跟输入保持一致,输入是怎样的,那么输出就是怎么样的,输出信号极性不取反。

image.png

也或者可以选择互联管理的外部IO作为输入,输出到定时器的硬件同步输入,这样就是硬件同步输入直接连接到外部IO上

image.png

这里的Type代表的是:输入与输出的连接类型,包括以下几种:

image.png

1、same as input: 输入和输出是一样的,也就是输入是啥,输出就是啥

2、input falling edge:输入一个下降沿,输出端就是一个脉冲输出

3、input rising edge:输入一个上升沿,输出端就是一个脉冲输出

4、input both edge:输入一个上升沿或者下降沿,输出端就是一个脉冲输出

这里的Invert代表的是:输出的极性,正常或者取反。

image.png

点击生成代码,可以看到:

image.png

1、对TRGM互联管理器的输入IO进行pinmux初始化,代表该IO的Pinmux功能是用来互联管理器的输入IO所用

2、配置trgm互联管理器的输入输出

1)使用trgm_output_t结构体进行成员赋值,包括上述阐述的输入,类型,极性。

image.png

2)使用trgm_output_config API配置输出,通过trgm_output_t配置互联管理器的TRGOCFG寄存器

image.png

3)对应HPM_TRGM0_INPUT_SRC_TRGM0_P2和HPM_TRGM0_OUTPUT_SRC_GPTMR0_SYNCI是输入输出的mux编号,其编号在sdk中也是全部定义好了。

image.png

(一)配置流程

1、设置CHANNEL[CR]寄存器的CEN位,配置关闭计数器。

2、设置CHANNEL[CR]寄存器的CNTRST位,复位计数器。

4、设置CHANNEL[RLD]的寄存器值,配置计数器重载值。

5、设置CHANNEL[CR]寄存器的CEN位,配置启动计数器。

6、设置CHANNEL[CR]寄存器的SWSYNCIEN位和GCR寄存器的SWSYNCTx位,配置软件同步。

7、设置CHANNEL[CR]寄存器的SNCIREN位和SYNCIFEN位,配置硬件同步,选择同步发生在同步输入的上升沿还是下降沿。

注意:同步触发输入SYNCI并不会引起计数器重载,只是复位清零计数器,无法产生中断以及DMA请求。

三、以应用阐述外设功能

(一)利用硬件同步输入生成多路同步PWM

用硬件同步输入实现在输入发生上升沿和下降沿时,定时器的计数器发生复位清零,如下框图所示:

截图.png

image.png

以hpm_sdk中的samples/drivers/gptmr/counter_sync作为参考

该counter_sync例子是使用软件同步输出PWM。这里可以改动为硬件同步模式,以HPM5300EVK为调试板子。

这里使用定时器0,四个通道都作为输出,并且初始化硬件同步输入引脚,使用pinmux tool

image.png

1、生成的代码复制到例子中,删除掉init_gptmr_pins的调用

image.png

2、pwm_config API中,把软件同步功能禁止,同步输入触发下降沿有效,如此一来四个通道输出会同步输出。

image.png

3、通道依次初始化

image.png

当输入1HZ波形给SYNCI时,PWM输出同步100Khz波形

image.png

当输入1Mhz波形给SYNCI时,PWM同步不输出,这是因为SYNCI输入的频率比待输出的PWM高,而SYNCI具有清零计数器的作用,这时候PWM输出的比较输出达不到条件,所以不会有输出,符合预期输出。

image.png

(二)使用软件同步生成互补或者同步PWM

这里利用软件同步实现通道0和通道1的PWM同步输出,如下框图所示:

截图.png

寄存器配置步骤:以sdk中的gptmr的例子counter_sync为参考

按照(一)生成边沿对齐PWM。

设置CHANNEL[CR].SWSYNCIEN = 1,使能软件计数器同步。

截图.png

并且打开计数器

截图.png

设置GCR.SWSYNCTx = '0b0011',设置通道0和通道1计计数器重载。使用gptmr_trigger_channel_software_sync API

截图.png

打开比较输出功能

截图.png

运行counter_sync例子查看波形,可看到两个通道波形是同步的

截图.png

若要两个通道输出的PWM是互补的,只需要设置输出初始化极性电平两者相反即可,在sdk的驱动中,cmp_initial_polarity_high的成员就是设置初始化极性电平。

截图.png

例子中把该成员设置相反即可,烧录后可看到输出互补关系

截图.png

0
0
发表回复 0

Your email address will not be published. Required fields are marked *