定时器介绍及简单应用
文章目录
1.定时器基本介绍
定时器的用途:定时控制,精确延时,频率测量,脉宽测量,信号产生等。
1.1MSP430的四种定时器:
- 看门狗定时器:基本定时,当程序发生错误时执行一个受控的系统重启动
- 定时器A:基本定时,工作在低频率,低功耗条件下
- 定时器B:基本定时,功能基本同定时器A,但更灵活,功能更强大
- 实时时钟:基本定时,日历功能
2.定时器A(Timer_A)
2.1特点
定时器A具有如下特点:
- 4种类运行模式的异步16位定时/计时器
- 参考时钟源可选择
- 5/3可配置的捕获/比较寄存器
- 可配置的PWM输出
- 异步输入和输出锁存
- 具有可对Timer_A中断快速响应的中断向量寄存器
同步和异步的区别:
- 执行顺序:同步按顺序依次执行任务;异步任务执行顺序不固定,可同时启动多个任务。
- 阻塞特性:同步通常会阻塞线程,直到操作完成;异步一般是非阻塞的,调用后可继续执行其他代码。
- 应用场景:同步适用于需保证任务顺序和数据一致性的场景;异步用于处理耗时操作,以提升程序响应速度和性能。
2.2寄存器的命名
MSP430F5529的定时器A由3个形似相近的模块构成。其中TA0有5个捕获/比较器;TA1/2有3个捕获/比较器
命名形式:TAx,TAxCCRx(x与具体型号有关)。
例如:
TA0,TA0CCR0,TA0CCR1,TA0CCR2……
TA1,TA1CCR0,TA1CCR1,TA1CCR2……
2.3寄存器表格
2.4计数器原理说明
2.4.1时钟源、分频器、计数器、工作模式
计数器部件由时钟源选择、分频器、16位计数器以及工作模式控制组成
2.4.2计数器复位
2.5定时器中断
2.5.1定时器中断条件及标志位
- 中断可以由计时器溢出引起,也可来自捕获/比较寄存器
- 定时计数器溢出中断标志位时TAIFG
- TAxCCR0中断标志位TAxCCR0 CCIFG
2.5.2中断的中断向量
定时器A中断有两个中断向量(以TA0为例)
- TACCR0中断比较特殊,它独自拥有一个中断向量(TIMERO AO VECTOR),是单源中断
- 定时器溢出中断和其它两个比较/捕获中断共享一个中断向量(TIMERO A1 VECTOR),属于共源中断。
2.6计数工作模式
Timer_A共有4中工作模式:
停止模式、增计数模式、连续计数模式和增/减计数模式。
- 停止模式(MCx=00)
停止模式下计数器将暂停计数且 TAR 保持计数停止前的内容。
当定时器启动计数时,计数器将从暂停时的值开始按照事先设置好的计数方式进行计数。 - 连续计数模式(MCx=10)
在连续计数模式下,Timer A定时器增计数到0FFFFh之后从0开始重新计数,如此往复。
连续计数模式的中断:
- 计数周期为65536
- 当定时器计数值从0FFFFh计数到0时,置位TimerA中断标志位,之后又从0开始重新计数。(见上图)
2.6寄存器位设置说明
- 第 15 - 10 位:Reserved(保留位),保留给未来可能的功能扩展使用,一般不进行操作 。
- 第 9 - 8 位:TASSEL(定时器时钟源选择位 )。
- 00:选择 TAxCLK 作为时钟源;
- 01:选择 ACLK(辅助时钟)作为时钟源;
- 10:选择 SMCLK(系统主时钟)作为时钟源;
- 11:选择 INCLK(外部输入时钟)作为时钟源。
- 第 7 位:ID(输入分频位 )。
- 00:不分频;
- 01:2 分频;
- 10:4 分频;
- 11:8 分频。
- 第 6 位:MC(计数模式控制位 )。
- 00:停止模式;
- 01:增计数模式;
- 10:连续计数模式;
- 11:增 / 减计数模式 。
- 第 5 - 3 位:Reserved(保留位),保留用途,不操作。
- 第 2 位:TACLR(定时器清除位 ),写 1 时清除定时器 TAxR 和捕获 / 比较寄存器,同时复位分频器,写 0 无响。
- 第 1 位:TAIE(定时器中断使能位 ),置 1 时使能定时器溢出中断,清 0 时禁止。
- 第 0 位:TAIFG(定时器溢出标志位 ),定时器计数溢出时置 1,可通过软件清 0 。
2.7使用TA0定时器点灯(实操)
原理:使用定时器TA0,使用SMCLK时钟,连续模式,根据定时器溢出中断来改变灯的状态。
#include "intrinsics.h"
#include "msp430f5529.h"
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // 停止看门狗定时器,防止其复位系统
P1DIR |= BIT0;
// 配置定时器A0
// TASSEL_2: 选择SMCLK作为时钟源
// MC_2: 连续模式(定时器从0计数到最大值后重新开始)
// TACLR: 清除定时器计数器
// TAIE: 开启定时器溢出中断
TA0CTL |= TASSEL_2 + MC_2 + TACLR + TAIE;
// 进入低功耗模式0(LPM0),并开启全局中断(GIE)
__bis_SR_register(LPM0_bits + GIE);
}
#pragma vector = TIMER0_A1_VECTOR
// 定时器A0的中断服务程序
__interrupt void TIMER_A1_ISR(void) {
switch (__even_in_range(TA0IV, 14)) {
case 0: break; // 无中断(通常不会发生)
case 2: break; // CCR1 不使用
case 4: break; // CCR2 不使用
case 6: break; // 保留
case 8: break; // 保留
case 10: break; // 保留
case 12: break; // 保留
case 14:
P1OUT ^= BIT0;//闪烁
break;// 定时器溢出中断(TAIFG标志位触发)
default: break; // 默认情况,忽略
}
}