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.

[参考译文] TM4C1233D5PM:RTC 时间偶尔丢失

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/597075/tm4c1233d5pm-rtc-time-sporadically-lost

器件型号:TM4C1233D5PM

你(们)好

当器件未从外部供电时、我使用休眠模块来维持 RTC。 这是正在使用的休眠模块的唯一功能。

休眠模块时钟和电池的接线如下图所示(PE 接地)。

在固件中、我首先使用以下代码初始化休眠模块:

void HIB_init( void ){

/*检查休眠模块是否已运行(并且已设置为高驱动强度)*/
if ((!getHibEnb())||(!getHighDriveStrath()))
{
/*如果未运行,请启用时钟*/
ROM_HibernateEnableExpClk (ROM_SysCtlClockGet ());

/*等待 t_HIBOSC_START 让时钟稳定*/
ROM_SysCtlDelay (50000); 
/*等待写入准备就绪*/ waitHibWrite(); /*配置时钟*/ ROM_HibernateClockConfig ( HIBERNATE_OSC_HIGRIVE ); } /*设置模块初始化标志*/ hibInitialized = true; }
静态 bool getHibEnb( void ){

bool enb = false;
if (HWREG (HIB_CTL)& HIB_CTL_CLK32EN)
{
ENB = true;
}
返回 enb;
} 
静态 bool getHighDriveStrand( void ){

bool highStruth = false;
if (HWREG (HIB_CTL)& HIB_CTL_OSCDRV)
{
高强度= true;
}
返回高强度
;}

 

然后、我使用以下代码启用 RTC:

bool HIB_RTCEnable( void )
{
bool resultFlag = false;

/*是模块初始化的?*/
if (hibInitialized == true)
{
/* RTC 是否已初始化? *
if (!getRTCEnb())
{
/*等待写入准备就绪*/
waitHibWrite();

/*启用 RTC */
ROM_HibernateRTCEnable();

/*等待写入准备就绪*/
waitHibWrite();

/*将修整设置为 norminal 值,0x7FFF */
ROM_HibernateRTCTrimSet( 0x7FFFU );

/*等待写入准备就绪*/
waitHibWrite();

/*首次启用 RTC 时,时间设置为01/2000 */
ROM_HibernateRTCSet( RTC_TIME_INIT_VALUE );
}
resultFlag = true;
}
返回结果标志;
} 
静态 bool getRTCEnb( void ){

bool enb = false;
IF (HWREG (HIB_CTL)& HIB_CTL_RTCEN)
{
ENB = true;
}
返回 enb;
} 
静态空 waitHibWrite( void ){

/*等待休眠模块完成异步写入*/
while (!(HWREG (HIB_CTL)& HIB_CTL_WRC)){};
} 

我打算仅在休眠模块和 RTC 尚未运行时初始化它们。

我的问题是、在这个设置下、有100个电路板偶尔会失去保持的 RTC 值。

我考虑了以下可能的根本原因:

  1. 器件关闭时、硬件无法保持 RTC
  2. 初始化过程错误地确定休眠模块或 RTC 未运行、并且(重新)运行初始化序列(使 RTC 复位)

失去 RTC 的器件都使用相当新的纽扣电池(1-2个月)运行。

我希望根本原因与上面的#2有关、因为这可以在固件中进行更改、不需要硬件修复。  

从代码中可以看到、我尝试使用 getHibEnb 和 getHighDriveStrh 函数来检测休眠模块是否正在运行。 同样、我使用 getRTCEnb 来检测 RTC 是否正在运行。 如果其中一个函数返回 false、则模块将重新初始化、并重置时间。

我希望上述内容清晰明了、并衷心感谢 您在这方面提供的任何帮助。

谢谢、  

Christian