[GPTMR]单次模式、外部计数模式、监视输入信号模式介绍

一、前言

定时器常用的功能基本在系列中阐述完毕,但先楫对于常用的外设也不是永远一成不变,而是根据市场需求不断完善外设,在新的系列中不断补充新功能。

1、单次模式(op mode)

该功能是指计数器到达重载reload值后停止计时。该模式支持HPM5300系列之后的先楫推出的产品(目前包括了HPM5300, HPM6E00)

对应的hpm sdk例子在samples/drivers/gptmr/opmode

2、监视输入信号功能(monitor)

该功能是指监视输入的周期性信号,宽度超出范围(小于最小监视值,大于最大监视值)触发捕获中断或者DMA请求。该模式支持HPM5300系列之后的先楫推出的产品(目前包括了HPM5300, HPM6E00)

对应的hpm sdk例子在samples/drivers/gptmr/monitor

3、外部计数模式(cnt mode)

该功能指的是计数器在输入捕获信号的上升沿递增,当计数值达到重载值时发生重载。也就是外部信号触发GPTMR内部计数。

对应的hpm sdk例子在samples/drivers/gptmr/cntmode

小技巧提示:

当使用有些板子构建不支持的例子时,构建过程会报错板子不支持该例子,比如本文的monitor例子,使用hpm6200evk构建提示如下:

image.png

这是因为例子使用yaml文件限制构建范围,hpm_sdk中有些sample会带有app.yaml文件,比如本文的monitor例子,这里明确例子依赖gptmr的外设,以及gptmr需要有monitor功能,而hpm6200并不支持monitor,自然也不支持该例子。

image.png

而查看外设是否具有新功能特性,可以在soc目录下具体的mcu型号的hpm_soc_ip_feature.h文件中看到,比如hpm5301的gptmr就支持opmode和monitor。

image.png

构建过程中,hpm_sdk如何知道例子支不支持对应的板子呢? 我们可以从提示信息中”can not support this sample“抓取信息,定位到application.cmake中有该信息。

也就是说,如果该sample有app.yaml,那么就调用check_board_capability脚本,看返回的result是否支持

image.png

而对应的check_board_capability脚本在scripts目录下,可以看到定义了check_ip_dependency,里面就是搜索soc下的ip feature文件是否存在功能

image.png

二、GPTMR定时器新功能讲解

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

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

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

该设置请参考以往文章。

2、对于需要输入信号的,使能对应的输出引脚的Pinmux功能为capture

该设置可参考输入捕获一篇的文章。本文的cntmode和monitor功能都需要初始化对应通道的输入引脚为输入捕获

(一)单次模式(op mode)

1.寄存器配置步骤

1).关闭计数器 CHANNEL[CR].CEN = 0。

2).复位计数器 CHANNEL[CR].CNTRST = 1,复位后需要清零释放复位CHANNEL[CR].CNTRST = 0。

3).设置重载值CHANNEL[RLD]:99999999(100000000 - 1,计数器从0开始)。

4).设置比较器0 CHANNEL[CMP0]:99999998。(使用比较输出中断触发通知,CMP0比RLD小一个计数周期)

5).关闭通道重载标志位中断使能位 IRQEN.CHxRLDEN = 0。

6).关闭通道输出比较标志位中断使能位 IRQEN.CHxCMP0EN = 0。

7).设置定时器计数模式为内部计数模式,CHANNEL[CR].CNT_MODE = 0。

8).设置定时器计数模式为单次模式,CHANNEL[CR].OPMODE = 1。

9).使能计数器工作,开启计数, CHANNEL[CR].CEN = 1。

10).查看SR寄存器的CHxCMP0F标志位是否置1,若置1则发生比较输出,定时完成。需要清除重载标志位 SR.CHxCMP0F = 1。

2.补充说明

1.当寄存器赋值步骤4的IRQEN.CHxCMP0EN = 1,打开通道比较器0标志位中断使能位,会触发中断通知输出比较完成。

2.使用中断需要使能PLIC控制器的定时器中断。

3.在中断服务函数中可以执行寄存器赋值步骤10。

3.注意事项

1. 在单次模式中,重载中断会一直被触发,建议使用通道比较器输出中断。

4.应用

在hpm sdk中opmode例子中,演示的就是利用定时器的单次模式,计数器只发生一次重载,定时1S,并且只定时一次。

在例子中,还是使用gptmr_channel_config配置定时器通道,配置单次模式的成员是enable_opmode,需要打开赋值为1即可。

根据上述的注意事项,例子也是使用通道比较输出中断来判断重载

image.png

在while中判断中断是否触发,若触发则打印done

image.png

烧录下载运行,从终端可看到只打印一次done,验证单次模式。

image.png

(二)外部计数模式(cnt mode)

1.配置流程

a.设置CHANNEL[CR]的CNT_MODE位,配置定时器内部/外部计数模式。

b.设置CHANNEL[CR]的OPMODE位,配置定时器循环/单次模式。

2.实例说明

2.1 计数外部输入脉冲数量

利用定时器的外部计数模式,通过查看计数器获取外部输入脉冲数量。

1) 寄存器配置步骤

a.关闭计数器 CHANNEL[CR].CEN = 0。

b.复位计数器 CHANNEL[CR].CNTRST = 1,复位后需要清零释放复位CHANNEL[CR].CNTRST = 0。

c.设置定时器计数模式为外部计数模式,CHANNEL[CR].CNT_MODE = 1。

d.设置定时器计数模式为循环模式,CHANNEL[CR].OPMODE = 0。

e.设置CHANNEL[RLD] = 0xFFFFFFFE,配置最大的重载值。

f.关闭通道输入捕获标志位中断使能位 IRQEN.CHxCAPEN = 0。

e.开启计数器,开启计数, CHANNEL[CR].CEN = 1。

g.查看CHANNEL[CNT]计数值,该值就是外部输入脉冲的数量

(三)监视输入信号功能(monitor)

1、配置流程

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

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

3).设置IRQEN寄存器的CHxCAPEN位,中断使能配置。

4).设置CHANNEL[CR]的CAPMODE位,选择输入捕获的模式。

5).设置CHANNEL[CR]的MONITOR_SEL位,选择监控类型(高电平监控或是周期监控)。

6).设置CHANNEL[CR]的MONITOR_EN位,是否使能监控。

7).设置CHANNEL[RLD]的寄存器值,配置计数器重载值。

8).设置CHANNEL[CMP0]的寄存器值,配置最小检测范围。

9).设置CHANNEL[CMP1]的寄存器值,配置最大检测范围

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

11).查看SR寄存器的CHxCAPF输入捕获标志位是否置1,若置1则检测超出范围。需要清除输入捕获标志位 SR.CHxCAPF = 1。

2、实例说明

2.1、检测输入信号周期

检测输入信号周期范围为200到1000个计数单位,设置GPTMR的工作时钟为100Mhz,那么检测范围就是500KHz到1MHz。

1)寄存器配置步骤

a.关闭计数器 CHANNEL[CR].CEN = 0。

b.复位计数器 CHANNEL[CR].CNTRST = 1,复位后需要清零释放复位CHANNEL[CR].CNTRST = 0。

c.关闭通道输入捕获标志位中断使能位 IRQEN.CHxCAPEN = 0。

d.设置CHANNEL[CR].CAPMODE = ‘0b100’,捕获模式为PWM测量模式。

e.设置CHANNEL[CR].MONITOR_SEL = 0,输入监控类型选择检测输入信号周期。

f.设置CHANNEL[CR].MONITOR_EN = 1,使能监控检测。

g.设置CHANNEL[RLD] = 0xFFFFFFFF,配置最大的重载值。

h.设置CHANNEL[CMP0] = 100。

i.设置CHANNEL[CMP0] = 1000。

j.开启计数器,开启计数, CHANNEL[CR].CEN = 1。

k.读取SR寄存器的CHxCAPF输入捕获标志位是否置1,若置1则检测的周期超出范围。需要清除输入捕获标志位 SR.CHxCAF = 1。

2) 补充说明:

a.当寄存器赋值步骤4的IRQEN.CHxCAPEN = 1,打开通道输入捕获标志位中断使能位,会触发中断通知。

b.使用中断需要使能PLIC控制器的定时器中断。

c.在中断服务函数中可以执行寄存器赋值步骤10。

3) 例子说明

在hpm_sdk中的gptmr的monitor例子中,使用的是周期监控,监控范围是2000 <= monitor <= 1000000

image.png

使用gptmr_channel_config配置定时器通道,配置monitor模式的成员是enable_monitor,monitor_config.monitor_type,monitor_config.min_value,monitor_config.max_value

image.png

介绍下Monitor相关的成员变量:

a. enable_monitor 是否使能monitor监控功能

b. monitor_config.monitor_type monitor监控类型,选择是高电平还是周期监控

c. monitor_config.min_value 监控最小值,单位是计数器的计数单位

d. monitor_config.max_value 监控最大值,单位是计数器的计数单位

开启输入捕获中断,若监控的值不在范围内,则打印报警,从终端打印可看到:

image.png

0
0
发表回复 0

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