tongshaoqiang的个人空间 https://bbs.21ic.com/?598372 [收藏] [复制] [RSS]

日志

MSP430学习笔记--定时器

已有 691 次阅读2014-12-3 17:05 |系统分类:单片机| 单片机, 寄存器, 定时器, 波特率, 发生器

定时器在单片机系统中是非常重要的部分,它在事件控制与管理方面有着重要的应用。MSP430F149主要有看门狗,定时器A(Timer_A)和定时器B(Timer_B)等模块。

定时器资源功能 说明:

  (1)看门狗定时器(WDT):主要用于程序在产生错误是用作单片机系统复位重启的。另外也可作为一个基本定时器使用。

(2)定时器A:作基本定时器使用,结合捕获/比较功能模块可实现时序控制,可编程波形信号发生输出,可作串口波特率发生器使用。

(3)定时器B:作基本定时器使用,与定时器A基本相同,但是功能方面有某些功能会比A增强些。

   1 看门狗

  看门狗本质上是一个16比特的定时器。看门狗的主要功能就是检测到软件出现问题时重新启动系统。到看门狗设定的时间时,会产生一个系统的复位信号。没有设置为看门狗模式时也可以作为一般的定时器使用,可以选择时钟源(ACLK,MCLK),每个时钟源下有4个可选的时间间隔设置,通过软件来设置。

看门狗寄存器(WDTCTL)

小q截图-20130710085212.jpg

口令字节:5AH,否则产生系统复位信号

CNTCL:1,清除WDTCNT寄存器内容;0,不影响WDTCNT寄存器内容

TMSEL:1,定时器模式;0,看门狗模式

SEL;1,ACLK做时钟信号;0,SMCLK做时钟信号

IS0,IS1:看门狗时间间隔选择

    例程:P3.4外接LED,LED闪烁周期约为64ms。

#include  

void main(void)

{

  WDTCTL = WDT_MDLY_32;            //设置看门狗工作在SMclk下定时  器,定时间隔约32ms

  IE1 |= WDTIE;                                                   //开看门狗中断

  P3DIR |= BIT4;                                                   //设置p3.4为输出

_BIS_SR(LPM0_bits + GIE);                              //进入LMP3并打开全局中断

}

// Watchdog Timer interrupt service routine

#pragma vector=WDT_VECTOR

__interrupt void watchdog_timer(void)

{
  P3OUT ^= BIT4;                            // 取反P3.4

}

   SMCLK工作在1Mhz下的定时间隔为32ms,复位后SMCLK默认时钟来源是DCO(上电复位后约为800HZ),所以定时间隔会比32ms长一些。

2 Timer_A(定时器A)

   定时器A是一个16位的定时/计数器。它有3个捕获/比较寄存器。

小q截图-20130710105128.jpg
小q截图-20130710105151.jpg
Timer_A寄存器
小q截图-20130710115014.jpg
定时器使用时4种工作模式:
  停止模式:定时器处于暂停状态。
   增计数模式 :当定时计数器增到CCR0时捕获比较中断CCIFG标志置位。
小q截图-20130710123654.jpg
   连续计数模式:从0开始到0FFFFH再从0开始,当回到0时TAIFG置位(TAIFG为溢出标志)但并不中断,只有TAIE=1时才可以产生中断。可以设置不同的CCR0的值来产生中断CCIFG。小q截图-20130710124151.jpg
   增/减计数模式: 当增到CCR0时CCIFG置位,当减到0时TAIFG置位(TAIFG为溢出标志)。
小q截图-20130710124715.jpg
例程:利用Timer_A直接计数产生溢出,然后中断处理。
    ACLK=TACLK=32768hz,MCLK=SMCLK=default DCO~800KHZ   P1.0外接LED
#include
void main (void)
{
   WDTCTL = WDTPW + WDTHOLD;  //关闭看门狗
  TACTL = TASSEL_1 + MC_2 +TAIE;//ACLK,定时器A连续计数
                               //模式,开中断
                                 
   P1DIR |= BIT0;               //设置P1.0为输出
   _BIS_SR(LPM3_bits+GIE);      //进入LPM3,开全局中断
}
//Timer_A中断向量(TAIV)处理程序
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
   switch(TAIV)        //应用switch语句来处理多中断源的向量
{
    case 2:break;      //CCR1捕获比较寄存器中断入口
                      //本例未用到
    case 4:break;      //CCR2捕获比较寄存器中断入口
    case 10: P1OUT ^=BIT0;break;//定时器A在计满16位时将产生
                             //溢出中断,进入中断
   
  }
}


文章出处:http://bbs.**/BLOG_ARTICLE_3013540.HTM      
博主:我不知道丫   

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)