This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:LPM0和TA0

Guru**** 2535250 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/656445/msp430fr5994-lpm0-and-ta0

部件号:MSP430FR5994

我想在SMCLK =16 MHz时使用TimerA进行延迟。  

以下代码有效并给出请求的延迟(大约),其中函数的参数是请求的延迟(以微秒为单位):

void Delayus (无符号int delayamt)

   //延迟为0-6.5535万 usec;已初始化以使用SMCLK,除以16,因此计时器增量为一次/usec;到达delayamt时,给出一个中断,延迟结束
       TA0CCR0 = delayamt;                    //在计数到此值时中断
       TA0CTL ||(MC_1 | TALCL);
     __bis_sr_register(LPM0_bits | GIE);      //进入睡眠模式。 Timer0 ISR将在适当的时间过后唤醒我们
}

#pragma vector=TIMER0_A0_vector
__interrupt void TIMER0_A0_ISR(void)

   TA0CTL |= MC_0;                            //停止计时器0
   __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);      //从LPM0唤醒并在Delayus功能后继续
}

在取得了成功之后,我想我将进一步扩大,以实现大量的,大约几秒钟的延迟。 它不工作.... CPU永远休眠。

void Delaysec (无符号int dela)                //延迟为65.535 毫秒

   无符号长I,delas;
    DELA = 20*DELA;                                       // 1秒= 20*DELA 5万 USEC
   用于(i=0;i<delas;i++) Delayus (5万);
}

在主要的程序中,我已经禁用了看门狗。

   WDTCTL = WDTPW | WDTHOLD;                              //停止看门狗

有什么想法导致这一失败?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我忘了将TimerA的设置包括在主要程序中:
    //启用中断后,初始化Timer0以替换__DELAY周期
    TA0EX0 = 0x0001; //除以2
    TA0CTL = tassel_2 + MC_0 + TCLR + ID_3; // SMCLK,计数到TA0CCR0,计时器清除,除以8
    TA0CCTL0 = CCIE; //已启用TACR0中断,但直到Timer0正在运行时才会生效
    __bis_sr_register (GIE); //启用所有中断
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,David:

    请使用代码上传工具上传您的源代码,以便我重现问题并帮助调试问题。 我看到的一件事可能会导致问题,就是您没有正确停止ISR内部的计时器:

    TA0CTL |= MC_0; //停止计时器0

    如果在中断内部时模式控制位为01,并且您或他们使用0x0000,则没有任何更改。
    要停止计时器,您需要使用此行代码(清除TA0CTL寄存器中的MC位):

    TA0CTL &=~(MC_3); //停止计时器0


    一些额外的调试可以是在“for”循环中添加“__no_operation()”,以帮助进行调试,从而查看中断是否正在触发或是否正在某个位置循环。

    此致,

    Matt Calvo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到您的症状,因此故障不在此代码范围内。

    Matt提供了停止计时器的正确方法,但这本身并不是造成问题的原因。

    "永远"需要多久?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你们两位的评论。 故障完全是我的。
    1. Matt:是的,我没有正确地停止TimerA。
    2.布鲁斯:是的,你的评论很有见地。 我心里有些困惑,虽然我希望以毫秒为单位的延迟,但我实际使用的代码(未在问题陈述中发送给您)计算出的延迟以秒为单位,因此,虽然我需要1550毫秒,例如,我得到了1550秒...看起来永远 虽然直到1550秒结束后我才真正盯着电路。