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.

[参考译文] CCS/MSP430G2553:一种易于实现的功能、适用于低功耗模式 DELAY_CYCLE ()?

Guru**** 2553450 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/595635/ccs-msp430g2553-an-easy-too-implement-function-for-a-low-power-mode-delay_cycle

器件型号:MSP430G2553
主题中讨论的其他器件:Energia

工具/软件:Code Composer Studio

是否有诸如 DELAY_CYCLE ()之类的预定义函数;它会将微控制器置于低功耗模式一段时间、然后返回到代码调用点?

如果没有类似 delay_cycle()的函数,有人能给我一些代码吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    测量给定的时间需要计时器。 您自己编程该计时器。

    Ardunio 框架(在 MSP430的情况下为 Energia)定义了 delay()函数,但您不能处理时钟配置,也不能将该计时器用于其他任何操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Clemens、

    我使用的是 TI Launchpad、已经使用了几个计时器进行 C 编程。 现在、我必须找到一种方法、让我的微控制器在等待模块完成时处于 LPM 状态几秒钟。

    那么、我将如何调整这个计时器、以便我可以将我的系统置于 LPM 中几秒钟?
    该计时器用于每3分钟采集一些样本。
    在计时器下方、您可以找到我要转换为 LPM 延迟的带延迟的代码段

    #pragma vector=TIMER0_A0_VECTOR
    __INTERRUPT void Timer0A_CCR0_ISR (void)
    {
    如果(按下==1)
    {
    //等待 TIMER_COUNT 量、然后获取新的采样| 3 min = 180 = TIMER_COUNT
    if (interruptCount == timer_count)
    {
    app_EventSink_SampleVolume();
    interruptCount = 0;
    }
    其他
    {
    // printformat ("interruptcount:%i \r\n"、interruptCount);
    interruptCount++;
    }
    }
    其他
    {
    interruptCount = 0;
    }
    
    
    //准备下一个中断
    TA0CCR0 += tick_divisor;
    
    //唤醒处理器
    _low_power_mode_off_in_exit ();
    }
    
    //通过 SMS 将数据发送到服务器的函数
    //在发送消息
    空消息时也为 SIM900模块加电和断电(char*属性、char*值)
    {
    powerOnGPSModule();
    
    __DELAY_CYCLES (10000000);//DELAY_WAIT 等待 GSM 发出 OK
    _DELAY_CYCLES (10000000);
    _DELAY_CYCLES (10000000);
    
    printformat ("at");
    putcharacter (0x0D);
    putcharacter (0x0A);
    
    _DELAY_CYCLES (11000000);//DELAY_WAIT 等待 GSM 发出 OK
    
    printformat ("AT+CMGF=1");
    putcharacter (0x0D);
    putcharacter (0x0A);
    
    __DELAY_CYCLES (10000000);//DELAY_WAIT 等待 GSM 发出 OK
    
    printformat ("AT+CMGs=\"xxxxxxxxx\"");
    putcharacter (0x0D);
    putcharacter (0x0A);
    
    __DELAY_CYCLES (15000000);//DELAY_WAIT 等待 GSM 发出 OK
    
    printformat ("%s:%s"、属性、值);
    putcharacter (0x1A);
    putcharacter (0x0D);
    putcharacter (0x0A);
    
    __delay_cycles (15000000);//等待 OK
    
    powerOffGPSModule();
    
    //__delay_cycles (10000000);//等待 OK
    } 



    此致、
    Martijn Gielen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用另一个计时器或 WDT。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    他们告诉我、我不应该使用 WDT、因为它对整个微控制器具有重要的功能、例如中断一个无限循环。

    还有其他计时器吗? TA0R;TA0CCR1和 TA0CCR2、否则、我已耗尽任何计时器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您实际使用 WDT、则不能将其用于延迟计时。

    G2553有两个定时器、TA0和 TA1。 两者都有实际计数器寄存器 TA0R 和 TA1R、每个都有三个捕获/比较寄存器、即 TA0CCR0/TA0CCR1/TA0CCR2和 TA1CCR0/TA1CCR1/TA1CCR2。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我实际上会停止 WDT 计时器、以防止超时复位等。 这是因为系统必须长时间在线。 我不知道这2个计时器有3个独立的捕捉/比较寄存器、这是一些很好的知识。 实际上我同时使用 TA0R 和 TA1R、这样我就不能像 LPM 延迟周期那样进行编程了? 还是可以使用左边的捕获/比较寄存器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 TA0或 TA1正在运行(或者启动它不会干扰它所使用的任何其他东西)、那么您可以使用免费的 CCR 来生成中断。