msp430精確測低頻
// Date: 2009.8.16
// Author: xurafreedom
// Email: freedomxura@gmail.com / mxh20999@163.com
// Blog: http://xurafreedom.cublog.cn
// 基本原理:1s定時(shí),在此時(shí)間內(nèi)計(jì)數(shù)捕獲到的信號(hào)上升沿個(gè)數(shù),考慮到msp430的中斷優(yōu)先級(jí)// 已經(jīng)固定,所以用高優(yōu)先級(jí)的Timer_B產(chǎn)生50ms定時(shí),低優(yōu)先級(jí)的Timer_A捕獲信號(hào)的上升沿
//******************************************************************************
#include
void InitSys();
unsigned int upflag = 0;
unsigned int f_50ms = 0;
/*******************************************
主函數(shù)
********************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
InitSys(); // MCLK , SMCLK----8M
//---------------------------------------------------------------------
//Timer_B的設(shè)置,用于產(chǎn)生定時(shí)中斷,中斷時(shí)間為50000us
P1DIR |= BIT3; // Set P1.3 to output direction
TBCCTL0 = CCIE; // TBCCR0 interrupt enabled
TBCCR0 = 50000;
TBCTL = TBSSEL_2 + ID_3 + MC_1; // SMCLK,1M, upmode
//---------------------------------------------------------------------
//Timer_A的設(shè)置,用于捕獲外部信號(hào)的邊沿觸發(fā),可以設(shè)置為上升沿觸發(fā),或者下降沿觸發(fā)
P1DIR&=~BIT2;
P1SEL = BIT2; //==設(shè)置P1.2端口為功能模塊使用,即:做捕獲源==
TACTL = TASSEL_2+TACLR+TAIE+MC1;//==定時(shí)器A時(shí)鐘信號(hào)選擇ACLK,
CCTL1 = CM_1+SCS+CAP+CCIE; //==輸入上升沿捕獲,CCI0A為捕獲信號(hào)源==
_EINT();
while(1);
}
/*******************************************
函數(shù)名稱:InitSys
功 能:初始化時(shí)鐘函數(shù)
參 數(shù):無
返回值 :無
********************************************/
void InitSys()
{
unsigned int i;
BCSCTL1&=~XT2OFF; //==打開XT2振蕩器==
do
{
IFG1 &= ~OFIFG; //==清除振蕩器失效標(biāo)志==
for (i = 0xFF; i > 0; i--); //==延時(shí),等待XT2起振==
}
while ((IFG1 & OFIFG) != 0); //==判斷XT2是否起振==
BCSCTL2 =SELM_2+SELS; //==選擇MCLK、SMCLK為XT2,8M==
}
/*******************************************
函數(shù)名稱:Timer_B
功 能:定時(shí)器B中斷服務(wù)子函數(shù),產(chǎn)生50ms定時(shí)
參 數(shù):無
返回值 :無
********************************************/
// Timer B0 interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
P1OUT ^= BIT3; // 定時(shí)50ms
f_50ms = upflag;
upflag = 0;
}
/*******************************************
函數(shù)名稱:Timer_A
功 能:捕獲待測信號(hào)上升沿
參 數(shù):無
返回值 :無
********************************************/
#pragma vector=TIMERA1_VECTOR //==定時(shí)器A中斷處理==
__interrupt void Timer_A(void)
{
switch(TAIV) //向量查詢
{ case 2: //捕獲中斷
if(CCTL1&CM0) //捕獲到上升沿
upflag++;
break;
default:
break;
}
}
評(píng)論