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 TA0选用外部时钟信号出现问题



问题详细描述:(1)首先配置P1SEL|=BIT0,即声明P1.0将用作TA0CLK。

(2)我的main函数里面有一个while(1)循环,里面有三个中断、一些LED指示灯(会闪烁)以及LCD显示程序;当正常启动且P1.0不外接信号时,屏幕显示正常LED指示灯正常。

(3)在正常显示情况下,突然在P1.0加上信号,就会发现显示屏没有显示,LED指示灯不再正常变化;

(4)先在P1.0加信号,再启动开发板,会发现程序貌似根本没有进入while函数.

(5)所加信号为1MHZ,峰峰值6V的方波。

是我的P1.0配置不对,还是我的TA0里面配置不对,还是其它什么原因。还有,TI有没有这方面的例程

 

  • (5)所加信号为1MHZ,峰峰值6V的方波。

    这个信号是直接连到IO,峰峰值能否调到3V测试。

    另外能否把详细代码和原理发给大家看看,方便分析。

  • 谢谢。我直接把我的工程作为附件好了,如果有时间的话可以看一下。新手,程序写的比较不规范,欢迎提出问题

    (1)所加信号为1MHZ,峰峰值6V的方波,这个信号是可以的,我有单独测试;

    (2)经过今天的逐步测试,发现问题存在于TA0定时器没有按照预定设计关掉,导致相应的标志位HighFrequenceWaitFlag没有清零,于是主函数就停留在while(HighFrequenceWaitFlag)这里了;

    (3)仔细分析了几遍,还是无法发现为什么定时器没有按照预定关掉,现在把原理和代码贴出来。

    (4)原理,做高频信号测量。ACLK=32768HZ,MCLK=SMCLK=4MHZ

            首先利用TA2产生一个1S闸门,闸门关闭的时候OneSecondFlag置位。

            TA0的时钟为TA0CLK(即待测信号),10分频,增计数模式,TA0CCR0=100;在闸门期间,TA0第一次中断的时候,打开TA2标准计数。闸门关闭后,TA0在紧接着的一次中断中关闭自己。并将HighFrequenceWaitFlag清零。

    实际发现,好像TA0没有按照计划在应有的时刻关掉。

    主要程序部分如下:

    void TAInit1() //高频预测量定时器设置
    {
    /*TA2设定1S间隔*/
    TA2CTL|=MC_0; //关闭定时器
    TA2CTL|=TACLR; //计数器TA2清零
    TA2CCR0=32767; //比较模式对比数值
    TA2CCTL0|=CCIE; //CCRO比较中断使能
    TA2CTL|=TASSEL_1+ID_0;//选择ACLK时钟32.768KHZ,初级1分频,关闭TA2IFG中断
    TA2EX0=TAIDEX_0;//二级1分频

    /*TA0设定待测信号计数*/
    TA0CTL|=MC_0; //关闭定时器
    TA0CTL|=TACLR; //计数器TA0清零
    TA0CCR0=1000; //比较模式对比数值
    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=TIMER2_A0_VECTOR //CCR0中断标志
    __interrupt void TA2Interrupt0()
    {
    OneSecondFlag=1; //1S标志位置位
    TA2CTL=MC_0; //关闭定时器2
    /*测试用*/
    P1OUT^=BIT2;
    if(HInputOverflowTime==0)//溢出次数为0,表示实际信号为低频
    {
    TA0CTL|=MC_0; //TA0直接关闭
    TA0CTL&=~TAIE;
    IsHighFrequenceFlag=0;//判断为低频
    HighFrequenceWaitFlag=0;//高频测量等待结束
    /*测试用*/
    P1OUT^=BIT3;
    }
    }

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

    //好像就是这段始终进不去
    else //表示1S的大闸门已经关闭
    {
    TA0CTL|=MC_0; //关闭待测信号计数
    TA0CTL&=~TAIE;
    HInputOverflowTime++;
    TA1CTL&=~TAIE;
    TA1CTL|=MC_0; //关闭标准信号计数
    HReferenceNum=TA1R;//暂时记录标准信号计数终值
    HighFrequenceWaitFlag=0;//高频测量等待结束
    }
    }

    /*TA1IFG中断服务函数*/
    #pragma vector=TIMER1_A1_VECTOR
    __interrupt void TA1Interrupt1()
    {
    switch(__even_in_range(TA0IV,14))
    {
    case 14:HROverflowTime++;break;
    default:break;
    }
    }

    /*高频测量主函数*/
    void HFMeasure()
    {
    OneSecondFlag=0; //定时1S标志
    TA2CTL|=MC_1;//定时器2增模式
    TA0CTL|=MC_1;//定时器0增模式

    while(HighFrequenceWaitFlag);//高频测量等待

    HInputNum=100*HInputOverflowTime;
    DelayMs(10);
    HReferenceNum+=HROverflowTime*65537;
    DelayMs(15);
    }


    LAB3.zip