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.

[参考译文] LP-MSPM0G3507:MSPM0G3507上的 RTC 问题-时钟运行速度比预期快[14分钟/天]。

Guru**** 2394295 points
Other Parts Discussed in Thread: MSPM0G3507, LP-MSPM0G3507, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1422098/lp-mspm0g3507-rtc-issue-on-mspm0g3507---clock-running-faster-14-minutes-per-day-than-expected

器件型号:LP-MSPM0G3507
主题中讨论的其他器件:MSPM0G3507、、 SysConfig

工具与软件:

   我正在寻求帮助、解决我在使用 MSPM0G3507微控制器上的 RTC 时遇到的问题。 尽管使用了德州仪器(TI)文档中提供的示例程序、但 RTC 时钟的运行速度比预期的要快[14分钟/天]。 如果获得能帮助我正确配置 RTC 模块并确保的指导或其他信息、我将不胜感激 精确的时钟运行 .

 

我的设置详细信息如下:

  • MCU:MSPM0G3507
  • 编译器:Code Composer Studio 12.8.0
  • 代码:基于 TI 的示例程序[rtc_calendar_alarm_standby_lp_MSPM0G3507_nortos_gcc–无需修改]
  • 评估板:LP-MSPM0G3507

 

请提供任何相关的指导和文档以帮助解决此问题。

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

    您好!

    每天快14分钟? 误差非常高。 我检查了演示代码、它使用 LFOSC 作为 RTCCLK 源。 您是否可以使用外部晶振作为 LFCLK 时钟源。 这应该可以帮助您提高精度。 您还可以参阅 TRM 第 26.3.8.1章"晶体偏移误差"、了解提高精度的更多方法。  

    此致、

    Cash Hao

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

    LaunchPad *具有*外部32K 晶体、只需使用 SysConfig 进行设置即可。

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

    如果您使用的示例为"无修改"、如何确定每天14分钟的错误? 您是否确定了2秒报警的错误?

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

    我添加了一些代码、以便每隔一段时间打印一次时间(当然、我使用 SysConfig 激活 UART0并设置 TX 中断:

    #include <stdio.h>
    #include <string.h>
    
    #include "ti_msp_dl_config.h"
    
    // prototypes
    void StartSerialTX(char *str);
    
    bool gAlarmTriggered = false;
    
    volatile int TXChar = -1;
    char TXData[64];
    
    int main(void) {
    
      uint8_t hours;
      uint8_t minutes;
      uint8_t secs;
      int count = 0;
    
      char sendbuf[64];
      SYSCFG_DL_init();
    
      NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
      NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
    
      /* Enable RTC interrupts on device */
      NVIC_EnableIRQ(RTC_INT_IRQn);
    
      /* Set LED to indicate RTC clock enable */
      DL_GPIO_clearPins(GPIO_LEDS_PORT,
                        GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
    
      /* Start RTC clock */
      DL_RTC_enableClockControl(RTC);
    
      sprintf(sendbuf, "Hello, World! \n\r");
      StartSerialTX(sendbuf);
    
      /* Wait in STANDBY0 mode for alarm to trigger */
      while (false == gAlarmTriggered) {
        __WFI();
      }
    
      /* After alarm has triggered, toggle LED */
      while (1) {
        DL_GPIO_togglePins(GPIO_LEDS_PORT,
                           GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
        delay_cycles(1600000);
    
        if (count == 1000) {
          secs = DL_RTC_Common_getCalendarSecondsBinary(RTC);
          minutes = DL_RTC_Common_getCalendarMinutesBinary(RTC);
          hours = DL_RTC_Common_getCalendarHoursBinary(RTC);
          sprintf(sendbuf, "H: %d; M:%d S:%d\n\r", hours, minutes, secs);
          StartSerialTX(sendbuf);
    
          count = 0;
        }
        else if (count == 900)
        {
            strcpy(sendbuf, "GR!\n\r");
            StartSerialTX(sendbuf);
    
          count++;
    
    
        }
    
         else {
          count++;
        }
      }
    }
    
    void StartSerialTX(char *str) {
    
      while (TXChar != -1) {
        // wait for previous tx to finish
        delay_cycles(1000);
      }
    
      strcpy(TXData, str);
    
      TXChar = 0;
    
      DL_UART_Main_transmitData(UART_0_INST, TXData[TXChar++]);
    }
    
    void RTC_IRQHandler(void) {
      switch (DL_RTC_getPendingInterrupt(RTC)) {
      case DL_RTC_IIDX_ALARM1:
        /* Alarm has been triggered */
        gAlarmTriggered = true;
      default:
        break;
      }
    }
    
    void UART_0_INST_IRQHandler(void) {
      switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
    
      case DL_UART_MAIN_IIDX_RX:
    
        break;
    
      case DL_UART_MAIN_IIDX_TX:
        if (TXData[TXChar] != '\0') {
          DL_UART_Main_transmitData(UART_0_INST, TXData[TXChar++]);
        } else {
          TXChar = -1;
        }
    
        break;
    
      default:
        break;
      }
    }

    对于 LFOSC、我每天有7分钟的错误

    我切换到板载32K 晶体、错误基本上降至0。

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

    感谢 Cash Hao、将时钟从 LFOSC 更改为 LFCLK 即可解决这个问题。