打印

MSP430F438A芯片用定时器捕获模式,定时器计数频率错误

[复制链接]
508|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小凡凡丶|  楼主 | 2019-5-8 13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小凡凡丶 于 2019-5-8 14:01 编辑


    如题,用MSP430F5438A的TA0.3定时器做捕获,定时器计数频率一直不对,系统时钟是12M,定时器采用SMCLK=XT2=12M,经分频后是1M的计数频率,但是开启捕获后,计数频率一直上不去,计数特别慢,不知道是什么原因。有大神遇见吗?


//以下为时钟初始化代码
void Init_MCLK(void)
{
  unsigned char i;
  PMMCTL0   =PMMPW+PMMCOREV0;
  P5SEL     |= 0x0C                                       ; // 端口功能选择振荡器
  UCSCTL6   &= ~XT2OFF                                    ; // 振荡器使能
  UCSCTL3   |= SELREF_2                                   ; // FLLref = REFO
   UCSCTL4   = UCSCTL4&(~(SELA_7))|SELA_2                                     ; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                         
    SFRIFG1 &= ~OFIFG                                     ;
     for (i = 0xFF; i > 0; i--);  
  }while(SFRIFG1&OFIFG)                                   ; // 检测振荡器错误标志
  UCSCTL6   |= XT2DRIVE0                      ; // XT2 驱动模式 8~16MHz  
  UCSCTL4   =  UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5;                             ; // SMCLK = MCLK = XT2
}


//以下为定时器初始化代码

TA0CTL= TASSEL1+TACLR + ID_2; //时钟源1 + 定时器清除位 + 4分频
TA0EX0=TAIDEX_2;
TA0CCTL3=SCS + CAP; //同步捕获 + 捕获模式
TA0CCTL3 |= CM_1;    /*上升沿捕获*/
TA0CTL |= MC1;        //   连续模式:计时器计数到ffh   
TA0CCTL3 |= CCIE;   //捕获中断使能
TA0CTL |=TAIE;


//以下为定时器中断函数

#pragma vector=TIMER0_A1_VECTOR
__interrupt void TimerA0_3(void)
{
  LPM4_EXIT;
   switch(TA0IV)
   {
       case 0:
               break;
     case 14:  flow++;
                 if(flow>1)
                             {       
                                taver=0xffff;       
                                   pulse=0;
                               TA0CTL=0;
                                TA0CCTL3=0;
                            
                              }
                break;
       case 6:      
              counter=0;
        if((pulse==CAPPULES[1])&&(!P_F1)){flow=0; taver=TA0CCR3;}
        if((pulse==CAPPULES[0])&&(P_F1)){flow=0; taver=TA0CCR3;}
        if(pulse==1)       
        {
                if(((flow==1)&&(taver<=TA0R))|| (flow>1))
                taver=0xffff;                       
                else taver=TA0CCR3 - taver;
                TA0CTL=0;
                TA0CCTL3=0;
        }
        if(pulse)  pulse--;
        break;
   }
}




采用的是P1.4引脚,所对用的定时器是TA0.3定时器,定时器频率是1MHz,所捕获频率为2.42KHz,当定时器捕获到后,进入捕获中断,TA0CCR3的变化范围特别缓慢,只有几个数,不知道问题出在哪里。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝