请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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