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定时器A0采用外部时钟信号出现问题



如题,TA0采用的是外部信号P1.0 TA0CLK,增计数模式,TA0CCR0=10000,中断服务函数中满足一定条件时会关掉TA0。

但是发现,实际中满足该条件时,(确认服务程序确实进入了该条件),TA0却没有关掉。或者说TA0一直就没有关掉过。

想问一下TI,可能的原因有哪些,还是有什么是我没有考虑到的。谢谢!!

  •  你好,建议从TA模块单独调试开始~

    方便给出TA部分的代码么~

  • 单独测试TA,发现可以正常关闭。

    问题可能在于红色标记部分,按理来说,一次大循环中,该部分只用执行一次(即LED5只闪烁一次),相应的定时器就会关掉。但实际发现,这个部分会连续执行好几次。

    附完整的工程,如果有时间有兴趣的您可以看一下。(高频测量)

    void TAInit1() //高频预测量定时器设置
    {
    /*TB0设定1S间隔*/
    TB0CTL|=MC_0; //关闭定时器
    TB0CTL|=TBCLR; //计数器TA2清零
    TB0CCR0=32767; //比较模式对比数值
    TB0CCTL0|=CCIE; //CCRO比较中断使能
    TB0CTL|=TBSSEL_1+ID_0;//选择ACLK时钟32.768KHZ,初级1分频,关闭TA2IFG中断
    TB0EX0=TBIDEX_0;//二级1分频

    /*TA0设定待测信号计数*/
    TA0CTL|=MC_0; //关闭定时器
    TA0CTL|=TACLR; //计数器TA0清零
    TA0CCR0=100; //比较模式对比数值
    TA0CCTL0|=CCIE; //CCRO比较中断使能
    TA0CTL|=TASSEL_0+ID_1;//选择TA0CLK,即待测信号,初级2分频,关闭TA0IFG中断
    TA0EX0=TAIDEX_4;//二级5分频,总共为10分频

    /*TA1标准信号计数*/
    TA1CTL|=MC_0; //关闭定时器
    TA1CTL|=TACLR; //计数器TA1清零
    TA1CTL|=TASSEL_2+ID_0+TAIE;//选择SMCLK4MHZ,初级1分频,开启TA1IFG中断
    TA1EX0=TAIDEX_0;//二级1分频

    }

    /*TA2-CCR0中断服务函数*/
    #pragma vector=TIMER0_B0_VECTOR //CCR0中断标志
    __interrupt void TA2Interrupt0()
    {
    OneSecondFlag=1; //1S标志位置位
    TB0CTL=MC_0; //关闭定时器2
    TB0CCTL0&=~CCIFG;
    /*测试用*/
    P1OUT^=BIT2;
    if(HInputOverflowTime==0)//溢出次数为0,表示实际信号为低频
    {
    TA0CTL|=MC_0; //TA0直接关闭
    TA0CCTL0=0;
    IsHighFrequenceFlag=0;//判断为低频
    HighFrequenceWaitFlag=0;//高频测量等待结束
    /*测试用*/
    //P1OUT^=BIT3;
    }
    }

    /*TA0-CCR0中断服务函数*/
    #pragma vector=TIMER0_A0_VECTOR //CCR0中断标志
    __interrupt void TA0Interrupt0()
    {
    //__enable_interrupt();
    if(OneSecondFlag==0) //表示还在1S的大闸门内
    {
    if(HInputWorkFlag==0) //待测信号第一个闸门沿到来
    {
    TA0CCR0=10000; //比较模式对比数值
    TA1CTL|=MC_2; //标准信号开始同时进入连续技计数模式
    HInputWorkFlag=1; //进入闸门内
    P1OUT^=BIT3;
    }
    else //处于待测信号闸门内
    {
    HInputOverflowTime++;

    /*测试用*/
    P1OUT^=BIT4;
    }
    }
    if(OneSecondFlag==1) //表示1S的大闸门已经关闭
    {
    TA0CTL|=MC_0+TACLR; //关闭待测信号计数
    HInputOverflowTime++;
    TA1CTL&=~TAIE;
    TA0CTL&=~TAIE;
    TA1CTL|=MC_0+TACLR; //关闭标准信号计数
    HReferenceNum=TA1R;//暂时记录标准信号计数终值
    HighFrequenceWaitFlag=0;//高频测量等待结束

    /*测试用*/
    P1OUT^=BIT5;


    TA0CCTL0&=~CCIFG;
    TA1CCTL0&=~CCIFG;
    }
    }

    LAB3.zip