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.

[参考译文] TM4C129ENCPDT:RTC 值在现场损坏

Guru**** 2597295 points
Other Parts Discussed in Thread: CC3100

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/739505/tm4c129encpdt-the-rtc-value-is-corrupt-in-the-field

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:CC3100

感谢您为我们的 MCU TM4C129ENCPDTI3和 CC3100模块产品中的一些问题提供技术支持。

在我们的产品中、我们使用微控制器的内置 RTC (实时时钟)功能。 我们发现 RTC 值在现场(我们的系统安装在纺织机器中)一段时间内损坏一次。
请在下面找到电路和软件详细信息。
我们在实施中使用了 TI 库。
在我们开始生产时、请仔细查看并支持我们尽早解决问题、此问题将会阻止我们的生产和客户声誉。

电路详细信息:

软件:

在 Init()函数期间

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
HibernateEnableExpClk (g_SysClock);
HibernateClockConfig (HIBERNATE_OSC_LOWDRIVE);
HibernateRTCEnable();
HibernateCounterMode (HIBERNATE_COUNTER_24HR);//将休眠模块计数器配置为24小时日历模式。

在无限循环中的主程序中、我们调用了以下代码

struct tm temp_time;
DateTimeGet (temp_time);
Real_time.TM_mday = temp_time.TM_mday;
Real_time.TM_mon = temp_time.TM_mon+1;
Real_time.TM_year = temp_time.TM_year;
Real_Time.TM_Hour = temp_time.TM_Hour;
Real_time.TM_min = temp_time.TM_min;
Real_time.TM_sec = temp_time.TM_sec;

其中 DateTimeGet ()的编码如下所示

//
//
//此函数从的日历逻辑中读取当前日期和时间
//休眠模块。 返回状态表示读取的数据的有效性。
//如果接收到的数据有效,则将24小时时间格式转换为
// 12小时格式。
//
//
布尔
DateTimeGet (struct tm *时间段)

HibernateCalendarGet (Stime);//获取最新时间。
Stime->TM_year += 1900;
if ((((Stime->TM_sec < 0)||(Stime->TM_sec > 59))||
(((Stime->TM_min < 0)||(Stime->TM_min > 59))||
(((Stime->TM_Hour < 0)||(Stime->TM_Hour > 23))||
((Stime->TM_mday < 1)||(Stime->TM_mday > 31))||
(((Stime->TM_mon < 0)||(Stime->TM_mon > 11))||
(((Stime->TM_year < 1900)||(Stime->TM_year > 2099)))

返回 false;

返回 true;

如果您想了解我们的更多详细信息、请告知我们。 如果您不是合适的联系人、请通过转发此请求来指导我们。

感谢您的支持

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

    您好!

     我有几个问题。

    • RTC 值损坏意味着什么? 该值是否完全错误、或者它是否稍微偏离了一点?
    • 您在该字段中看到有多少部件 RTC 值损坏? 百分比是多少?
    • 您提到您在 主程序的无限循环中调用 DateTimeGet (&temp_time)。  调用的 DateTimeGet ()将返回布尔值。 但是、在调用返回值时、您没有检查返回值是否为 true 或 false。 是否仅当 DateTimeGet 返回 true 时才能更新 Real_Time?

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

    非常感谢您的回复和支持、以解决我们的问题。

     

    请查看我们的浅蓝色回复

    1、RTC 值损坏是什么意思? 该值是否完全错误、或者它是否稍微偏离了一点?

    值完全错误。 天、月和年值被完全擦除。 请在图片下方找到日期更改为7、月份更改为0、年份更改为2000。

     

    上述损坏后、我们于2018年10月12日将 RTC 值重置为2018年12月10日。 运行几天后、RTC 值被复位(天值为0、月值为0、年至2000)。  

    2、您在该字段中看到有多少部件 RTC 值损坏? 百分比是多少?

    现场大约有500个器件。 几乎所有器件都随机出现上述问题。


    3、您提到您在主程序的无限循环中调用 DateTimeGet (&temp_time)。 调用的 DateTimeGet ()将返回布尔值。 但是、在调用返回值时、您没有检查返回值是否为 true 或 false。 是否仅当 DateTimeGet 返回 true 时才能更新 Real_Time?

    是的。 我们不会检查 DateTimeGE()函数调用的返回值。 如果 DateTimeGet ()返回了无效值,则在该时间内,我们的 Real_Time 结构变量可能只会获得一些损坏的值(无效值)(仅在该读取函数调用中)。 在随后的读取中、应得到正确的值。 在本例中、一旦将损坏值更新到 struct ree_time、该损坏值就会始终出现在该结构中。 意味着 MCU 内部的 RTC 值无效。

    请澄清这一点。  

    我们不会在产品的正常操作中调用 void DateTimeSet (void)函数。 因此、该无效值不会被写回 MCU RTC 寄存器。

    但是、我们应更新代码以检查返回值、并仅在 DateTimeGet 返回 true 时更新 struct ree_time。 感谢您指出这一点。 但是、这可能无法完全解决我们的问题。

    希望收到您的反馈。

    再次感谢您抽出宝贵时间为我们提供支持。

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

    您好!

     我不知道问题到底是什么。 DateTimeGet ()调用 HibernateCalendarGet ()。 您应该检查 HibernateCalendarGet()的返回值并按照红色描述的方式处理该情况。  请参阅以下 API 说明。

    15.2.2.3 HibernateCalendarGet
    返回日历模式中休眠模块的日期和时间。
    原型:
    内部
    HibernateCalendarGet (struct tm *psTime)
    参数:
    psTime 是用当前日期和时间填充的结构。
    描述:
    此函数返回 psTime 参数提供的结构中的当前日期和时间。
    无论日历模式如何、psTime 参数都使用24小时表示
    时间。 只有在中配置了休眠模块时、才能调用此函数
    日历模式使用 HibernateCounterMode()函数和其中一种日历模式。
    此函数失败并返回非零值的唯一情况是函数
    检测计数器从一天的最后一秒传递到的第一秒
    第二天。 此异常必须在应用程序中通过等待至少一秒钟来处理
    再呼叫以获取更新的日历信息之前。
    注:
    休眠日历模式并不适用于所有 Tiva 器件。 请参阅数据表
    要确定您使用的器件在休眠模块中是否支持此功能。
    返回:
    如果成功读取时间和日期、则返回零;如果成功读取、则返回非零值
    psTime 结构未更新。