请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 值。
我考虑了以下可能的根本原因:
- 器件关闭时、硬件无法保持 RTC
- 初始化过程错误地确定休眠模块或 RTC 未运行、并且(重新)运行初始化序列(使 RTC 复位)
失去 RTC 的器件都使用相当新的纽扣电池(1-2个月)运行。
我希望根本原因与上面的#2有关、因为这可以在固件中进行更改、不需要硬件修复。
从代码中可以看到、我尝试使用 getHibEnb 和 getHighDriveStrh 函数来检测休眠模块是否正在运行。 同样、我使用 getRTCEnb 来检测 RTC 是否正在运行。 如果其中一个函数返回 false、则模块将重新初始化、并重置时间。
我希望上述内容清晰明了、并衷心感谢 您在这方面提供的任何帮助。
谢谢、
Christian