⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhao.c

📁 此程序用来测量外部时钟脉冲信号,同时也是一个很好的学习时钟模块程序的例子.
💻 C
字号:

#include <msp430x14x.h>
#include <stdio.h>
unsigned int now_value=0;
//long int pwm_pos;
static unsigned int before_value=0;
long int frequency=0;

void main(void)
{ 
  WDTCTL = WDTPW +WDTHOLD;              // Stop WDT
  TACTL = TASSEL_1 + TACLR;              // ACLK, Clear Tar
  CCR0 = 64-1;                         // PWM Period
  CCTL1 = OUTMOD_7;                     // CCR1 reset/set
  CCR1 = 32;                           // CCR1 PWM duty cycle
  //CCTL2 = OUTMOD_7;                     // CCR2 reset/set
  //CCR2 = 32;                           // CCR2 PWM duty cycle
  P1DIR |= BIT2;                        // P1.2 output
  P1SEL |= BIT2;                        // P1.2 TA1/2 otions
  TACTL |= MC_1;                         // Start Timer_A in up mode
  /*
  for (;;)                            
  {
    _BIS_SR(CPUOFF);                    // Enter LPM0
    _NOP();                             // Required only for C-spy
  }
  */
  /*
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
 //timeA做初始化
  TACTL = TASSEL_1 + TACLR;              // ACLK, clear TAR
  TACTL=MC_1;
  TACCR0 = 16384;                           //产生定时周期是7.8125ms
  TACCTL1=OUTMOD_7;                         // CCR0 interrupt enabled
  TACCR1=8192;
  */
  //P1DIR |= 0x01;                        // P1.0 output
  //P4DIR&=~BIT0;                         //定义P4.0口为CCI0A 是TIMERB的捕获时钟源
  
  /***************用作测试DCO的实际发生频率*************************************
  P1DIR|=BIT4;
  P1SEL|=BIT4;
  经直接测量知道SMCLK的频率为0.76-0.78MHz,可通过此频率与程序所得相比较,验证是否正确
  *****************************************************************************/
  P4SEL|=BIT0;                          //选择设备输入
  //TACTL |= MC1;                         // Start Timer_A in continuous mode
  
  /***以上部分证明了引入CCIA0的输入波形是没有问题的.下一步要做的工作就是完成TIMERB的捕获功能*****/
   
  TBCCTL0 =CM_1+SCS+CCIS_0+CCIE;    //捕获模式,上升沿都捕获,选择CCI0A,同步,捕获中断开 
  TBCCTL0|=CAP;
  TBCTL=TBSSEL_2+TBCLR+MC_2+ID_0;	//选择SMCLK时钟源引入计数器B 1分频
 
  _EINT();                            //开总中断
  while(1)
  {
   // frequency=pwm_pos;
    printf("Fre = %ld\n",frequency);
    
  }
  //_BIS_SR(LAM0_bits+GIE);
 
  /*
  for (;;)                              
  {
    _BIS_SR(CPUOFF);                    // CPU off
    _NOP();                             // Required only for C-spy
  }
   */
 
  
      
}

// Timer A0 interrupt service routine

//#pragma vector=TIMERA0_VECTOR
//__interrupt void Timer_A0 (void)
//{                                                             
 // P1OUT ^= 0x01;                      // Toggle P1.1
  //TACCR0 += 64;                      // 用于产生2秒的脉冲门信号
//}

//TimerB的中断服务程序
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0(void)       //定时器中断函数
{
 //unsigned int pwm_pos,pwm_neg; 
  
  //unsigned int now_value=0;
   //unsigned int now_value1=0;

   //static unsigned int before_value=0;
   static int flag=0;
   
   now_value=TBCCR0;                    //记录上升沿数据
   //printf("now = %ld\n",now_value);
   //now_value = now_value;
   
   if(flag)
   {
     frequency=now_value-before_value;
   }
   
   before_value=now_value;
   flag=1;
 
 // now_value=TBCCR0;  
  //frequency=now_value-before_value;
  //before_value=now_value;
  
   //value=pwm_pos;
  // frequency=pwm_pos;
 //frequency=(pwm_neg-pwm_pos)*512/1000000;
 //TBCCTL0&=~CCIFG;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -