MSP430定时器 TIMER0_A1_VECTOR

来源:互联网 发布:tensorflow windows版 编辑:程序博客网 时间:2024/05/20 00:12

msp430g2553有两个定时器,一个是Timer0,一个是Timer1。TIMER0_A1_VECTOR ,TIMER0_A0_VECTOR    是Timer0的中断向量,

在430中,CCR0中断与CCR1,CCR2,溢出中断没有在一个中断向量表中,两个是分开的。CCR0中断具有最高优先级,而其余三个在一个中断向量表中。Timer1也相同,所以就有4个中断向量。


MSP430中,不同的型号拥有不同的硬件配置,因此中断源也有所差别,TIMER1_A0_VECTOR表示定时器1 A0的中断源,1代表硬件上的定时器,有定时器0 定时器1等;A0代表定时器n内的A0寄存器,通常会有A0 A1等,他们都计数源都来自同一个定时器,但对计数源的数据可以进行不同的处理,从而产生不同的中断。

http://elitezhe.diandian.com/m430-ta-vector/

在M430G2553头文件中有如下定义

#define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0)A CC1, TA0 */
#define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */
.
.
#define TIMER1_A1_VECTOR (12 * 2u) /* 0xFFF8 Timer1_A CC1-4, TA1 */
#define TIMER1_A0_VECTOR (13 * 2u) /* 0xFFFA Timer1_A CC0 */
 
 

可见,每个TimerA模块有两个中断向量

http://blog.lehu.shu.edu.cn/879836630/A450185.html

/*TIMER0_A0_VECTOR是计时器0CCR0的中断寄存器,TIMER0_A1_VECTOR是计时器0CCR1-CCR4TA的寄存器*/

/*同理定时器TA1也是分为两个TIMER1_A0_VECTORTIMER1_A1_VECTOR*/

#pragma vector=TIMER0_A1_VECTOR

__interrupt void TimerA(void)

{

   switch(__even_in_range(TA0IV,14))

   /* 这句话的意思是:只有在TA0IV的值是在0--14内的偶数时才会执行switch函数内的语句

            其作用是提高switch语句的效率*/

   {

      case 2:P1OUT=BIT1;break//TACCR1 CCIFG置位,表明计数值和设定的13107相等了,也就是说计了0.4S

      case 4:P1OUT=BIT2;break//TACCR2 CCIFG置位,表明计了0.8S

      case 6:P1OUT=BIT3;break//TACCR3 CCIFG置位,表明计了1.2S

      case 8:P1OUT=BIT4;break//TACCR4 CCIFG置位,表明计了1.6S

      case 14:P1OUT=BIT5;break;   //TAIFG置位,表明计了2S

      default:break;

   }

  

}


MSP430F5529共有两类共4个定时器,分别是Timer_A定时器3个和Timer_B定时器1个,按照每个寄存器配备的捕获/比较器的个数分别命名为Timer0_A(内有5个捕获比较器)、Timer1_A3个)、Timer2_A3个)、Timer0_B7个)。

                        这一章,我们讲定时器Timer0_A.A类的都一样)

注意:下面所提到的所有寄存器,在TA后面插入012就分别表示Timer0_ATimer1_ATimer2_A(我这里省略了数字)


http://blog.sina.com.cn/s/blog_6cd2030b01017x71.html

定时器Timer_A

   1MSP430g2553具有两个16位的定时器:Timer0_A   Timer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以产生定时中断,也可以产生PWM


http://wenku.baidu.com/link?url=SlZcpjkvyoopvl-N8GwqcVsz039iKhk0yqkEBNPMv0ch_PtBkiTUl9tXJ8jTBFHXY5n-soEXUGrYctYNSixAadGm7DQ2rJXftq3roJcbPRW


m​s​p​4​3​0​ ​T​I​M​E​R​实​验​报​告


http://wenku.baidu.com/link?url=u1hFOAHosUwk4LvR4M5tno77kb3aM8a_AKZ7bTKBGTkjizUPbcHjc7Ol-OQnoYtB99o1j-1Jha01z0g8U35lBKk8tgsszoVHb1_8pGOERf7



http://bbs.eeworld.com.cn/thread-339382-1-1.html

首先找选择合适的PWM输出引脚,比如第1路PWM想用TA0控制,第2路PWM用TA1控制

查器件手册(是针对具体型号的,不是UserGuide哦):

TA0支持的引脚有P1.1、P1.2、P1.5、P1.6、P2.6(P2.6一般不用,因为要接晶振哦)
TA1支持的引脚有P2.0 --> P2.5。
选择方便的,假设我选择了P1.6(TA0.1)和P2.2(TA1.1),且第1路由ACLK驱动输出4KHz方波,第2路也有ACLK驱动但是输出2KHz占空比25%的方波。

  1. P1DIR |= BIT6;// 选择P1.6的第二功能,即TA0.1
    P1SEL |= BIT6;
    CCR0 = 7;// PWM 周期  = ACLK@32768/4KHz-1 = 8.192-1 = 7
    CCTL1 = OUTMOD_6;// CCR1 reset/set
    CCR1 = 3;// CCR1 PWM 占空比50% = 
  2. 8.192*50% - 1 = 3
TACTL = TASSEL_1 + MC_1;// ACLK, up mode
复制代码

  1. P2DIR |= BIT2;// 选择P2.2的第二功能,即TA1.1
    P2SEL |= BIT2;
    TA1CCR0 = 15;// PWM 周期= ACLK@32768/2KHz-1 = 16-1 = 15
    TA1CCTL1 = OUTMOD_6;// CCR1 reset/set
    TA1CCR1 = 3;// CCR1 PWM 
  2. 占空比25% = 16*25% - 1 = 3
TA1CTL = TASSEL_1 + MC_1;// ACLK, up mode
复制代码

不复杂吧
ACLK最多支持32768Hz的PWM,如果要更高频率,需要换时钟源为SMCLK,即代码改为:
  1. TACTL = TASSEL_2 + MC_1;// SMCLK, up mode
复制代码
当然时钟源换了,控制频率的CCR0和CCR1的值要重新计算。
友情提示:如要进入LPM3,则PWM的时钟只能为ACLK,因为在LPM3下DCO(一般作为SMCLK的源)会关闭。


0 0
原创粉丝点击