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.

[参考译文] MSP430FR2433:"唤醒函数"

Guru**** 1543210 points
Other Parts Discussed in Thread: MSP430FR2433, MSP430FR2000
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1177397/msp430fr2433-wake-up-function

器件型号:MSP430FR2433
主题中讨论的其他器件: MSP430FR2000

您好、团队、为客户寻求一些意见。  

使用名为 msp430fr2433的 TI 微控制器。 我需要一个代码与我自己的代码集成、以便我的代码只运行一次和一小时。 基本上,我需要一个“唤醒”功能,以便仅通过较长的延迟从低功耗模式打开微控制器。
在我的代码甚至不需要的时候,它可以很容易地替代关于 LED 开/关的代码行,最终只有当我们知道“长延迟唤醒功能”工作时,我们才能用我的实际代码替换“LED 开/关”代码行。
该微控制器具有不同的计时器和不同的低功耗模式。 我在工作的主代码中找到了许多调用中断函数的代码。 问题是这些代码的延迟最大为1秒。 因此,我了解到可以将软件计数器集成到这种类型的代码中,以使延迟更长。 我想知道您是否可以帮助我解决这个问题、如果可以、我想快速打电话进行进一步讨论。 非常感谢您提前告知我

thius 示例具有将微控制器置于低功耗模式(在这种情况下为 LPM0)的主代码、并在主代码之外调用中断函数、当它运行时、会唤醒微控制器并执行实际代码 (在这些示例中、只需打开 LED 以进行演示、最终我想用实际代码替换它)。
https://dev.ti.com/tirex/explore/node?node=A__ANeJ8ixtppj0XK4f9yuyKw__msp430ware__IOGqZri__LATEST

这两个代码的问题是、我无法进一步延迟睡眠模式(LPM)、在这两种情况下、延迟都很短、并且不能延长太长。 因此、我认为解决方案是集成到该代码中、即软件计数器、如所附代码中的计数器(遗憾的是、该计数器是为另一个微控制器 MSP430FR2000开发的)。 但我尝试调整和集成、但未成功。

谢谢你。

-Mark

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

    Mark、您好!

    如果我理解这一点、您需要一个计时器、该计时器将通过 GPIO 切换唤醒另一个 MCU。 一个想法是将计时器设置为计数、然后当计时器发生溢出时、您将使另一个变量递增。 一旦变量达到一定的值、您就可以切换 GPIO。 例如。

    #include <msp430.h>
    int count;
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;                 // Stop WDT
        
        // Configure GPIO
        P1DIR |= BIT0;                            // Set Pin as output
        P1OUT |= BIT0;
        
        // Disable the GPIO power-on default high-impedance mode to activate
        // previously configured port settings
        PM5CTL0 &= ~LOCKLPM5;
        
        // Timer1_A3 setup
        TA1CCTL0 = CCIE;                          // TACCR0 interrupt enabled
        TA1CCR0 = 50000;
        TA1CTL = TASSEL_1 | MC_2;                 // ACLK, continuous mode
        count = 0;
        __bis_SR_register(LPM3_bits | GIE);       // Enter LPM3 w/ interrupt
    }
    
    // Timer A1 interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector = TIMER1_A0_VECTOR
    __interrupt void Timer1_A0_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) Timer1_A0_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        count++;
        if(count > 20){
            P1OUT ^= BIT0;
            count = 0;
            }
        TA1CCR0 += 50000;                         // Add Offset to TA1CCR0
    }
    

    数学运算将是(计时器 CCR0值)*(1/(时钟频率))*计数=切换之间的时间。

    改编自 MSP430FR24xx 演示- Timer1_A3、Toggle P1.0、CCR0 Cont Mode ISR、32KHz ACLK

    另一个示例是使用 RTC。 请参阅此示例 MSP430FR243x 演示- RTC、每1次切换 P1.0 

    此致、

    Luke