This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F5529的定时器中断无法进入

Other Parts Discussed in Thread: MSP430F5529

我采用CCR1.CCR2.CCR0产生了pwm波 ,但是 这样的话 定时器中断函数无法进入    。

单独采用CCR0,不使用CCR1,CCR2,定时器可以进入中断函数。

想请问是哪个地方配置错误了呢?。

代码如下:

#include "io430.h"


/*定时器输出单元举例:
ACLK时钟频率为LFXT1=32768Hz,利用Timer_A输出周期为512/32768
=15.625ms,占空比分别为75%和25%的PWM波
*/
int flag=0;
int i=0;
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;


//Initialize
P4DIR |= BIT7; //将4.7设为输出 led
P4OUT^= BIT7;
P1DIR |= BIT0;
P1OUT |= BIT0;
P1SEL |= BIT2; //从P1.2输出
P1DIR |= BIT2;
P1SEL |= BIT3; //从P1.3输出
P1DIR |= BIT3;

TA0CTL=TASSEL_1+TACLR;
TA0CCTL0 = CCIE;
TA0CCR0=512-1;//PWM周期
TA0CCTL1=OUTMOD_7;
TA0CCR1=384;//384/512=0.75
TA0CCTL2=OUTMOD_7;
TA0CCR2=128;//占空比128/512=0.25

TA0CTL|=MC_1;//增计数模式
__enable_interrupt();//打开总中断
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts


}

#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A0(void)
{   i=i+1;
   if(i==100)
   {i=0;
   P4OUT ^= BIT7;
   }


}

  • 试一下下面的两路PWM输出

    void main(void)
    {
             WDTCTL = WDTPW + WDTHOLD;        //关看门狗
              TA0CTL=TASSEL0+TACLR+MC0;           //ACLK为时钟源,清TAR,增计数模式
              TA0CCR0=512-1;                                //设定PWM周期
              TA0CCTL1=OUTMOD_7;                       
              TA0CCR1=384;                                   //CCR1的PWM占空比设定
              TA0CCTL2=OUTMOD_7;                     
              TA0CCR2=8;                                   //CCR2的PWM占空比设定
              P1DIR|=0X0c;                                   //P1.2、P1.3输出,对应TA1,TA2
              P1SEL|=0X0c;                                  //TA1,TA2输出功能
              while(1);
    }

  • 两路输出可以的 我之前也可以的 ,就是在此基础上加中断函数没法进入


    然后我想问一下 MSP430F5529 launchpad 的时钟TACLK,ACLK,SMCLK,INCLK 默认都是多大频率的
    现在配定时器中断的频率有点晕
  • 用之前您给另一个问题的回答在写中断函数加了一堆东西就可以了 这是什么原因呢?

    #include "io430.h"
    int p=0;

    int main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    P4DIR |= BIT7; // P1.0 output
    P4OUT= BIT7;

    P1SEL |= BIT2; //从P1.2输出
    P1DIR |= BIT2;
    P1SEL |= BIT3; //从P1.3输出
    P1DIR |= BIT3;

    TA0CCTL0 = CCIE; // CCR0 interrupt enabled
    TA0CCR0 = 1000-1;
    TA0CTL = TASSEL_1 + MC_1; // ACLK, upmode
    TA0CCTL1=OUTMOD_7;
    TA0CCR1=500;//384/512=0.75
    TA0CCTL2=OUTMOD_7;
    TA0CCR2=250;//占空比128/512=0.25
    //delay_ms(1000);
    P4OUT^= BIT7;
    __bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
    }

    // Timer A0 interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer_A (void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A (void)
    #else
    #error Compiler not supported!
    #endif
    {
    P4OUT ^= BIT7; // Toggle P1.0

    }
  • 上电后如果没配置过时钟系统,默认MCLK\SMCLK使用dco,是1MHz左右,aclk使用xt1,32.768kHz
  • 单个定时器打开的话,ccr1,ccr2的pwm和定时器A的中断函数都能进入
    两个定时器同时打开的话,定时器中断函数无法进入? 要如何配置呢?

    下面是我的代码:



    #include <msp430.h>
    #include <nixietube.h>
    #include <pwm.h>
    /*定时器输出单元举例:
    ACLK时钟频率为LFXT1=32768Hz,利用Timer_A输出周期为512/32768
    =15.625ms,占空比分别为75%和25%的PWM波

    ACLK时钟频率为LFXT1=32768Hz,利用Timer_A输出周期为1000/32768
    =30.518ms,占空比分别为50%和25%的PWM波

    */

    int ticktack=2000;
    int flag2=1;//计算数码管是否计时好 flag2=1否,flag1=0是

    int j=0;
    int i=0 ;
    int p=0;
    int flag1=0;
    #define max_angle 60


    int main(void)
    {

    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    P4DIR |= BIT7; // P1.0 output
    P4DIR |= BIT3;
    P4OUT |= BIT7;
    P4OUT |= BIT3;
    P1DIR |= BIT0;
    P1OUT |= BIT0;

    NixieTube_init();




    P1SEL |= BIT2; //从P1.2输出
    P1DIR |= BIT2;
    P1SEL |= BIT3; //从P1.3输出
    P1DIR |= BIT3;

    //delay_ms();

    //TA0
    TA0CCTL0 = CCIE; // CCR0 interrupt enabled
    TA0CCR0 = 328-1;
    TA0CTL = TASSEL_1 + MC_1; // ACLK, upmode
    TA0CCTL1=OUTMOD_7;
    TA0CCR1=100;
    TA0CCTL2=OUTMOD_7;
    TA0CCR2=16;
    __enable_interrupt(); //开启总中断 //使能全局中断

    TB0CCTL0 = CCIE;
    TB0CCR0 = 328-1;
    TB0CTL = TASSEL_1 + MC_1; // ACLK, upmode

    __enable_interrupt(); //开启总中断 //使能全局中断

    while(1)
    { if(flag2) {NumDisplay(ticktack);}
    else if(!flag2) {NumDisplay1(ticktack);}




    }




    }





    /// Timer A0 interrupt service routine
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer_A(void)

    { if(flag2)

    {if(ticktack)
    {ticktack--;}
    else if(!ticktack)
    {flag2=0;}
    }

    else if(!flag2)
    {ticktack=6666;}


    }