[资料分享] MSP430G2553 定时器中断实例

fish001   2017-9-15 22:39 楼主
#include "MSP430G2553.h" void led_init(); void timer0_init(); void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; //--配置时钟----- BCSCTL1=CALBC1_1MHZ; DCOCTL=CALDCO_1MHZ; //--LED初始化---- led_init(); //--定时器0初始化---- timer0_init(); //---开中断------ _EINT(); //开中断 LPM3; } /* * 定时器0中断函数 */ #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer0_A0(void) //TACCR0中断 { P1OUT^=(1<<6); //LED反转 } #pragma vector=TIMER0_A1_VECTOR __interrupt void Timer0_A1(void) //TACCR1中断,TACCR2中断和TA0溢出中断共用一个中断向量 { switch(TAIV) { case 2: //TACCR1中断 P1OUT^=(1<<6); //LED反转 break; case 4: //TACCR2中断 P1OUT^=(1<<6); //LED反转 break; case 10: //TAIFG 溢出中断 P1OUT^=(1<<6); //LED反转 break; default: break; } } // LED 初始化 void led_init() { P1DIR|=(1<<6); } // 定时器初始化 void timer0_init() { /* *设置TIMER_A的时钟 *TASSEL_0: TACLK,使用外部引脚信号作为输入 *TASSEL_1: ACLK,辅助时钟 *TASSEL_2: SMCLK,子系统主时钟 *TASSEL_3: INCLK,外部输入时钟 */ TACTL |= TASSEL_1; /* *时钟源分频 *ID_0: 不分频 *ID_1: 2分频 *ID_2: 4分频 *ID_3: 8分频 */ TACTL |= ID_0; /* *模式选择 *MC_0: 停止模式,用于定时器暂停 *MC_1: 增计数模式,计数器计数到CCR0,再清零计数器 *MC_2: 连续计数模式,计数器增计数到0XFFFF(65535),再清零计数器 *MC_3: 增减计数模式,增计数到CCR0,再减计数到0 */ TACTL |= MC_1; //增计数模式 //----计数器清零----- TACTL |= TACLR; //----设置TACCRx的值----- //TACCR0=32768-1; //时钟是32.768K,那么值设为32678-1 TACCR0=30000; TACCR1=10000; //TACCR1和TACCR2要小于TACCR0,否则不会产生中断 TACCR2=20000; //----中断允许---- TACCTL0 |= CCIE; //TACCR0中断 TACCTL1 |= CCIE; //TACCR1中断 TACCTL2 |= CCIE; //TACCR2中断 TACTL |= TAIE; //TA0溢出中断 } 注意事项   需要注意的是在增计数模式时CCR1和CCR2的值应该小于CCR0,否则CCR1和CCR2不会产生中断。 并且每次CCR1和CCR2中断后要把它们重新赋值这样才能保证CCR1和CCR2的中断间隔时间不变。   类似语句如下:   CCR1 += 100;   if ( CCR1 >= 32768 )     CCR1 -= 32768; 本帖最后由 fish001 于 2017-9-15 22:42 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复