您的位置 首页 培训

msp430准确测低频

//******************************************************************************//Date:2009.8.16//Au

//******************************************************************************
// 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;
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/274314.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部