利用TIMERA产生中断让P1.6每隔1ms闪烁一次问题

2019-03-24 12:31发布

本人想用定时器A每1ms产生产生一个中断,让P1.6电平转换,从而是LED2每隔1ms闪烁一次
#include "msp430g2553.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
  P1DIR=0x40;
  P1OUT=0x00;
  DCOCTL=0;
  BCSCTL1=CALBC1_1MHZ;
  DCOCTL=CALDCO_1MHZ;                                //设置DCO为1MHZ
  BCSCTL2 = SELM_1;                                      //主时钟和从时钟都选择DCOCLK
  TACCTL0 = CCIE;                                               //CCR0中断使能
  TACCR0 = 1000;                                              //设置定时器A每1ms中断一次
  TACTL |= TASSEL_2 + ID_0+MC_1;          //设置定时器A的时钟源为MCLK,并设置为不分频(1MHZ),增计数模式
//打开全局中断
    _EINT();
    while(1)
    {
     }

}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TimerA_ISR(void)
{
    P1OUT^=0x40;                  //电平翻转
TACCTL0&=~CCIFG;         //清除中断标志位   
}

然后下载到板子上测试发现LED2的灯一直亮着,即P1.6一直是高电平
偶尔我把上面的一句代码 BCSCTL2 = SELM_1;                                      //主时钟和从时钟都选择DCOCLK
改成 BCSCTL2 = SELM_1+0x08;                                      //主时钟选择DCOCLK,辅助时钟选择高频晶振
LED2灯闪烁了,这就奇怪了,我没有外接高频晶振的,但辅助时钟选择高频晶振反而使程序对了,难道辅助时钟选择DCOCLK会出问题的?这没有道理的,本人很是疑惑,希望懂的人能详细解答下,十分感谢!

[ 本帖最后由 WPD 于 2013-5-2 21:59 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
WPD
2019-03-25 00:52
十分感谢上面几楼的回答,确实如此,我把1000改成50000(50ms)之后,确实能看到闪烁了,1ms确实太快了,肉眼分辨不出来,“TASSEL2是选择定时器时钟为SMCLK, MCLK是不可能给timer做时钟源的,vloclk是12khz的,所以你的时钟为83.3us, 翻转时间则变成了83.3*1000=83.3ms, 约为12Hz, 低于25Hz,人眼可以分辨”,解决了我的疑惑!

一周热门 更多>

相关问题

    相关文章