TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F149的TimerA能不能产生一个周期2us的方波

我现在用定时器已经可以产生2ms的方波。

我想产生方波周期为2us。但是从示波器上只能是方波的周期是10.70us

IDE:IAR 5.3

 

 

/******************************************************************
* 实验名称:定时计数器A 的简单应用-10ms 计时器 (MSP430F149)*       * 实验说明:
*     通设置系统主时钟(MCLK=8Mhz ) 、辅助时钟(ACLK=8Mhz )、
*      子系统时钟(SMCLK=8Mhz )
* 编译软件:Embedded Workbench 5.3
*
*
*
*
******************************************************************/

#include <MSP430x14x.h>
#define uchar unsigned char
#define uint unsigned int

 

#define CNT (65536-1)  //计数

void Init_Timer_A(void)
{
    CCTL0 = CCIE; // 使能CCR0 中断
    TAR=CNT;  // 计数装入初值
    TACTL=TASSEL_2+MC_2+TAIE+ID_3;//设置时钟源和计数模式 采用SMCLK/8 =1Mhz                         

}

void Init_Clock(void)
{
    unsigned char i;
        WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
    /*——选择系统主时钟为8MHz——-*/
    BCSCTL1 &= ~XT2OFF;                       // 打开XT2高频晶体振荡器
    do
    {
        IFG1 &= ~OFIFG;                       //清除晶振失败标志
        for (i = 0xFF; i > 0; i–);           // 等待8MHz晶体起振
    }
    while ((IFG1 & OFIFG));                   // 晶振失效标志仍然存在?
    BCSCTL2 |= SELM_2 + SELS;                 //主时钟和从时钟都选择高频晶振 MCLK = SMCLK = XT2
}

void main(void)
{
       WDTCTL=WDTPW + WDTHOLD; // 关闭看门狗
 
    P2DIR |= BIT5;
       Init_Clock();
       Init_Timer_A();
    _BIS_SR(LPM0_bits+ GIE);//进入低功耗睡眠模式
      while(1)
    {
             }

   }
#pragma vector=TIMERA0_VECTOR //定时器A 中断服务程序
__interrupt void Timer_a(void){   switch(TAIV)         //TAIV 表示中断向量号   {      case 2:break;      case 4:break;      case 10:              //TAIV=10 表示中断计数器溢出中断         TAR=CNT;// (65536-1)        P2OUT ^= BIT5;
  }
  LPM0_EXIT;

}

Maka Luo:

可以,用CCP0作为设置占空比计数器,CCP1作为周期计数器。

Lina Lian:

Yukun Wang,

你看到的现象是正常的,你是在定时器中断里进行的IO口状态翻转,就需要考虑进入中断和推出中断的时间,和你所定时时间相比而言,是否可以比拟。中断现场保护和恢复时间:6+5 CPU Cycles,再加上你设置IO和中断中其他处理的时间。你可以算算比例。另外如果想要产生方波或PWM,建议时刻使用OUT_MODE设置,直接输出PWM波。

希望对你有帮助!O(∩_∩)O~

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F149的TimerA能不能产生一个周期2us的方波
分享到: 更多 (0)