微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > msp430精确测低频

msp430精确测低频

时间:11-11 来源:互联网 点击:
//******************************************************************************
// Date: 2009.8.16
// Author: xurafreedom
// Email: freedomxura@gmail.com / mxh20999@163.com
// Blog: http://xurafreedom.cublog.cn
// 基本原理:1s定时,在此时间内计数捕获到的信号上升沿个数,考虑到msp430的中断优先级// 已经固定,所以用高优先级的Timer_B产生50ms定时,低优先级的Timer_A捕获信号的上升沿
//******************************************************************************
#include
void InitSys();
unsigned int upflag = 0;
unsigned int f_50ms = 0;
/*******************************************
主函数
********************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
InitSys(); // MCLK , SMCLK----8M

//---------------------------------------------------------------------
//Timer_B的设置,用于产生定时中断,中断时间为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的设置,用于捕获外部信号的边沿触发,可以设置为上升沿触发,或者下降沿触发
P1DIR&=~BIT2;
P1SEL = BIT2; //==设置P1.2端口为功能模块使用,即:做捕获源==
TACTL = TASSEL_2+TACLR+TAIE+MC1;//==定时器A时钟信号选择ACLK,
CCTL1 = CM_1+SCS+CAP+CCIE; //==输入上升沿捕获,CCI0A为捕获信号源==
_EINT();
while(1);
}
/*******************************************
函数名称:InitSys
功 能:初始化时钟函数
参 数:无
返回值 :无
********************************************/
void InitSys()
{
unsigned int i;
BCSCTL1&=~XT2OFF; //==打开XT2振荡器==
do
{
IFG1 &= ~OFIFG; //==清除振荡器失效标志==
for (i = 0xFF; i > 0; i--); //==延时,等待XT2起振==
}
while ((IFG1 & OFIFG) != 0); //==判断XT2是否起振==
BCSCTL2 =SELM_2+SELS; //==选择MCLK、SMCLK为XT2,8M==
}
/*******************************************
函数名称:Timer_B
功 能:定时器B中断服务子函数,产生50ms定时
参 数:无
返回值 :无
********************************************/
// Timer B0 interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
P1OUT ^= BIT3; // 定时50ms
f_50ms = upflag;
upflag = 0;
}
/*******************************************
函数名称:Timer_A
功 能:捕获待测信号上升沿
参 数:无
返回值 :无
********************************************/
#pragma vector=TIMERA1_VECTOR //==定时器A中断处理==
__interrupt void Timer_A(void)
{
switch(TAIV) //向量查询
{ case 2: //捕获中断
if(CCTL1&CM0) //捕获到上升沿
upflag++;
break;
default:
break;
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top