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.
您好!
我正在使用此 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、
我使它正常工作。