首页

如何使用定时器在LPC1768?LPC1768计时器教程

在本教程中,我将向您展示如何在LPC1768 Arm Cortex-M3单片机中配置和使用定时器。计时器是现代微控制器的重要外设之一。它们用于生成周期性中断(在' Timer '模式下),也用于计数事件(在' Counter '模式下)。使用这个LPC1768定时器教程,您可以生成精确的延迟,这是非阻塞延迟(与硬编码延迟函数相反)。

重要提示:我已经在前面的教程中提到过这一点,但我将在每一个LPC1768教程中重复它。伟德老虎机手机版从NXP官方网站上下载LPC1768 MCU的数据表和用户手册。我无法详细解释/讨论每一个话题。你必须在那些文件中查找讨论的主题并收集额外的信息。

简介

定时器是微控制器的重要硬件组成部分。通常,计时器用于测量运行时间,如处理器滴答声或计算外部事件。因此,定时器和计数器在嵌入式系统中可以互换使用。从简单的LED控制和周期事件生成到复杂的电机控制应用,定时器外围设备是大量应用的组成部分。

如果你还记得LPC1768 GPIO教程,我已经给出了一个简单的LED Blinky硬编码延迟程序。这种硬编码延迟的方法是不可取的,因为它会在延迟期间阻塞处理器,并且不允许任何其他操作(如中断)。

产生延迟的正确方法是使用MCU的Timer外围设备。使用定时器产生的延迟是非常精确的,也是非阻塞的,即他们允许中断。

定时器在LPC1768

在LPC1768中有四个相同的定时器外设,即Timer0, Timer1, Timer2和Timer3。所有四个定时器都是32位定时器,带有可编程32位预调器。

它们被设计用来计算外围时钟或外部时钟信号的周期,并可选地在指定的计时器值(基于四个匹配寄存器)生成中断(或其他操作)。

在LPC1768中的所有定时器寄存器中,定时器计数器(TC)和预刻度寄存器(PR)特别重要,因为它们直接负责定时器的功能。定时器外设复位并启用后,其TC寄存器初始化为0,每PR+1个时钟周期增加1。达到最大值后,TC中的值重置为0,并重新开始计数。

PR寄存器控制定时器的分辨率。例如,当PR设置为0时,TC在外围时钟的每个周期增加。类似地,如果PR设置为1,则TC在外围时钟的2个周期增加。使用这两个寄存器,我们可以产生精确的延迟。

与计时器相关的另一个重要寄存器是匹配寄存器。每个定时器外设有四个匹配寄存器。用户可以将值加载到这些匹配寄存器中,对于每一个TC增量,TC中的值都会与匹配寄存器中的值进行比较。

如果值是匹配的,那么匹配寄存器可以执行以下任何操作:

  • 产生一个中断。
  • TC复位
  • TC和PR将被停止,相应的TCR将被设置为0。

此外,当匹配寄存器和TC中的值匹配时,您还可以控制外部匹配寄存器(EMR)来设置外部匹配输出引脚为LOW、HIGH或Toggle。

计时器0、1和3分别有两个外部匹配输出,而计时器2有四个外部匹配输出。

使用这个功能,我们可以切换一个连接到匹配输出引脚之一的LED,而不需要处理器或任何GPIO功能的干预。

LPC1768计时器针

LPC1768单片机中的定时器有两组与之相关的引脚。一组引脚是捕获输入引脚,而另一组引脚是外部匹配输出引脚。下表显示了定时器周边与LPC1768端口引脚的引脚映射。

定时器外设的引脚名称命名约定如下:

CAPx。y表示捕获定时器x的输入y。

CAP0.0 P1.26
CAP0.1 P1.27
CAP1.0 P1.18 / p1.28 / p2.6
CAP1.1 P1.19 / P1.29
CAP2.0 P0.4
CAP2.1 P0.5
CAP3.0 P0.23
CAP3.1 P0.24
MAT0.0 P1.28 / P3.25
MAT0.1 P1.29 / P3.26
MAT1.0 P1.22
MAT1.1 P1.25
MAT2.0 P0.6 / P4.28
MAT2.1 P0.7 / P4.29
MAT2.2 P0.8
MAT2.3 P0.9
MAT3.0 P0.10
MAT3.1 P0.11

从上表中可以看到,有许多引脚与计时器外设相关联。必须使用PINSEL寄存器选择适当的引脚。

LPC1768的定时器寄存器

LPC1768 MCU中的每个外设都有15个寄存器。现在,我将尝试解释LPC1768中与计时器相关的一些重要寄存器的功能。

定时器控制寄存器:用于控制定时器计数器功能,即启用、禁用和重置。

位0 计数器使 当1时,TC和PR开启计数。当0时,TC和PR被禁用。
位1 计数器重置 当1时,TC和PR在PCLK的下一个正边缘重置。计数器保持重置,直到该位返回0。

TC -计时器计数器寄存器:它是一个32位的寄存器,在PCLK的每PR+1循环中递增。除非它在中间重置,否则它将达到最大值0xFFFFFFFF并返回0并开始再次递增。

PR -预刻度寄存器:它是一个32位寄存器,用于指定预缩放计数器(PC)的最大值。当PC值等于PR中的值时,TC在下一个时钟周期中递增,同时清除PC。

PC -预刻度计数器寄存器:它是一个32位的寄存器。PC中的值在每个PCLK周期中递增,当其值与PR中的值匹配时,TC递增,PC中的值在下一个PCLK周期中休息。当PR为0时,TC在每个PCLK周期上递增。当PR为1时,TC每增加2个PCLK循环。

MCR -匹配控制寄存器:当一个匹配寄存器与TC匹配时,用于控制TC上的操作。

位[2:0]用于MR0,位[5:3]用于MR1,位[8:6]用于MR2,位[11:9]用于MR3。剩余位保留。让我们看看一个匹配寄存器MR0的操作。

位0 MR0I 当取值为1时,当MR0与TC匹配时产生中断。
位1 MR0R 1时,如果MR0与TC匹配,则复位TC。
位2 MR0S 当为1时,停止TC和PR,如果MR0与TC匹配,则设置TCR[0]为0。

类似地,其他位用于控制对其他匹配寄存器的操作。

MR0 - MR3 -匹配寄存器:包含要与TC比较的用户加载值。当匹配寄存器中的值与TC匹配时,可以根据MCR寄存器的指示执行适当的操作。

EMR -外部匹配寄存器:控制外部匹配引脚MAT0.0, MAT0.1, MAT1,0等。位0控制MATx.0Timerx的Pin和这个位的值是由位决定的[5:4]。

外部匹配输出 EMR中的外部匹配位 EMR中的控制位 控制位的价值 外部匹配销/位的动作
MATx.0 0 5:4 00 什么都不做
01 清除一些
10 设置一些
11 切换的

同样的,

  • MATx。1、外部匹配位为1,控制位为[7:6]。
  • MATx。2、外部匹配位为3,控制位为[9:8]。
  • MATx。3、外部匹配位为4,控制位为[11:10]。

注意:MATx。2和MATx。3只对Timer 2可用。

CTCR -计数控制寄存器:用于选择定时器模式或计数器模式。如果计数器模式被选择,你也可以选择输入捕获引脚以及计数的边缘(上升,下降或两者)。

位(1:0) 计数器/定时器模式 当00时,定时器模式。当01,计数器模式与上升边缘。当10,反模式与下降边缘。当11,对抗模式与两边。
位[3:2] 计数器输入选择

00时,CAPx。0pin for Timerx.

01时,CAPx。Timerx的1针。

计算定时器预定标器

首先,我们必须为Timer选择外围时钟。这是在PCLKSEL0和PCLKSEL1寄存器的帮助下完成的。下表显示了每个计时器的PCLKSEL寄存器位。

Timer0 PCLKSEL0 [3:2]
Timer1 PCLKSEL0 [25:4]
Timer2 PCLKSEL1(十三12)
Timer3 PCLKSEL1(十五14)

这些PCLKSEL位中的值将决定计时器的最终PCLK。

00 PCLK = CCLK / 4(默认值)
01 PCLK = CCLK
10 PCLK = CCLK / 2
11 PCLK = CCLK / 8

在PCLK完成之后,我们可以计算Prescaler值。

一个时钟周期的时间由:

LPC1768中的定时器

对于给定的PCLK和PR值,Timer产生的最小时间持续时间(或Timer的分辨率)由:

LPC1768中的定时器

由此,我们可以计算不同定时器分辨率下的PR值。例如,如果我们想要1毫秒分辨率的定时器与25兆赫的PCLK,然后

Pr =(25 * 10。6* 1 * 103) - 1 = 24999

初始化LPC1768中的TIM0

首先,在PCONP寄存器中启用TIM0。复位时TIM0和TIM1同时使能。

LPC_SC - > PCONP | = (1 < < 1);

设置PCLK作为CCLK/ 4。这是默认设置的。

LPC_SC - > PCLKSEL0 & = ~段(0 x3 < < 3);

在CTCR寄存器中设置定时器模式。

LPC_TIM0 - > CTCR = 0 x0;

在PR寄存器中设置Prescaler值。基于以上计算,对于1毫秒分辨率,TC必须增加每PR+1,即24999+1个时钟周期。

Lpc_tim0 -> pr = (25000 - 1);

最后,重置定时器来重置TC和PR值。

LPC_TIM0细胞受体)- > = 0 x02;

使用LPC1768定时器生成延迟

现在让我们看看如何使用Timers生成以毫秒为单位的延迟。让我以TIM0为例。此外,在继续之前,请执行前面的初始化步骤。

首先,重置计时器。

LPC_TIM0细胞受体)- > = 0 x02;

然后,开启定时器。

LPC_TIM0细胞受体)- > = 0 x01;

为了产生“毫秒”的延迟量,比较TC值和“毫秒”,一旦它们匹配,退出并禁用计时器。

在TC (LPC_TIM0 - > <毫秒);

LPC_TIM0细胞受体)- > = 0 x00;/ /关闭定时器

例子

使用以上两种情况,让我们使用定时器产生的延迟来闪烁LED。

# include < lpc17xx.h >
#定义预分频(25000 - 1)
Void延迟(unsigned int毫秒);
空白Timer0_Init(无效);
int主要(空白)

Timer0_Init ();
LPC_GPIO0 - > FIODIR = (1 < < 22);
而(1)

LPC_GPIO0 - > FIOSET = (1 < < 22);
delayms (1000);
LPC_GPIO0 - > FIOCLR = (1 < < 22);
delayms (1000);

返回0;


空白Timer0_Init(空白)

LPC_SC - > PCONP | = (1 < < 1);
LPC_SC - > PCLKSEL0 & = ~段(0 x3 < < 3);

LPC_TIM0 - > CTCR = 0 x0;
LPC_TIM0 - >公关=预分频;

LPC_TIM0细胞受体)- > = 0 x02;


无效延迟(无符号整数毫秒)

LPC_TIM0细胞受体)- > = 0 x02;
LPC_TIM0细胞受体)- > = 0 x01;

在TC (LPC_TIM0 - > <毫秒);

LPC_TIM0细胞受体)- > = 0 x00;

结论

一个关于如何在LPC1768单片机中使用定时器的简单教程。本LPC定时器教程还解释了如何使用定时器周边而不是硬编码的延迟功能生成精确的延迟。

留下一个回复

您的电邮地址将不会公布。

Electronicshub图标
Baidu
map