定时器介绍及简单应用

发布于:2025-04-13 ⋅ 阅读:(21) ⋅ 点赞:(0)

定时器介绍及简单应用

1.定时器基本介绍

定时器的用途:定时控制,精确延时,频率测量,脉宽测量,信号产生等。

1.1MSP430的四种定时器:

  1. 看门狗定时器:基本定时,当程序发生错误时执行一个受控的系统重启动
  2. 定时器A:基本定时,工作在低频率,低功耗条件下
  3. 定时器B:基本定时,功能基本同定时器A,但更灵活,功能更强大
  4. 实时时钟:基本定时,日历功能

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中工作模式:

停止模式增计数模式连续计数模式增/减计数模式

工作模式

  1. 停止模式(MCx=00)
    停止模式下计数器将暂停计数且 TAR 保持计数停止前的内容。
    当定时器启动计数时,计数器将从暂停时的值开始按照事先设置好的计数方式进行计数。
  2. 连续计数模式(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;      // 默认情况,忽略
    }
}