[GPTMR]单次模式、外部计数模式、监视输入信号模式介绍
定时器常用的功能基本在系列中阐述完毕,但先楫对于常用的外设也不是永远一成不变,而是根据市场需求不断完善外设,在新的系列中不断补充新功能。
该功能是指计数器到达重载reload值后停止计时。该模式支持HPM5300系列之后的先楫推出的产品(目前包括了HPM5300, HPM6E00)
对应的hpm sdk例子在samples/drivers/gptmr/opmode
该功能是指监视输入的周期性信号,宽度超出范围(小于最小监视值,大于最大监视值)触发捕获中断或者DMA请求。该模式支持HPM5300系列之后的先楫推出的产品(目前包括了HPM5300, HPM6E00)
对应的hpm sdk例子在samples/drivers/gptmr/monitor
该功能指的是计数器在输入捕获信号的上升沿递增,当计数值达到重载值时发生重载。也就是外部信号触发GPTMR内部计数。
对应的hpm sdk例子在samples/drivers/gptmr/cntmode
当使用有些板子构建不支持的例子时,构建过程会报错板子不支持该例子,比如本文的monitor例子,使用hpm6200evk构建提示如下:
这是因为例子使用yaml文件限制构建范围,hpm_sdk中有些sample会带有app.yaml文件,比如本文的monitor例子,这里明确例子依赖gptmr的外设,以及gptmr需要有monitor功能,而hpm6200并不支持monitor,自然也不支持该例子。
而查看外设是否具有新功能特性,可以在soc目录下具体的mcu型号的hpm_soc_ip_feature.h文件中看到,比如hpm5301的gptmr就支持opmode和monitor。
构建过程中,hpm_sdk如何知道例子支不支持对应的板子呢? 我们可以从提示信息中”can not support this sample“抓取信息,定位到application.cmake中有该信息。
也就是说,如果该sample有app.yaml,那么就调用check_board_capability脚本,看返回的result是否支持
而对应的check_board_capability脚本在scripts目录下,可以看到定义了check_ip_dependency,里面就是搜索soc下的ip feature文件是否存在功能
2、对于需要输入信号的,使能对应的输出引脚的Pinmux功能为capture
该设置可参考输入捕获一篇的文章。本文的cntmode和monitor功能都需要初始化对应通道的输入引脚为输入捕获
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。
1.当寄存器赋值步骤4的IRQEN.CHxCMP0EN = 1,打开通道比较器0标志位中断使能位,会触发中断通知输出比较完成。
1. 在单次模式中,重载中断会一直被触发,建议使用通道比较器输出中断。
在hpm sdk中opmode例子中,演示的就是利用定时器的单次模式,计数器只发生一次重载,定时1S,并且只定时一次。
在例子中,还是使用gptmr_channel_config配置定时器通道,配置单次模式的成员是enable_opmode,需要打开赋值为1即可。
烧录下载运行,从终端可看到只打印一次done,验证单次模式。
a.设置CHANNEL[CR]的CNT_MODE位,配置定时器内部/外部计数模式。
b.设置CHANNEL[CR]的OPMODE位,配置定时器循环/单次模式。
利用定时器的外部计数模式,通过查看计数器获取外部输入脉冲数量。
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]计数值,该值就是外部输入脉冲的数量
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。
检测输入信号周期范围为200到1000个计数单位,设置GPTMR的工作时钟为100Mhz,那么检测范围就是500KHz到1MHz。
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,配置最大的重载值。
j.开启计数器,开启计数, CHANNEL[CR].CEN = 1。
k.读取SR寄存器的CHxCAPF输入捕获标志位是否置1,若置1则检测的周期超出范围。需要清除输入捕获标志位 SR.CHxCAF = 1。
a.当寄存器赋值步骤4的IRQEN.CHxCAPEN = 1,打开通道输入捕获标志位中断使能位,会触发中断通知。
在hpm_sdk中的gptmr的monitor例子中,使用的是周期监控,监控范围是2000 <= monitor <= 1000000
使用gptmr_channel_config配置定时器通道,配置monitor模式的成员是enable_monitor,monitor_config.monitor_type,monitor_config.min_value,monitor_config.max_value
a. enable_monitor 是否使能monitor监控功能
b. monitor_config.monitor_type monitor监控类型,选择是高电平还是周期监控
c. monitor_config.min_value 监控最小值,单位是计数器的计数单位
d. monitor_config.max_value 监控最大值,单位是计数器的计数单位