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.

[参考译文] MSP430FR6922:RTC:1秒计算

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1161386/msp430fr6922-rtc-1-second-calculations

器件型号:MSP430FR6922

大家好、

  我正在使用 MSP430FR6922控制器 RTC 模块。 我正在使用 RTC_C 模块。想使用 RTC 模块每隔1秒生成一次中断。我已经从 Resource Explorer">dev.ti.com/.../node 获取了 RTC 的示例代码

有人能不能详细解释一下如何产生1秒中断。 请详细说明计算...

谢谢

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

    您好、Sayali、

    在此示例中、RTC_C 外设处于计数器模式、并设置为在8位溢出或256个计数时触发事件。

    您的 ACLK 为32768Hz、它使用计时器0分频器进行8分频、然后再次使用计时器1分频器进行16分频。 根据 RTCCTL1寄存器中的 RTCSSELx 位、这个时钟被用作 RTC 的输入时钟。  

    因此、32768Hz/8/16 = 256Hz。 因此、要触发8位溢出事件、您需要256个计数/256Hz 或1秒。  

    此致、
    Brandon Fisher

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

    非常感谢 Bradon  

    那么、如果我现在想每0.125秒生成一次中断、我的计算如下:-

    ACLK=32768/8/2=2048...SO、对于一个8位溢出256个计数/2048Hz=0.125秒

    这是正确的吗?

    我附上了供参考的代码:-

    -

    void RTC(void)
    {
        // Setup RTC Timer
         RTCCTL0_H = RTCKEY_H;                   // Unlock RTC
    
        // RTCCTL0_L = RTCTEVIE;                   // RTC event interrupt enable
         RTCCTL1 = RTCSSEL_2 | RTCTEV_0 | RTCHOLD; // Counter Mode, RTC1PS, 8-bit ovf
         RTCPS0CTL = RT0PSDIV1;                  // ACLK, /8
         RTCPS1CTL = RT1SSEL1 | RT1PSDIV_0; // out from RT0PS, /2
    
         RTCCTL1 &= ~(RTCHOLD);                  // Start RTC
      }
    
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=RTC_VECTOR
    __interrupt void RTC_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(RTC_VECTOR))) RTC_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        switch(__even_in_range(RTCIV, RTCIV_RT1PSIFG))
        {
            case RTCIV_NONE:      break;        // No interrupts
            case RTCIV_RTCOFIFG:  break;        // RTCOFIFG
            case RTCIV_RTCRDYIFG: break;        // RTCRDYIFG
            case RTCIV_RTCTEVIFG:               // RTCEVIFG
                count++;
    
                if(count==8)
                {
                    second++;
                    count=0;
                }
    
    //           if(count==FinalDelaytime)
    //           {
    //               //timer stop
    //               TA0CCTL0 &= ~CCIE;
    //               //rtc disabled
    //               RTCPS1CTL &= ~RT1PSIE;
    //
    //               P7OUT&=~ BIT0;                // Relay off
    //           }
                 break;
            case RTCIV_RTCAIFG:   break;        // RTCAIFG
            case RTCIV_RT0PSIFG:  break;        // RT0PSIFG
            case RTCIV_RT1PSIFG:  break;        // RTCRDYIFG
            default: break;
        }
    }

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

    您好、Sayali、

    是的、这应该起作用。  

    此致、
    Brandon Fisher

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

    非常感谢 Brandon ...这解决了我的问题