LPC学习笔记----计数器/定时器中断

LPC定时器

    • //概述
    • //特性
    • //定时器部件
    • //寄存器描述
    • //Keil使用LPC代码流程
    • 一.Config配置文件(确认单片机主频)
    • ----------1.确定单片机时钟频率
    • ----------2.确定单片机时钟主频率
    • 二.Target_int文件配置,初始化定时器
    • ----------3.对PCONP启动引脚引入高电平开启定时器中断
    • ----------4.配置匹配控制寄存器MCR
    • ----------5.配置定时器控制寄存器TCR
    • ----------6.数值计数器计数的值TC以及预分频寄存器PR配置
    • ----------7.匹配寄存器通道并初始化
    • ----------8.清除中断寄存器IR标志位
    • ----------9.Target_int 计时器初始化源代码(开启3号计时器中断)
    • 三.Timer计时器使用配置,使用计时器
    • ----------10.识别到中断后,判断标志位IR
    • ----------11.执行命令后,重新为MR指定下一次中断的TC时间
    • ----------12.清除中断,重置标志位IR
    • ----------13.附计时器使用例程

//概述

LPC178x/177x 系列 Cortex-M3 拥有 4 个 32 位可编程定时器/计数器,均具有捕获、比较匹配功能。定时器用来对外设时钟(PCLK)进行计数,而计数器对外部脉冲信号进行计数,可以选择在规定的时间处产生中断或执行其它操作,这都由 4 个匹配寄存器的值决定。它也包含4 个捕获输入,用来在输入信号变化时捕捉定时器的瞬时值,也可以选择产生中断。
注: 4 个定时器 / 计数器,除了外设基址之外其他完全相同。 4 个定时器最少有 2 个捕获输入和 2 个匹配输出,并且有多个引脚可以选择。定时器 2 引出了全部 4 个匹配输出。

//特性

 32 位的定时器/计数器,带有一个可编程的 32 位预分频器;
 计数器或定时器操作;
 每个定时器包含 2 个 32 位的捕获通道,当输入信号变化时捕捉定时器的瞬时值。也可
以选择产生中断;
 4 个 32 位匹配寄存器,允许执行以下操作:
- 匹配时连续工作,在匹配时可选择产生中断;
- 在匹配时停止定时器运行,可选择产生中断;
- 在匹配时复位定时器,可选择产生中断;
 有 4 个与匹配寄存器相对应的外部输出,这些输出具有以下功能:
- 匹配时设为低电平;
- 匹配时设为高电平;
- 匹配时翻转电平;
- 匹配时不执行任何操作。
LPC学习笔记----计数器/定时器中断_第1张图片LPC学习笔记----计数器/定时器中断_第2张图片

//定时器部件

LPC178x/177x 系列Cortex-M3 的定时器/计数器功能部件主要由三部分构成:
1. 计数部分
定时器的时钟源可以是 PCLK,对 PCLK 进行分频后,输入计数器,对其进行计数。另外LPC178x/177x 系列 Cortex-M3 可以对外部的脉冲进行计数,外部脉冲从 CAP 引脚输入。
2. 匹配功能部分
匹配寄存器 0~3 中保存匹配值,当某一个匹配值与当前的计数值匹配时,根据匹配控制寄存器(MCR)的设置,控制定时器的工作,也可以产生中断信号。当发生匹配时,寄存器 EMR还会控制对应的匹配引脚 MATn 输出特定的信号。
3. 捕获功能部分
当捕获引脚 CAPn 上出现有效信号(即捕获信号)时,会将计数器的当前值保存到捕获寄存器 CRn 中,并可产生中断

//寄存器描述

LPC学习笔记----计数器/定时器中断_第3张图片LPC学习笔记----计数器/定时器中断_第4张图片

1. 中断寄存器 T[0/1/2/3]IR
中断寄存器包含 4 个位用于匹配中断,4 个位用于捕获中断。如果有中断产生,IR 中的对应位会置位,否则为 0。向对应的 IR 位写入 1 会复位中断。写入 0 无效。清除定时器匹配中断也会清除对应的 DMA 请求。

LPC_TIM0->IR = 0xff; /* 清除定时器 0 的全部中断标志 */

2. 定时器控制寄存器 T[0/1/2/3]TCR
定时器控制寄存器(TCR)用来控制定时器/计数器的操作

LPC_TIM0->TCR = 0x01; /* 启动定时器 0

3. 计数控制寄存器 T[0/1/2/3]CTCR
计数控制寄存器(CTCR)用来在定时器模式和计数器模式之间进行选择,在计数器模式中选择计数的引脚和边沿
当选择计数器模式作为工作模式时,在每个 PCLK 时钟的上升沿对 CAP 输入(由 CTCR的位 3:2 来选择)进行采样。在对这个 CAP 输入的连续两次采样值进行比较之后,可以识别出下面其中一种事件:上升沿、下降沿、上升/下降沿或所选 CAP 输入的电平不变。如果识别出的事件与 CTCR 寄存器[1:0]选择的一个事件相对应,定时器计数器寄存器的值将增加 1。
当计数器计数外部脉冲时,处理的效率会收到一些限制。由于识别 CAP 所选输入的一个边沿需要使用 PCLK 时钟 2 个连续的上升沿,因此 CAP 输入的频率不能大于 PCLK 频率的二分之一。所以,在这种情况下同一个 CAP 引脚的高/低电平持续时间不能小于 1/(2PCLK)。

LPC_TIM0->CTCR = ( 0x02 << 0 ) | /* 计数器,在 CAP 的下降沿递增 TC /
( 0x01 << 2 ); /
选择 CAP0.1

4. 定时器计数器 T[0/1/2/3]TC
TC(Timer Counter)既是定时器的定时计数器又是外部计数器的计数器,这里简称定时器计数器
5. 预分频寄存器 T[0/1/2/3]PR
6. 预分频计数器 T[0/1/2/3]PC
LPC学习笔记----计数器/定时器中断_第5张图片

//Keil使用LPC代码流程

一.Config配置文件(确认单片机主频)

----------1.确定单片机时钟频率

(LPC默认主频为100MHZ)

----------2.确定单片机时钟主频率

(使用二分法分频将100MHZ降至25MHZ)
(一般在config文件中进行更改)
LPC学习笔记----计数器/定时器中断_第6张图片
在这里插入图片描述
在这里插入图片描述

二.Target_int文件配置,初始化定时器

----------3.对PCONP启动引脚引入高电平开启定时器中断

(定时器0和定时器1默认开启,无需启动电平)

程序中代码应专门写在定时器的初始化中:

LPC_SC->PCONP |= 1<<23; // 开启定时器3的管脚设置

LPC学习笔记----计数器/定时器中断_第7张图片

----------4.配置匹配控制寄存器MCR

匹配控制寄存器。 MCR 用来控制在匹配出现时是否产生中断和是否复位 TC
程序中代码应专门写在定时器的初始化中:

LPC_TIM3->MCR = 0x00; //关闭所有mcr功能,方便配置定时器
/…配置…/
#define Enable_T3MR1 LPC_TIM3->MCR |= 0x08 // 之后会重新开启相应定时器来开启中断

LPC学习笔记----计数器/定时器中断_第8张图片

----------5.配置定时器控制寄存器TCR

定时器控制寄存器。 TCR 用来控制定时器计数器功能。定时器计数器可以通过 TCR 来禁能或复位

LPC_TIM3->TCR = 0x02; //处于计数器复位模式,复位T3TC
/配置*/
LPC_TIM3->TCR = 0x01; //重新开启计时器

LPC学习笔记----计数器/定时器中断_第9张图片

----------6.数值计数器计数的值TC以及预分频寄存器PR配置

TC:保存定时器计数器的计数值。 32 位的 TC 每隔( PR+1)个 PCLK 周期递增一次。 TC 通过 TCR 来控制
PR:预分频寄存器。当预分频计数器的值与这个寄存器的值相等时,下个时钟 TC 加 1, PC清零

LPC_TIM3->TC = 0; //TC配置为0,默认不分频.
LPC_TIM3->PR = TPR_1ms; // 根据时钟频率配置默认单位,也就是数多少位为一个单位

附上24MHZ主频的默认时间单位

TPR_1 = 1,
TPR_1us = 23,
TPR_10us = 239,
TPR_100us = 2399,
TPR_1ms = 23999,
TPR_5ms = 119999,
TPR_10ms = 239999

下图中由于其代码MCR配置的会复位,因此TC数到6即复位,而在实际中TC往往不复位一直数下去,以此来充当一个开机后的计时器的效果.
LPC学习笔记----计数器/定时器中断_第10张图片

----------7.匹配寄存器通道并初始化

MR0:匹配寄存器 0。 MR0 可通过 MCR 设定为在匹配时复位 TC,停止 TC 和 PC 和/或产生中断

LPC_TIM3->MR2 = 500; //设定初始定时值,数500ms后进入中断函数并停止TC计时
Enable_T3MR2; //LPC_TIM3->MCR |= 0x08 使得中断开启,使其匹配中断但不复位T2TC

LPC学习笔记----计数器/定时器中断_第11张图片

----------8.清除中断寄存器IR标志位

IR:中断寄存器。可向 IR 写入相应的值来清除中断。也可读 IR 来确定 8 个中断源中哪个中断源被挂起

LPC_TIM3->IR = 0xFF; //为IR全部赋予高电平,清除标志位

LPC学习笔记----计数器/定时器中断_第12张图片

----------9.Target_int 计时器初始化源代码(开启3号计时器中断)

LPC学习笔记----计数器/定时器中断_第13张图片

三.Timer计时器使用配置,使用计时器

----------10.识别到中断后,判断标志位IR

IR:中断寄存器。可向 IR 写入相应的值来清除中断。也可读 IR 来确定 8 个中断源中哪个中断源被挂起

if((LPC_TIM3->IR & 0x04) == 0x04){…} //判别中断是否是MR2的标志位
LPC学习笔记----计数器/定时器中断_第14张图片

----------11.执行命令后,重新为MR指定下一次中断的TC时间

LPC_TIM3->MR2 = LPC_TIM3->TC+100; //为MR2赋值,下次TC再中断100ms即中断

可随意更改所需时间来达到计时目的

----------12.清除中断,重置标志位IR

LPC_TIM3->IR = 0x04;

不清除会导致永远停在这个中断中

----------13.附计时器使用例程

LPC学习笔记----计数器/定时器中断_第15张图片

你可能感兴趣的:(LPC入门学习,单片机,arm)