zoukankan      html  css  js  c++  java
  • MSP430 G2553 计时/计数器 Timer_A

    MSP430G2553包含了两个16-bit Timer_A计时/计数器。本文简单介绍了Timer_A的功能和寄存器使用,本文及后续的随笔部分参考了"Scientific Instrument Using the TI MSP430"博客。该博客的MSP430教程文章非常好,建议对MSP430感兴趣的人翻墙阅读。

    一、介绍

    Timer_A可实现的功能有

    - multiple compare:判断计时器时间是否到达设定条件,触发事件

    - multiple capture:捕获某个事件发生的时间

    - PWM output:脉冲调制信号输出

    - interval timing

    Timer_A的构造框图如下所示。

    二、Timer Block

    - 包含了一个16-bit的timer/counter寄存器TAR。

    - 时钟源可以由TAxCTL寄存器的TASSELx位段选择,为SMCLK、ACLK、TACLK、INCLK四者中的一个。其中TACLK、INCLK为外部输入的信号,对应管脚需查看具体芯片手册。

    - 分频比由TAxCTL寄存器的IDx位段选择,支持1/2/4/8分频。

    - Timer的开关及运行模式由TAxCTL寄存器的MCx位段选择,默认为00(Timer关闭)。运行模式支持up mode, continuous mode, up/down mode 三种,如下图所示。

    - 将TAxCTL寄存器的TACLR位置0,可实现将TAR清零,同时TAxCTL寄存器的IDx、MCx位段也会被清零。

    - Timer overflow时可产生中断,由TACTL寄存器的TAIE使能,中断标志位为TACTL寄存器的TAIFG位。

    三、Compare Block

    - 每个Timer_A包含两个(TAxCCR0、TAxCCR1)或三个(TAxCCR0、TAxCCR1、TAxCCR2)capture/compare register。如MSP430G2553的每个Timer_A包含三个capture/compare register。

    - compare模式可以产生PWM信号,和特定时间间隔的中断。

    - compare模式由TAxCCTLx寄存器的CAP=0来使能。

    - 当TAR寄存器计数到TAxCCTLx寄存器的值时,可触发中断,由TAxCCTLx寄存器中的CCIE位使能,中断标志位为TAxCCTLx寄存器中的CCIFG位。

    四、Capture Block

    - capture模式可用时间测量、速度计算。

    - 外部输入信号为CCIA或CCIB,对应GPIO管脚或其他外设输出,需查看具体芯片手册。

    - capture模式由TAxCCTLx寄存器的CAP=1及CMx位段来使能。

    - 捕获条件由TAxCCTLx寄存器的CMx位段设置,默认为00(关闭)。捕获条件可以为仅上升沿、仅下降沿、上升/下降沿三种之一。

    - 建议设置TAxCCTLx寄存器的SCS位,从而将捕获产生信号与时钟信号同步。

    - 当上一次捕获产生信号被读取前又有了新的捕获产生信号、即capture overflow时,TAxCCTLx寄存器的COV标志位会置1。

    - 捕获事件发生时,产生的中断标志位与compare模式相同,为TAxCCTLx寄存器中的CCIFG位。亦由TAxCCTLx寄存器中的CCIE位使能。

    五、一个简单例子

    利用MSP430G2553 Timer0_A的compare mode,产生频率为0.1Hz的方波,驱动LED进行显示。代码在中断程序中又进行了一次计数,以实现长时间间隔定时。

     1 #include "io430.h"
     2 
     3 #define LED1 BIT0 //red led on G2 Launchpad
     4 
     5 //global variables
     6 char i = 0;
     7 
     8 void main(void)
     9 {
    10     // Stop watchdog timer to prevent time out reset
    11     WDTCTL = WDTPW + WDTHOLD;
    12     
    13     P1OUT = 0;
    14     P1DIR |= LED1;
    15     
    16     // set DCO freq = 1MHz
    17     BCSCTL1 = CALBC1_1MHZ;
    18     DCOCTL = CALDCO_1MHZ;
    19     
    20     // BCM+ initial state:
    21     // DCOCLK -> MCLK
    22     // DCOCLK -> SMCLK
    23     // comprare/capture mode -> compare mode
    24     
    25     TA0CCR0 = 62550 - 1;
    26     TA0CCTL0 = CCIE; // enable compare interrupt
    27     TA0CTL = TASSEL_2 + ID_3 + MC_1 + TACLR;
    28     // input clock: SMCLK/8 -> 125kHz; 
    29     // timer overflow freq: 125k/(TA0CCR0+1) -> 2Hz
    30     // clear and start the timer, up mode
    31    
    32     __enable_interrupt();
    33    
    34     while(1)
    35     {
    36     
    37     }
    38 
    39 }
    40 
    41 //interrupt service routines
    42 #pragma vector = TIMER0_A0_VECTOR
    43 __interrupt void CCR0_ISR(void)
    44 {
    45     if(++i == 10) // interval: 1/2 * 10 = 5s, freq: 0.2Hz
    46     {
    47         // no flag clearing necessary; CCR0 has only one source, 
    48         // so it's automatic.
    49         P1OUT ^= LED1; // the sqaure wave freq: 0.2Hz/2 -> 0.1Hz
    50         i = 0;
    51     }
    52 }
  • 相关阅读:
    Git常用命令
    maven profile动态选择配置文件
    Nodejs的偏函数
    用CountDownLatch来同步java的多线程
    NodeJS的Promise的用法
    alluxio常用命令
    常见小代码
    Mongodb
    Mysql_常用语法
    PostgreSQL
  • 原文地址:https://www.cnblogs.com/zlbg/p/4732371.html
Copyright © 2011-2022 走看看