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.

[参考译文] TM4C123GH6PM:如何在下电上电后恢复 RTC 值?

Guru**** 2469120 points
Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/677171/tm4c123gh6pm-how-to-restore-rtc-values-after-power-cycle

器件型号:TM4C123GH6PM

大家好、

我正在使用我自己的 TM4C123GH6PM 定制板 、我正在尝试实现 MCU 的 RTC。

我正在使用32.768 KHz 晶振、并通过 VBAT 和纽扣电池之间的 RC 电路(51 Ω 和0.1 μ F)将3V 纽扣电池连接到 Vbat 引脚。

以下代码是为 RTC 编写的  

time_t calender_write;
time_t calender_read;
struct TM TM1 ={0、15、16、2、3、2018-1900、1、0};
struct TM tm2 ={0};



int main ()

{



SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTLTL_80MHz;SysClockSet (SYSCTLTL_SYSC/ SYSC/ SYSCL)= 0、0、0、0、0、000 / SYSC/ SYSC/ SYSC/ SYSC/ SYSC/ SYSCL = 0、0、

0、000MHz / SYSC/ SYSC/ SYSC/ SYSC


SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);

//等待休眠模块准备就绪。
while (!SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))
{
}
HibernateEnableExpClk (ui32SysClkFreq);

//
等待模块上电一段时间。
//

//配置休眠模块的时钟源并启用
// RTC 功能。
HibernateClockConfig (HIBERNATE_OSC_HIGRIVE);
HibernateRTCEnable ();

HibernateCounterMode (HIBERNATE_COUNTER_RTC);

CORE_WRITE = umktime (&TM1);HibernateRTCSet

(CORELEY_WRITE);



while (1)

{

calender_read = HibernateRTCGet ();
ulocaltime (calender_read、&tm2);

//设置 UART
strfttime ((char *) buf_Rz、32、"%c\r\n"、&tm2)的输出格式;

}

问题是、重启后我无法恢复小时:分钟:秒值。 当我对电路板进行下电上电时、RTC 复位。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只是一次更新。 我能够通过更改代码的逻辑来解决这个问题。 我让用户在应用程序中设置时间。 设置时间后,它会在断电后继续运行,直到电池未被取出为止。 就像在手机上一样!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sumit、
    很高兴您的问题得到解决。 您是否介意发布您的更新代码以便社区中的其他人也能从中受益? 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    uint32_t XTime;
    uint32_t 小时;
    uint32_t 分钟;
    uint32_t second;
    
    void UART3IntHandler (void)
    {
    uint32_t ui32Status1;
    
    ui32Status1 = UARTIntStatus (UART3_base、true);
    
    UART3_base、uART32Stit1;uART32Stelus1
    
    Customhour[g]=UARTCharGet (UART3_base);
    Custominut[g]=UARTCharGet (UART3_base);
    
    Hour = atoi (Customhour);
    min = atoi (Custominute);
    UINT32_t total =(min*60)+(hour*3600);
    HibernateRTCSet (Total);
    
    }
    
    int main ()
    
    {
    SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_MAIN | SYSCTL_XTAL_16MHz);// 80MHz 时钟
    
    ui32SysClkFreq = 8000000;
    
    //启用休眠模块。
    SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
    
    //等待休眠模块准备就绪。
    while (!SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))
    {
    }
    HibernateEnableExpClk (ui32SysClkFreq);
    
    //
    //等待模块上电的时间。
    //
    
    //配置休眠模块的时钟源并启用
    // RTC 功能。
    HibernateClockConfig (HIBERNATE_OSC_HIGRHIVE);
    HibernateRTCEnable();
    
    HibernateCounterMode (HIBERNATE_COUNTER_RTC);
    
    while (1)
    {
    XTime = HibernateRTCGet ();
    
    小时=((XTime /3600))% 24;
    分钟=((XTime /60))% 60;
    秒=(XTime % 60);
    
    usprintf (buf_Rz、"%d %d %d"、小时、分钟、秒);
    
    }
    

    是的、当然可以。 此代码要求应用程序用户设置时间。 因此、您的应用可能需要 UI。