想用timerA_0的比较模式实现pwm,从而实现单周期的短脉冲。首先设定MCLK与SMCLK时钟均为DCO频率25MHz。其次,利用TA0CCR0=25000,TA0CCR1=24999,以及TA0CCTL1 = OUTMOD_3实现set/reset输出。于此同时,程序让LED灯闪烁。另外设置了TAIE中断使能,测试起见,中断处理函数没写内容,但程序跑了结果LED灯并没有闪烁,而且调试发现程序在中断处理函数中死循环,请问是何原因,多谢!!!
#include <msp430.h> /** * blink.c */ void main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer P1SEL |= BIT2; P1DIR |= BIT2; // P1.2 -> TA0.1 P1DIR |= BIT0; // P1.0 as output (LED) setupDCO(); P1OUT = 0x0000; // set timer A TA0CCTL1 = OUTMOD_3; // CCR1 set/reset TA0CCR1 = 24999; TA0CCR0 = 25000; TA0CTL = TAIE | TASSEL_2 | MC_2 | TACLR; // SMCLK, continue mode, clear TAR __delay_cycles(100); __enable_interrupt(); _BIS_SR(GIE); // Enter LPM0 w/ interrupt while(1) { P1OUT = 0x0001; __delay_cycles(2500000); P1OUT = 0x0000; __delay_cycles(12500000); //TA0CTL = TAIE | TASSEL_2 | MC_2 | TACLR; } } // Timer A0 interrupt service routine #pragma vector=TIMER0_A0_VECTOR __interrupt void TIMER0_A0_ISR(void) { } void SetVCoreUp (unsigned int level) { // Open PMM registers for write access PMMCTL0_H = 0xA5; // Set SVS/SVM high side new level SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; // Set SVM low side to new level SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level; // Wait till SVM is settled while ((PMMIFG & SVSMLDLYIFG) == 0); // Clear already set flags PMMIFG &= ~(SVMLVLRIFG + SVMLIFG); // Set VCore to new level PMMCTL0_L = PMMCOREV0 * level; // Wait till new level reached if ((PMMIFG & SVMLIFG)) while ((PMMIFG & SVMLVLRIFG) == 0); // Set SVS/SVM low side to new level SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Lock PMM registers for write access PMMCTL0_H = 0x00; } void setupDCO(void) { /* Power settings */ SetVCoreUp(1u); SetVCoreUp(2u); SetVCoreUp(3u); UCSCTL3 = SELREF__REFOCLK; // select REFO as FLL source UCSCTL6 = XT1OFF | XT2OFF; // turn off XT1 and XT2 /* Initialize DCO to 25.00MHz */ __bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL0 = 0x0000u; // Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_6; // Set RSELx for DCO = 50 MHz UCSCTL2 = 762u; // Set DCO Multiplier for 25MHz // (N + 1) * FLLRef = Fdco // (762 + 1) * 32768 = 25.00MHz UCSCTL4 = SELA__REFOCLK | SELS__DCOCLK | SELM__DCOCLK; __bic_SR_register(SCG0); // Enable the FLL control loop // Worst-case settling time for the DCO when the DCO range bits have been // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx // UG for optimization. // 32*32*25MHz/32768Hz = 781250 = MCLK cycles for DCO to settle __delay_cycles(781250u); /* Loop until XT1,XT2 & DCO fault flag is cleared */ do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags } while (SFRIFG1&OFIFG); // Test oscillator fault flag }