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:使用 Vbat 在电源复位时恢复 TM4C RTC 数据。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/750055/tm4c123gh6pm-tm4c-rtc-data-recover-on-power-reset-using-vbat

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

您好!

我正在使用此 TM4C123控制器、需要在 Vbat 上持续运行休眠 RTC 模块、以实现 RTC 时间。

我不知道如何在电源复位后为控制器上电时获得时间值、

我有用于板载3.3V 电池的连接。

请帮助回答以下问题:-

休眠 RTC 时钟的代码示例、其中时间寄存器仅在 Vbat 电源上保持更新。

现在、当我关闭控制器的电源时、RTC 计数停止、如何使它们在电池单元上运行。

无效休眠 ISRHandler (无效)

uint32_t ui32Status;

//获取中断状态并清除所有挂起的中断。
ui32Status = HibernateIntStatus (真);
HibernateIntClear (ui32状态);

//处理 RTC 匹配0中断。
if (ui32Status 和 HIBERNATE_INT_RTC_MATH_0)

//更新匹配值
uint32_t ui32RTCMatch;
ui32RTCMatch = HibernateRTCGet ();
// calender_read = HibernateRTCGet ();
ulocaltime (ui32RTCMatch、&tm2);

HibernateDataGet (\ui32 HibernateCount、1);
ui32 HibernateCount++;
if (ui32 HibernateCount>=50000)

ui32 HibernateCount=0;

HibernateDataSet (\ui32 HibernateCount、1);
HibernateRTCMatchSet (0、ui32RTCMatch + 1);//以后再运行一秒

Timer_t++;//###禁用
rtc_time_details.bit_field.second = tm2.tm_sec;
rtc_time_details.bit_field.minute = tm2.tm_min;
rtc_time_details.bit_field.hour = tm2.tm_hour;
rtc_time_details.bit_field.day = tm2.tm_mday;
rtc_time_details.bit_field.month = tm2.tm_mon;
rtc_time_details.bit_field.year = tm2.tm2_year;


使用上述代码、我无法恢复 RTC 时钟的值、

我不熟悉该控制器的 RTC 时钟、因此 在控制器主电源期间、RTC 时钟计数的一些工作示例关闭、仅连接 VBAT。

谢谢、

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

    当从 VBAT 运行时、RTC 会继续更新秒(和亚秒)计数器。  32位秒计数器将在138年后溢出。  下面是一个简单的程序、使用 UART0打印已用秒数。 如果休眠模块由一个3.3V 电池供电、RTC 计数器继续递增。

    //
    //
    //版权所有(c) 2012-2018 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)提供此软件仅供
    和//仅供 TI 的微控制器产品使用。 软件归
    // TI 和/或其供应商所有,并受适用的版权
    //法律保护。 您不能将此软件与"病毒"开源
    //软件组合在一起以形成更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //对于
    
    本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
    //情况下、TI 不对任何
    原因造成的特殊、意外或必然//损害负责。
    ////
    *****************
    
    #include 
    #include 
    #include 
    #include "inc/hw_types.h"
    #include "include/hw_memmap.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/syssctl.h"
    #include "driverlib/gpio.use.hnecridio
    
    
    
    
    
    
    
    
    //
    //配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。
    ////
    *****************
    void
    ConfigureUART (void)
    {
    //
    //启用 UART 使用的 GPIO 外设。
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    //
    //启用 UART0
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    
    //
    //为 UART 模式配置 GPIO 引脚。
    //
    ROM_GPIOPinConfigure (GPIO_PA0_U0RX);
    ROM_GPIOPinConfigure (GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    //
    //使用内部16MHz 振荡器作为 UART 时钟源。
    //
    UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
    
    //
    //初始化控制台 I/O 的 UART
    //
    UARTStdioConfig (0、115200、16000000);
    }
    void ConfigureRTC (void)
    {
    //
    //在使用之前,需要在唤醒/复位后启用休眠外设
    //它。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
    //
    //等待休眠模块准备就绪。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))
    {
    }
    //
    //启用休眠模块的计时。
    //
    HibernateEnableExpClk (g_ui32SysClock);
    //
    //此处为允许晶振加电和稳定而实现的用户实现的延迟。
    //
    //
    //配置休眠模块的时钟源并启用 RTC
    //功能。
    //
    HibernateClockConfig (HIBERNATE_OSC_LOWDRIVE);
    HibernateRTCEnable();
    }//*************
    
    
    //
    ////主"C"语言入口点。
    ////
    *****************
    int
    main (void)
    {
    
    uint32_t 秒;
    //
    //将系统时钟设置为以基于晶体的 PLL 以80MHz 频率运行
    //
    SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|
    SYSCTL_OSC_MAIN);
    G_ui32SysClock = SysCtlClockGet ();
    
    ConfigureUART();
    UARTprintf ("经过的秒数!\n");
    UARTprintf ("按'ESC'重置定时器\n");
    ConfigureRTC();
    
    //
    //永久循环
    //
    while (1)
    {
    //
    //延迟一位
    //
    SysCtlDelay (g_ui32SysClock/8);
    秒= HibernateRTCGet ();
    UARTprintf ("\r\n%d "、秒);
    if (UARTCharGetNonBlocking (UART0_BASE)== 27)
    {
    HibernateRTCSet (0);
    }
    
    }
    
    

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

    感谢 Bob、

    我使它正常工作。