首页

手臂计时器教程

在GPIO介绍教程中,我们已经看到了一个示例程序来闪烁一组led。为了显示LED ON和OFF情况之间的差异,我们使用了一个简单的延迟函数。在这个延迟函数中,我们简单地使用了一个for循环,在这个循环中,CPU花费了一些时间(在延迟函数中提到的时间量),因此CPU不做任何其他工作。

这种在程序中提供延迟的方法是无效的,并且会影响整个系统的性能。因此,我们需要改进这一点,实现一个精确的延迟函数。为此,我们需要使用计时器的概念。

计时器和计数器通常与微控制器中的单个模块相关联。术语Timer / Counter反映了负责的模块可以配置为计算常规时钟脉冲,这使它成为Timer,或计算外部事件,这使它成为计数器。mcu中定时器/计数器的主要和重要功能是产生精确的时间延迟和计算外部动作。

LPC2148中的计时器/计数器

LPC2148中有两个定时器块,分别是timer 0 / Counter 0和timer 1 / Counter 1。这两个计时器都是32位计时器,两个块除了基址不同之外是相同的。

任何一个计时器块都可以用作计时器,用于在特定时间后触发中断,或者用作计数器,用于计数no。外部事件甚至解调外部事件脉宽调制信号(通过捕获输入)。

每个计时器块与许多寄存器相关联,但两个重要的寄存器是计时器计数器和预刻度寄存器。这两个寄存器相互协调工作。

预刻度寄存器(PR)定义了定时器的分辨率。当LPC2148中的一个定时器块被复位并使能时,定时器计数器(TC)寄存器被设置为0,并且每“PR + 1”个时钟周期增加1。当TC达到最大值即0xFFFF FFFF时,该值重置为0x0000 0000并重新开始计数。

因此,如果PR设置为0,则TC为外围时钟(PCLK)的每一个时钟周期增加。类似地,如果PR设置为1,则外围时钟每两个时钟周期TC就增加一个。因此,PR寄存器中的值决定计时器何时递增或计数。

在讨论与计时器相关的其他重要寄存器之前,我们需要了解两个重要的寄存器。每个定时器块有4个匹配寄存器和4个捕获寄存器与它们相关联。每个寄存器都是32位宽的。

匹配寄存器由用户设置的值组成,该值将不断与计时器计数器(TC)寄存器中的值进行比较。当定时器被启用时,每次TC中的值被增加时,这个值将与匹配寄存器中的值进行比较。如果两个值相等,则会自动触发某些操作。一些动作是重置计时器/计数器,停止计时器或产生中断。所有与匹配寄存器相关的操作都使用匹配控制寄存器进行控制。

另一个寄存器是捕获寄存器。当事件发生在被定义为捕获引脚的引脚上时,计时器计数器(TC)中的值被复制到捕获寄存器。

LPC2148中与计时器相关的寄存器

现在,我们将看到与Timer模块相关联的最常用寄存器的列表。

预分频寄存器(PR):预缩放寄存器:预缩放计数器的最大值。当预刻度计数器(PC)等于PR时,TC在下一个时钟增加,同时PC被清除。

预刻度计数寄存器(PC):预刻度计数器在每个外围时钟上递增到PR中存储的值。当PC中的值等于PR中的值时,下一个时钟周期重置PC, TC加1。例如,如果PR = 2,那么TC在外围时钟每第三个周期增加一次。因此,PC定义了定时器的分辨率。

计时器计数器寄存器(TC):当PC的值达到PR寄存器所设置的终端值时,计时器计数器寄存器中的值增加。如果PC在达到最大值之前被重置,那么TC将计数到最大可能的值,即0xFFFF FFFF(因为它是一个32位寄存器),并重置回0x0000 0000。

定时器控制寄存器(TCR):定时器控制寄存器,用于控制定时器/计数器的功能。用来启用/禁用或重置计时器计数器。只有TCR的前两位必须用于这些操作。当第一个比特(TSR[0])为0时,定时器计数器和预缩放计数器被禁用。当第1位为1时,表示启用计数器。当第二个比特(TSR[1])为1时,两个计数器(计时器计数器和预刻度计数器)都被重置到外围时钟的下一个正边缘上。它们保持重置,直到第二个位被设置为0。

计数控制寄存器(CTCR):计数控制寄存器用于设置定时器模式或计数器模式。如果选择计数器模式,可以使用CTCR选择计数器引脚和边缘(上升、下降或两者都有)。在本教程中,我们将只使用定时器模式,因此CTCR设置为“0x0”。

匹配控制寄存器(MCR):匹配控制寄存器用于控制当匹配寄存器(MR)中的值与计时器计数器(TC)中的值相匹配时要执行的动作。MCR中的位0到2(即MCR [0], MCR[1]和MCR[2])用于控制MR0寄存器的动作。类似地,MR1的比特3 ~ 5,MR2的比特6 ~ 8,MR3的比特9 ~ 11。我们将看到与MR0相关的函数。

  • 位0:当该位为1时,当MR0等于TC时触发中断。当此位为0时,中断被禁用。
  • 第1位:当该位为1时,当MR0等于TC时,TC复位。当该位为0时,该特性被禁用。
  • 第2位:当该位为1时,当MR0中的值等于TC时,定时器计数器(Timer Counter)和预刻度计数器(precale Counter)停止。同时,TC被重置为0。

类似的操作可适用于其他匹配寄存器。

中断寄存器(IR)中断寄存器由匹配中断和捕获中断的标志位组成。它包含四个位,分别用于匹配和捕获中断。IR寄存器中的第0到3位用于匹配寄存器中断,即第0位用于MR0中断,第1位用于MR1中断等。第4到7位用于捕获寄存器中断,第4位用于CR0中断,第5位用于CR1中断等等。如果一个中断被触发,那么IR寄存器中的相应位被设置为1。在IR寄存器的位上手动写入逻辑1将重置中断。

配置定时器

我们已经在LPC2148中看到了计时器、与计时器相关的寄存器的概念,以及与这些寄存器相关的函数。下一步是在编程中使用计时器。为此,我们需要设置和配置计时器。在配置计时器之前,我们需要执行一些与预缩放寄存器相关的计算。

如果CCLK和PCLK配置为' X ' MHz,那么1个时钟周期所需的时间由

(1 / X *(10^6))秒。

我们将运行系统时钟(clk)和外围时钟(PCLK)的最大值,即使用锁相环60兆赫。

每PR+1循环,TC增加。因此,如果PR = 0, TC在每个时钟周期增加,TC增加1所需的时间为

(1 / 60 *(10^6))秒= 0.016µS。

如果我们将PR的值设为59999,那么PR+1 = 60000。所以,TC增加1所花的时间由

(60000 / 60 * (10^6)) = 1 mS。

现在我们已经看到了一些关于PR和TC的计算,现在我们将初始化Time块。需要记住的重要一点是,计时器块功能是在外围时钟(PCLK)的帮助下实现的。因此,必须在初始化Timer块之前初始化PCLK。

为了初始化计时器,我们需要使用计时器块的三个寄存器。它们是计数控制寄存器(CTCR),预刻度寄存器(PR)和定时器控制寄存器(TCR)。在本例中,我们将初始化Timer 0块。

为了初始化Timer 0块,必须执行以下步骤。

T0CTCR = 0 x0;//选择定时器模式。

T0PR = 59999;// PR设置为这个值,当TC增加1mS延迟时

T0TCR = 0 x02;//重置定时器

以上步骤将初始化Timer 0块。现在我们将看到一些命令,根据用户的要求获得以毫秒为单位的延迟。为此,我们需要使用计时器控制寄存器(TCR)和计时器计数器寄存器(TC)。

为了根据用户的输入获得以毫秒为单位的延迟,我们需要使用以下步骤。

T0TCR = 0 x02;//重置定时器

T0TCR = 0 x01;//启用定时器

while (T0TC < time_in_milliseconds);//等待直到TC达到所需的延迟

T0TCR = 0 x00;//禁用定时器

使用LPC2148和定时器闪烁led

我们在GPIO教程中看到过一个闪烁的例子,它具有无效的延迟函数。现在,我们将看到另一个闪烁程序使用计时器进行有效的延迟操作。下面是使用LPC2148和定时器闪烁led的程序。

# include < lpc214x.h >

/*定义延迟函数*/

空白延迟(int);

/*延迟函数的函数定义*/

无效延迟(int d)

T0TCR = 0 x02;

T0TCR = 0 x01;

while (T0TC < d);

T0TCR = 0 x00;

int main ()

PINSEL2 = 0 x00;

/*配置端口1的所有引脚为输出*/

IODIR1 = 0 xffffffff;

/*初始化PLL0并配置它产生60mhz系统时钟(CCLK)和外围时钟(PCLK) */

PLL0CON = 0 x01;

PLL0CFG = 0 x24;

PLL0FEED = 0 xaa;

PLL0FEED = 0 x55;

而(!(PLL0STAT & 0 x00000400));

PLL0CON = 0 x03;

PLL0FEED = 0 xaa;

PLL0FEED = 0 x55;

VPBDIV = 0 x01;

/*初始化定时器*/

T0CTCR = 0 x00;

T0PR = 59999;

T0TCR = 0 x02;

而(1)

IOSET1 = 0 xffffffff;

延迟(1000);

IOCLR1 = 0 xffffffff;

延迟(1000);

4的反应

  1. 你的解释很好。对每个人来说都很容易理解。
    还有一个请求,你能解释一下stm32f4..

    谢谢

留下一个回复

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

Electronicshub图标
Baidu
map