使用捕获功能对频率信号进行测量,捕获到第一个上升沿时对TBCCR1寄存器值进行读取,赋值给SMCLK_Count_Num_start变量,设置当TBR寄存器在连续模式下连续溢出11次时停止捕获,将此时TBCCR1寄存器的值赋予SMCLK_Count_Num_stop变量,按如下公式进行计算:
SMCLK_Count_Num = 65535*overflow_Num + SMCLK_Count_Num_stop - SMCLK_Count_Num_start
Frequency = ((CaptureNum-1)*SMCLK_Frequency)/SMCLK_Count_Num
在调试过程中,出现现象为待测频率高于80kHz时 TIMERB1中断case14无法进入,溢出次数变量无法更新,导致程序卡死
请各位帮忙分析解答问题所在。
主程序如下:
#include <msp430fg439.h>
#include "main.h"
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
SetupClock();
Capture_Pos();
__enable_interrupt();//中断使能
while(1)
{
if (cap_finish_flag ==1)
{
cap_finish_flag = 0;
SMCLK_Count_Num = 65535*overflow_Num + SMCLK_Count_Num_stop - SMCLK_Count_Num_start;
Frequency = ((CaptureNum-1)*SMCLK_Frequency)/SMCLK_Count_Num;
CaptureNum = 0;
overflow_Num = 0;
TB0CTL |= MC_2;
TBCTL |= TBCLR + TBIE;
TBCCTL1 |= CCIE;
}
}
}
void SetupClock()
{
uint16_t tmpv;
FLL_CTL1 &= ~XT2OFF; //开启外部振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失效标志
for (tmpv = 0xff; tmpv > 0; tmpv--);
}
while((IFG1 & OFIFG)!=0); //*等待外部晶振就绪
IFG1 &= ~OFIFG;
FLL_CTL1 |= SELM_XT2+SELS; //选择MCLK,选择SMCLK //+DIVM_1
}
void Capture_Pos()//TIMER_B 捕获/比较寄存器 0
{
P2SEL |= BIT2; //TIMER B1通道
P2DIR &= ~BIT2;
//SMCLK做时钟源,16位计数器,不分频,连续计数模式,开中断
TB0CTL |= TBSSEL_2 + CNTL_0 + ID_0 + MC_2 + TBCLR + TBIE;
TBCCTL1 = CM_1+ CCIS_1 + SCS + CAP + CCIE;//上升沿触发,同步捕获,使能中断CCI1B
}
#pragma vector = TIMERB1_VECTOR
__interrupt void Timer_B1 (void)
{
switch(TBIV)
{
case 2:
TBCCTL1 &= ~COV ;
CaptureNum++;
if(CaptureNum== 1)
{
SMCLK_Count_Num_start = TBCCR1;
overflow_Num = 0;
}
if(overflow_Num== 11)
{
SMCLK_Count_Num_stop = TBCCR1;
cap_finish_flag = 1;
TB0CTL |= MC_0;
TBCTL &= ~TBIE;
TBCCTL1 &=~CCIE;
}
break;
case 4:
break;
case 14:
overflow_Num ++ ;
break;
default:
break;
}
}