NXP MCU 技术论坛
直播中

Mozie

10年用户 134经验值
擅长:MEMS/传感技术 模拟技术 光电显示
私信 关注
[讨论]

【KL25】低功耗定时器之寄存器操作

本帖最后由 MouseesuoM 于 2015-1-28 09:34 编辑

编译环境:keil5.0以上版本
烧写方式:Jlink
参考的帖子:https://bbs.elecfans.com/jishu_467037_1_1.html

这几天晚上一直在研究低功耗定时器(LPTMR),今天就把自己所了解的简单说说.


低功耗定时器,顾名思义,这个定时器的功耗非常小,在很多模式下比如停止、运行、等待、低漏模式下依然可以正常运行,在调试模式下则只能运行脉冲计数器。


这里我只说说定时计数器,关于脉冲计数器我没有过多了了解,这里我就不多介绍了。只是计数器稍微研究了一下。欢迎大家前来纠错。


(一)允许软件访问低功耗定时器
         说白一点,就是和打开IO时钟的原理,是一样的,这里允许软件访问,应该就是允许我们对低功耗定时器进行编程。
         具体操作:SIM_SCGC5 的D0位写入1
(二)配置低功耗定时器模块
怎么配置?当然就是操作寄存器了,接下来我们就稍微讲解一下低功耗定时器的一些寄存器。
         (1)低功耗定时器的控制状态寄存器(LPTRM0_CSR)
LPTMR_CSR.png
TMS:我们这里选用的是定时计数器,所以这里默认为0就可以了。(1:脉冲计         数器)
TCF:定时器比较标志,当CNR(计数寄存器)的值增加到和CMR(比较寄存器)一样时,并且CNR再增加时,该位自动置1。当该位写1时,或者LPTRM被禁用时,该位自动清0.
tiE:定时器中断使能。这里设置为1。当该位置1时,只要TCF置1,低功耗定时器将产生一个中断请求。这里特别注意,是产生中断,最终能否允许该中断产生,还要取决于NVIC的设置。
TPP和TPS是和脉冲计数器有关的,这里我们不用去理会。
TFC:注意不要和TCF混淆了。该位只有LPTMR禁用的时候才允许设置。
我们这里设置为0,就是说,只要TCF置位,CNR就会复位。(1:只有CNR溢出的时候才会复位)
TEN:1-使能LPTMR 0:禁止LPTMR
       (2)低功耗定时器预分频寄存器
LPTRM_PSR.png


这三位我们都需要用到
PRESCALE:预分频值,默认是0000:2 这里我们选择0001:4
PBYP:1-PRESCALE 的预分频值是有效的, 0:预分频器被旁路,预分频值无效,其实就相当于预分频值为1,时钟源没有被分频
PCS:预分频器时钟源选择,这里我多说一点。这个占了2bit也就是由四种模式,具体如下图
PCS.png

这里我们选的是00 默认值即可,就是MCGIRCLK.
那么问题来了,MCGIRCLK的时钟频率是多少?
shizhong.png

从图上不难发现MCGIRCLK的时钟源由两个,一个是4MHZ的IRC,另一个是32KHZ的IRC,那么这两个到底选择哪一个?
这个是由MCG_C2控制寄存器决定D0位(IRCS)决定的,该位的描述如下:内部时钟参考选择,为内部时钟在高速和低速时钟之间选择一个时钟参考源。0:低速时钟,也就是我们的32KHZ。  1:高速时钟,也就是4MHZ。
所以在选择MCGIRCLK作为预分频器的时钟源,要特别注意这一点,当然我选用的是高速时钟4MHZ。那么是不是MCGIRCLK就是4MHZ?
答案当时不是的,图上特别注意那个FCRDIV,也就是说4MHZ的高速时钟出来以后得陷阱股FCRDIV的预分频,在CG(时钟门,这里经过系统时钟的初始化后默认是允许的的,这个初始化在system_MKL25Z4.c文件中)允许的情况下,才会输出MCGIRCLK。
那么问题又来了FCRDIV是多少?FCRDIV是由MCG_SC控制的,其默认值是001,对应的分频值是2,所以经FCRDIV后,4MHZ就变成了2MHZ,在经过低功耗定时器的预分频器预分频后(上面我们提到预分频值设为4),就成了0.5MHZ。
(3)LPTMR0_CMR和LPTME_CNR寄存器这里我就不多讲解了,这个我想大家都明白。那么0.5MHZ的时钟每振荡一次,CNR加1,当和CMR中设置的值相等并且再增加时,TCF置位,发送中断请求。
还有一个时间的计算公式T=(N+1)/f,T:是我们需要的时间,N是LPTMR_CMR中设置的值,f是我们最终计算出的时钟频率。
实验中CMR设置成9999,那么T=10000/50000 0=1/50=0.02S 产生一次断。


大体的程序思路每隔1S让三色led灯循环亮起:
(1)初始化三色led灯
(2) 允许软件访问低功耗定时器,初始化并且使能低功耗定时器
(3)在NVIC中设置LPTMR的中断优先级并且使能该中断
(4) 编写中断函数,使得三个led灯循环点亮
实验现象:反正我的板子是可以的,你也下载进去试试呗,哈哈
最后附上代码:
LPTMR0.rar (387.05 KB)
(下载次数: 134, 2015-1-27 22:02 上传)


回帖(12)

林璟怡

2015-1-27 23:09:40
顶一个~mouse哥真厉害学习学习
举报

Mozie

2015-1-28 08:45:42
引用: 初代饭影 发表于 2015-1-27 23:09
顶一个~mouse哥真厉害学习学习

哈哈哈  厉害不敢说 也是刚刚学习 共同努力
举报

strategy_li

2015-1-28 18:30:56
顶,支持一下!
举报

Mozie

2015-1-28 20:57:11
引用: strategy_li 发表于 2015-1-28 18:30
顶,支持一下!

哈哈 谢谢啦 共同努力
举报

lee_st

2015-6-2 10:17:19
顶一个。。。。。。。。。
举报

赵生

2015-6-9 16:30:53
又是楼主的好帖,楼主大高手大好人
举报

Mozie

2015-6-11 15:21:18
引用: em78447 发表于 2015-6-9 16:30
又是楼主的好帖,楼主大高手大好人

好巧啊 又碰见你了
举报

637657

2015-6-15 15:48:19
为什么我中断进不去?

  1. LPTMR0_CSR        |=        0x03<<6;//TCF写1清0

是不是左移7位
举报

刘莳野

2015-7-3 16:33:13
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈~
举报

zw_mcu

2015-7-10 18:04:46
      挺好的,学习中
举报

j_yongchao

2015-7-10 23:48:54
感谢分享,学习学习
举报

Mozie

2015-7-29 15:22:10
引用: j_yongchao 发表于 2015-7-10 23:48
感谢分享,学习学习

{:12:}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分