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是计时器0的CCR0的中断寄存器,TIMER0_A1_VECTOR是计时器0的CCR1-CCR4、TA的寄存器*/
/*同理定时器TA1也是分为两个TIMER1_A0_VECTOR和TIMER1_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_A(3个)、Timer2_A(3个)、Timer0_B(7个)。
这一章,我们讲定时器Timer0_A.(A类的都一样)
注意:下面所提到的所有寄存器,在TA后面插入0或1或2就分别表示Timer0_A、Timer1_A、Timer2_A(我这里省略了数字)
http://blog.sina.com.cn/s/blog_6cd2030b01017x71.html
定时器Timer_A
1,MSP430g2553具有两个16位的定时器:Timer0_A Timer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以产生定时中断,也可以产生PWM。
http://wenku.baidu.com/link?url=SlZcpjkvyoopvl-N8GwqcVsz039iKhk0yqkEBNPMv0ch_PtBkiTUl9tXJ8jTBFHXY5n-soEXUGrYctYNSixAadGm7DQ2rJXftq3roJcbPRW
msp430 TIMER实验报告
http://wenku.baidu.com/link?url=u1hFOAHosUwk4LvR4M5tno77kb3aM8a_AKZ7bTKBGTkjizUPbcHjc7Ol-OQnoYtB99o1j-1Jha01z0g8U35lBKk8tgsszoVHb1_8pGOERf7
https://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%的方波。
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% =
8.192*50% - 1 = 3
TACTL = TASSEL_1 + MC_1; // ACLK, up mode
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
占空比25% = 16*25% - 1 = 3
TA1CTL = TASSEL_1 + MC_1; // ACLK, up mode
不复杂吧
ACLK最多支持32768Hz的PWM,如果要更高频率,需要换时钟源为SMCLK,即代码改为:
TACTL = TASSEL_2 + MC_1; // SMCLK, up mode
当然时钟源换了,控制频率的CCR0和CCR1的值要重新计算。
友情提示:如要进入LPM3,则PWM的时钟只能为ACLK,因为在LPM3下DCO(一般作为SMCLK的源)会关闭。
上一篇:TI - MCU - MSP430使用指南13 -> Timer定时器模块
下一篇:MSP430F5529--------test1
推荐阅读最新更新时间:2024-11-13 13:58