• MSP430学习笔记3----定时器学习


    目录

    第1句:WDTCTL = WDTPW + WDTHOLD;

    第2句:TA1CTL |= TASSEL_2+TACLR+MC_3+ID_3;

    第3句:TA1CCTL0=CCIE;

    第4句:P1DIR|=BIT0;

    第5句:_EINT();

    第6句:#pragma vector=TIMER1_A0_VECTOR

                __interrupt void ta10_isr(void)

    先给出框图

    随便从百度文库上找了个定时器程序,分析下。

     1 #include <msp430g2553.h>
     2 void main (void)
     3 {
     4     WDTCTL = WDTPW + WDTHOLD;
     5 
     6 
     7     TA1CTL|=TASSEL_2+TACLR+MC_3+ID_3;//采取内部时钟源1.04M,八分频,增减计数模式
     8     TA1CCTL0=CCIE;//启用定时器中断
     9     TA1CCR0=65535;//计数1S
    10     P1DIR|=BIT0;
    11     _EINT();
    12     //LPM4;
    13     while(1);
    14 }
    15 #pragma vector=TIMER1_A0_VECTOR
    16 __interrupt void ta10_isr(void)
    17 {
    18     P1OUT^=BIT0;
    19 }
    View Code

    测试通过,这个程序可以是LED1按2秒的频率闪烁(1秒亮,一秒暗)下面分析下:

    第1句:WDTCTL = WDTPW + WDTHOLD;


    这一句有点不太懂了,明明是定时器,怎么把看门狗定时器给停止了呢?

    第2句:TA1CTL |= TASSEL_2+TACLR+MC_3+ID_3;


     后面的解释:采取内部时钟源1.04M,八分频,增减计数模式。

    先分析程序句,去头文件里找各自的定义:

    1 SFR_16BIT(TA1CTL);                            /* Timer1_A3 Control */
     1 #define MC_0                   (0*0x10u)      /* Timer A mode control: 0 - Stop */
     2 #define MC_1                   (1*0x10u)      /* Timer A mode control: 1 - Up to CCR0 */
     3 #define MC_2                   (2*0x10u)      /* Timer A mode control: 2 - Continous up */
     4 #define MC_3                   (3*0x10u)      /* Timer A mode control: 3 - Up/Down */
     5 #define ID_0                   (0*0x40u)      /* Timer A input divider: 0 - /1 */
     6 #define ID_1                   (1*0x40u)      /* Timer A input divider: 1 - /2 */
     7 #define ID_2                   (2*0x40u)      /* Timer A input divider: 2 - /4 */
     8 #define ID_3                   (3*0x40u)      /* Timer A input divider: 3 - /8 */
     9 #define TASSEL_0               (0*0x100u)     /* Timer A clock source select: 0 - TACLK */
    10 #define TASSEL_1               (1*0x100u)     /* Timer A clock source select: 1 - ACLK  */
    11 #define TASSEL_2               (2*0x100u)     /* Timer A clock source select: 2 - SMCLK */
    12 #define TASSEL_3               (3*0x100u)     /* Timer A clock source select: 3 - INCLK */

    第1句话表示了在特殊功能寄存器里找16个位置给Timer1_A3 Control;后面12句话定义了各个宏,实际上就是用前面的标示符表示后面的数,没别的意思。

    从数据手册上截取:

    数据手册对TACTL的结构有说明:

    后面对各个有详细的说明,这里只说明遇到的:

    (1)TASSELx:   (Timer_A Source select,A计时器的激励源选择)

    TASSEL_0:  00  代表着 TACLK,外部时钟单元

    TASSEL_1:  01  代表着 ACLK ,Auxiliary clock ,辅助时钟单元,可做2、4或者8分频。

    TASSEL_2:  10  代表着 SMCLK,Sub-main clock,子时钟单元,也可做2、4或者8分频。

    TASSEL_3:  11  代表着 INCLK ,外部时钟单元

    (2)IDx: 表示分频的个数

    ID_0 ID_1  ID_2 ID_3 
    1分频,也就是不分 2分频 4分频 8分频

    (3)MCx表示模式

    百度文库找个图:

    嘿嘿,这个图就是整个的定时器结构图和计数模式了,虽然有点复杂,但对于老爷们来说,这点事不算啥。

    (4)TACLR:Timer A clear

     

    第3句:TA1CCTL0=CCIE;


    后面给出的解释是:启用定时器中断。

    从头文件里获取

    SFR_16BIT(TA1CCTL0); 
    #define CCIE                   (0x0010)       /* Capture/compare interrupt enable */

     

    如果TA1CCTL0=CCIE,实际上在置CCIE位为1的同时,把其他位置0,

     

    第4句:P1DIR|=BIT0;


    BIT0在头文件里这么定义的,并不是0的意思:

    1 #define BIT0                   (0x0001)
    2 #define BIT1                   (0x0002)
    3 #define BIT2                   (0x0004)
    4 #define BIT3                   (0x0008)

    所以这句话的意思是把P1.0 的方向设为输出。

     

    第5句:_EINT();


    enable interuption  打开全局中断。

    相反的,_DINT(); disable interruption关闭全局中断。

     

    第6句:#pragma vector=TIMER1_A0_VECTOR

    __interrupt void ta10_isr(void)


    用关键字来__interrupt来定义一个中断函数。注意前面的下划线是两个,一个会出错的。

    用#pragma vector来提供中断函数的入口地址。

  • 相关阅读:
    getpass模块和random模块
    【转】Monkeyrunner测试1——Monkeyrunner的使用
    adb uninstall卸载apk 命令后跟的是包的名称
    【转】Android应用程序的数据存放目录解说
    【转】adb uninstall卸载apk文件说明
    【转】野兽成长史:张颖搭手傅盛在2008
    傅盛
    【转】傅盛:怎样做一个创业公司CEO?
    【转】搜狗测试经理分享
    性能测试积累
  • 原文地址:https://www.cnblogs.com/Iknowyou/p/3464014.html
Copyright © 2020-2023  润新知