登录 立即注册

电子DIY创易联盟

查看: 3026|回复: 3

LCP1768菜鸟学习笔记【三】——定时器

[复制链接]
累计签到:65 天
连续签到:1 天

10

帖子

630

积分

0

听众

CY-3级

Rank: 3

积分
630
发表于 2017-9-1 22:36:16 | 显示全部楼层 |阅读模式

终于等到你!马上注册,和广大电子DIY爱好者一起玩耍,还有更多功能和福利等着你!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 流浪者 于 2017-9-4 23:08 编辑

由于我本人白天还要上班,时间和精力有限,所以接下来的一些复杂的功能或者一个功能有多种用途的,我都会分开来讲,希望能体谅。废话不多说,入主题。

按照我的学习习惯,学习一款单片机开头的几步一直都是:点亮一盏灯->按键检测->外部中断->定时/计数器->串口中断...这是从学习51的时候养成的习惯。所以这次要说的是定时/计数器,从名字上就能看出,其实分两部分:定时器和计数器,功能分别是定时和计数(这怎么看都让人觉的是废话)。

先来说下使用定时器和延时函数的差别吧,还是那句话,使用定时器能更好的提高CPU的效率。(怎么感觉今天特别多废话啊

然后照例,看一下定时/计数器的相关寄存器:定时器控制寄存器(TCR)、计数控制寄存器(CTCR)、预分频寄存器(PR)、匹配寄存器(MR0、MR1、MR2、MR3)、中断寄存器(IR)、匹配控制寄存器(MCR)。好像有点多,不说没事,我们一个个来说。

1、定时器控制寄存器:用来控制定时/计数器功能。说浅显一点就是控制技术器的使能和复位,这个寄存器第一位为1时,定时器计数器和预分频计数器使能计数,为0时,计数器被禁止。第二位为1时,定时器计数器和预分频计数器同步复位。来看下面的代码。

  1. LPC_TIM0->TCR=0x02;                    //TIM0计数器复位
复制代码

在初始化定时器前,必须要对计数器进行复位,当初始化完成后必须进行使能定时器。

2、计数控制寄存器:用于选择工作模式:定时器模式和计数器模式。以及在计数器模式下选择计数方式:电平和边沿。。其实对于本次要讲解的定时器,这个寄存器可以不用配置,应为是默认为定时器模式。看下面的代码。

  1. LPC_TIM0->CTCR=0x00;//配置TIM0为定时器模式
复制代码

3、预分频寄存器:这个说起来好像有点麻烦,简单点来说就是为了得到不同的频率值。比如100MHz预分频为2,得到的就是100/2=50MHz。看下面的代码。

  1. LPC_TIM0->PR=0;//设置TIM0预分频的值为0
复制代码

4、匹配寄存器:匹配寄存器有四个,分别对应着四个定时/计数器。用于配置定时器计数上限值,而怎么配置这个寄存器还要说一下LPC的时钟配置,这个等下来讲。先来看代码。

  1. LPC_TIM0->MR0=25000000-1;//匹配寄存器0
复制代码

5、中断寄存器:用于清除中断或者确定挂起的中断源。其中低4位用于匹配中断,高4位用于捕获中断,写入1会复位中断。看下面的代码。

  1. LPC_TIM0->IR=0xff;//设置全部中断寄存器
复制代码

6、匹配控制寄存器:用来控制发生匹配时所执行的操作。每三位控制一个定时/计数器,第一位置位表示允许产生中断,第二位置位时表示允许定时器计数达到上限时TC复位,第三位置位时表示定时器计数达到上限时TC和PC停止增加,同时定时/计数器被禁止。看下面的代码。

  1. LPC_TIM0->MCR=0x03;//允许MR0与TC值匹配时产生中断
复制代码

说完寄存器,接着来讲下比较麻烦的时钟配置吧。没办法,这个还真不好跳过,不然你的定时器定时多长你都不会算,那等于没学。在这我只做简单的介绍,能自己计算出需要定的时长就好。

首先LPC1768的锁相环(PLL)是先分频和倍频。先不管什么是锁相环,从这句话可以知道PLL输出频率与倍频数和分频数都有关。

于是 PLL_out_clk = Fcco = PLL_in_clk x 倍频数 x 2 / 分频数。

再来看一下system_LCP17xx.c文件中是怎么配置的。

首先看一下这两行代码

  1. #define PLL0CFG_Val 0x00050063//设置M值与N值
复制代码
  1. #define CCLKCFG_Val 0x00000003
复制代码

先来看第一行,其中5是表示的是分频值N=5+1,63表示的是倍频值M(这里需要把16进制转换为十进制)=99+1。所以PLL_out_clk = 12MHz x 100 x 2 / 6 = 400MHz(我用的外部晶振为12MHz)。然后是第二行,是PLL倍频出来的时钟送给CPU前的分频,CCLKCFG_Val=3,为4分频,所以LPC1768的主频率为CCLK = PLL_out_clk / 4= 400MHz / 4 =100MHz。

嗯,这次要用到的就这些吧,我也不知道大家能不能看懂。

然后回过头来说匹配寄存器的值和你要定的时长之间的关系。首先,外设的频率是主频率的4分频,为什么是四分频呢,看下面代码。默认该寄存器为0时,外设分频为4分频。

  1. #define PCLKSEL0_Val 0x00000000
复制代码

所以外设频率为PLCK=CCLK/4=100MHz/4=25MHz。

最后终于到了关键时刻,前面扯了一大堆都是为了这一刻。要定的时长为TIME=匹配值/PLCK(需要注意的是之前预分频值设置为0,所以外设时钟不分频,如果预分频值不为0,则实际时长需要在乘以分频值)。看下面代码。TIME=25000000/25MHz=1s,所定时长为1秒。

  1. LPC_TIM0->MR0=25000000-1;//匹配寄存器0
复制代码

好了,就讲到这里了,接下来是我自己写的程序,这次写了两个程序,一个是使用了中断,一个是没有使用中断。效果均为LED0闪烁,间隔为1s。

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:TIMER无中断.zip 
下载次数:5  文件大小:451.52 KB 
下载权限: 不限 以上或 VIP会员   [购买VIP]   [储备金充值]

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:TIMER有中断.zip 
下载次数:5  文件大小:457.8 KB 
下载权限: 不限 以上或 VIP会员   [购买VIP]   [储备金充值]


评分

参与人数 4创易币 +24 联盟豆 +10 收起 理由
奖励发放专用 + 15 每月好帖提名(第001期)集中奖励.
huicy + 5 赞一个!
Simon + 2 + 5 很给力!
for人生 + 2 + 5 很给力!

查看全部评分

累计签到:105 天
连续签到:1 天

141

帖子

1407

积分

3

听众

CY-4级

Rank: 5Rank: 5Rank: 5

积分
1407
发表于 2017-9-2 00:13:25 | 显示全部楼层
沙发沙发
#论坛管理认证#  论坛管理认证

累计签到:74 天
连续签到:2 天

39

帖子

704

积分

1

听众

版主

Rank: 18Rank: 18

积分
704
发表于 2017-9-4 21:56:50 | 显示全部楼层
一看就明白,特别是倍频分频部分
累计签到:1 天
连续签到:1 天

36

帖子

3

积分

0

听众

CY-1级

Rank: 1

积分
3
发表于 2017-11-22 16:50:21 | 显示全部楼层
谢谢楼主,楼主好人

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 收藏帖子 搜索
快速回复 返回顶部 返回列表