[GPTMR]计数器同步触发输入
先楫的定时器的计数器同步触发输入功能,简称SYNCI,是用来同步每个通道的计数器,也就是当有同步触发信号时,通道的计时器清零,也就是会重置到0。
同步触发输入分为软件同步以及硬件同步两种,本文根据这两种同步进行阐述。
这里的工作时钟的时钟源来源于默认pll,比如HPM5300系列,对于gptmr的时钟源默认就是PLL1CLK0,8分频得到100MHz工作时钟,故也可不用设置pll。
若需要手工更改pll,也可使用先楫的clock tool配置:
链接:https://tools.hpmicro.com/clock
比如以下,选择使用PLL0CLK2作为时钟源,经过四分频后也可以得到gptmr的100M工作频率。最后配置完成点击生成clock代码即可。
2、硬件同步输入的引脚Pinmux功能位于互联管理器TRGM中,需要对应初始化输入和输出配置。
定时器的计数器硬件同步输入引脚来自互联管理器,在手册中也有类似说明,比如HPM6700系列
链接:https://tools.hpmicro.com/pinmux
如果对应的MCU支持互联管理器,那么会在pinmux上有这么一栏,里面包含了IO,FIlter滤波器,DMA三个配置
简单来说其实就是IO互联和DMA互联;所谓的IO互联,就是互联IO的输入输出相互连接,互联的IO输入和输出可以接多个外设,这使得可以让不同的外设可以通过互联管理器进行连接。在pinmux tools可以看到多种外设输入输出可配置。
所谓的DMA互联,就是把输入的外设DMA请求,通过互联管理器把该输入指向发送给DMA管理器,比如PWM外设的CMP0比较DMA请求,可以通过互联管理器连接到互联管理器的8个DMA请求之一,如此一来可以实现外设多个DMA请求场景。
在本文中,使用硬件同步输入的引脚连接在互联管理器上,需要与实际的IO或者其他外设本身的输出连接在一起。
这里可以选择定时器某个通道的比较输出作为输入,输出给定时器的硬件同步输入,也就是说 GPTMR0的通道2比较输出作为GPTMR的硬件同步输入,连接类型就是输出跟输入保持一致,输入是怎样的,那么输出就是怎么样的,输出信号极性不取反。
也或者可以选择互联管理的外部IO作为输入,输出到定时器的硬件同步输入,这样就是硬件同步输入直接连接到外部IO上
这里的Type代表的是:输入与输出的连接类型,包括以下几种:
1、same as input: 输入和输出是一样的,也就是输入是啥,输出就是啥
2、input falling edge:输入一个下降沿,输出端就是一个脉冲输出
3、input rising edge:输入一个上升沿,输出端就是一个脉冲输出
4、input both edge:输入一个上升沿或者下降沿,输出端就是一个脉冲输出
1、对TRGM互联管理器的输入IO进行pinmux初始化,代表该IO的Pinmux功能是用来互联管理器的输入IO所用
1)使用trgm_output_t结构体进行成员赋值,包括上述阐述的输入,类型,极性。
2)使用trgm_output_config API配置输出,通过trgm_output_t配置互联管理器的TRGOCFG寄存器
3)对应HPM_TRGM0_INPUT_SRC_TRGM0_P2和HPM_TRGM0_OUTPUT_SRC_GPTMR0_SYNCI是输入输出的mux编号,其编号在sdk中也是全部定义好了。
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请求。
用硬件同步输入实现在输入发生上升沿和下降沿时,定时器的计数器发生复位清零,如下框图所示:
以hpm_sdk中的samples/drivers/gptmr/counter_sync作为参考
该counter_sync例子是使用软件同步输出PWM。这里可以改动为硬件同步模式,以HPM5300EVK为调试板子。
这里使用定时器0,四个通道都作为输出,并且初始化硬件同步输入引脚,使用pinmux tool
1、生成的代码复制到例子中,删除掉init_gptmr_pins的调用
2、pwm_config API中,把软件同步功能禁止,同步输入触发下降沿有效,如此一来四个通道输出会同步输出。
当输入1HZ波形给SYNCI时,PWM输出同步100Khz波形
当输入1Mhz波形给SYNCI时,PWM同步不输出,这是因为SYNCI输入的频率比待输出的PWM高,而SYNCI具有清零计数器的作用,这时候PWM输出的比较输出达不到条件,所以不会有输出,符合预期输出。
这里利用软件同步实现通道0和通道1的PWM同步输出,如下框图所示:
寄存器配置步骤:以sdk中的gptmr的例子counter_sync为参考
设置CHANNEL[CR].SWSYNCIEN = 1,使能软件计数器同步。
设置GCR.SWSYNCTx = '0b0011',设置通道0和通道1计计数器重载。使用gptmr_trigger_channel_software_sync API
运行counter_sync例子查看波形,可看到两个通道波形是同步的
若要两个通道输出的PWM是互补的,只需要设置输出初始化极性电平两者相反即可,在sdk的驱动中,cmp_initial_polarity_high的成员就是设置初始化极性电平。