3.应用
(1)定时器中断
步骤:1:设置TIMER_A 控制寄存器
2: 开中断
3: 中断函数
分解: TACTL = TASSEL_2 + MC_2 + TAIE;
MCLK系统时钟 连续计数模式 允许溢出中断
由于我没接外部晶振,由于震荡器失效时,DCO震荡器会被自动选为MCLK时钟源。MSCLK=SMCLK=DCOCLK
注意点:
MSP430G2452 定时器有TA0 TA1
Timer0_A3 TACCR0 CCIFG(4) maskable 0FFF2h 25
Timer0_A3 TACCR2 TACCR1 CCIFG. TAIFG(2) (4) maskable 0FFF0h 24
TAIFG为定时器溢出中断,可以看出一个有定时器溢出中断,另外一个没有,到底是哪个呢,看头文件!
#define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0_A CC1, TA */
#define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */
可以看出是TIMER0_A1_VECTOR。
在例程中,我试过用TIMER0_A0_VECTOR,果然无法进入定时器溢出中断,因为TIMER0_A0不存在定时器溢出中断。
- (1)/***********************************************
**** LAUNCH PAD 学习之定时器中断 *** **** MCU: MSP430 *** **** 作者: 常见泽 *** **** 内部DCO *** **** *** **** 2012.05.28.21:16 *** **** 实验现象:LED灯闪烁 周期约为12Ms *** ***********************************************/
#include <msp430g2452.h>
void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= 0x01; // P1.0 output TACTL = TASSEL_2 + MC_2 + TAIE; // MCLK, contmode, 中断允许 _EINT(); //开中断 while(1); }
// Timer_A3 Interrupt Vector (TAIV) handler #pragma vector = TIMER0_A1_VECTOR __interrupt void Timer_A(void) { switch( TAIV ) { case 10:
P1OUT ^= 0x01; // 异或取反 break; } }
复制代码
|