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.

[参考译文] TM4C129XNCZAD:Tiva 在 HibernateEnableExpClk 上挂起

Guru**** 2408100 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1106197/tm4c129xnczad-tiva-is-hanging-at-hibernateenableexpclk

器件型号:TM4C129XNCZAD

大家好、

在初始化任务期间、我将调用 Hibernate 初始化函数。以下是该函数:

void Board_InitHibernate (void)

MAP_SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
while (!map_SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))


MAP_HibernateEnableExpClk (SYSTEM_CLOCK);//执行此行时它挂起,SYSTEM_CLOCK 为120000000
MAP_HibernateClockConfig (HIBERNATE_OSC_LOWDRIVE);
MAP_HibernateRTCEnable();
MAP_HibernateCounterMode (HIBERNATE_COUNTER_24HR);

在完全 休眠 EnableExpClk 函数时、我的一些主板会在特定地址挂起。 (我也尝试过 ROM_HibernateEnableExpClk 和 HibernateEnableExpClk)

当我在调试器中单击暂停按钮时、我看到它在_HibernateWriteComplete 函数中挂起。

我有大约30个电路板、其中只有2个电路板发生了这种情况、因此很可能存在硬件问题。

在发生此问题的电路板中、它是可重现的%100。

WAKE 和 HIB 引脚按如下方式连接:

工作电路板和有问题的电路板的 YM 代码均为82、因此我知道生产日期 为2018年2月。

从 DID0寄存器中、我读取 MAJOR REV=0和 MINOR REV=2、因此所有电路板中的芯片修订版本都是 A2。

什么类型的硬件问题会导致这种情况?

此致、

Erman

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

    您好!

    [引用 userid="301690" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1106197/tm4c129xnczad-TIVA-is-hing-ating-athernateenableexpclk"]工作板和工作板都有问题、因此 引用的日期为2018年2月/YM 日期。]

    您的意思是、两者都在工作? 这两块电路板是否在一个时间点工作、但最近才出现故障? 您说他们的生产日期是2018年2月。 您能否确认他们自2018年以来一直在工作、但最近才失败、或他们自生产以来从未工作过。

    只是为了进一步隔离问题、您是否可以执行 ABA 交换测试? 将 MCU 从问题板换用为熟悉的板、您是否仍然可以重现问题? 将已知良好的 MCU 换用到问题板中? MCU 是否会继续工作?

     查看您的原理图、我想知道您唤醒器件的机制是什么。 我看到您将 WAKEn 引脚连接到电池和电源。 是这样吗? WAKEn 引脚是否会变为低电平? WAKEn 是一个低电平有效信号、用于在器件处于休眠模式时唤醒器件。 还有其他方法可以唤醒器件、例如使用 I/O 将器件从休眠状态唤醒。 您的方法是什么?

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

    您好、Charles、

    我很抱歉,我无法向你明确表达我的情况。 我在下面重述一下

    所有28块工作 PCB 和2块有问题 的 PCB 的 YM 代码均为82、因此据我了解、日期 为2018年2月。

    我所说的是生产日期、而不是 PCB 生产日期。 这是 TM4C129 生产日期。 此信息基于芯片标记和以下文档: https://www.ti.com/lit/er/spmz850g/spmz850g.pdf?ts=1654072704954&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FTM4C1294NCPDT%253FkeyMatch%253DTM4C1294NCPDT%2BERRATA

    他们最近没有失败。 多氯联苯是几天前生产的。 造成这一特殊误差的2个有问题的 PCB 以前从未正常工作。

    WAKEn 引脚不用于变为低电平。 器件不应在运行时进入实际休眠状态。 使用休眠模块的整个想法是使用实时时钟、并始终通过使用 HibernateCalendarGet 函数获得正确的日期时间。 (当然、在首次使用时设置它之后)

    最后、如果我无法执行任何其他操作、我最终将不得不执行 ABA 交换测试。 在 µC 焊料之前,我还可以做什么或尝试什么? 或任何权变措施?  什么是导致_HibernateWriteComplete 函数挂起的确切原因? 我可以读取任何寄存器来帮助识别问题吗?

    此致、

    Erman

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

    您好、Erman、

     我发现此勘误表可能与您的观察结果相关。 是否可以尝试上述解决方法?

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

    您好、Charles、

    借助于  MAP_HibernateEnableExpClk 行上的断点、我读取的 WRC 位已经被置位。

    WRC 是位于0x400FC010中 HIB_CTL 寄存器的位31  

    执行  MAP_HibernateEnableExpClk 时、WRC 位设置为0。

    手动尝试覆盖该寄存器中的 WRC 位或其他位不起作用。

    总之,我的问题没有得到解决。

    此致、

    Erman

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

    您好、Erma、

     WRC 位是一个只读位。 您无法手动覆盖该位。 您能否尝试勘误表中建议的权变措施、即如果 WRC 位未更改为1、则在振荡器启动时间结束后重置休眠模块。 休眠模块复位后、再次执行写操作。 振荡器启动时间大约为600ms、如数据表中所述。  

     我建议您先尝试一些简单的方法、看看它是否会产生影响。 请参阅以下内容、在启用休眠模块之前先对其执行软件复位。  

    void Board_InitHibernate (void)

    SysCtlPeripheralReset (SYSCTL_Periph_HIBERNATE);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
    while (!map_SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))

     快来吧……

    如果上述操作不起作用、则需要修改驱动程序函数。

    代码在以下函数中挂起、等待 WRC 位变为1。 检查 C:\ti\TivaWare_C_Series-2.2.0.295\driverlibhibite.c 中的源文件 如果您想修改此文件而不重建 driverlib.lib、则可以将此文件复制到本地工程目录。 您需要修改代码、以便代码在600ms 后或 WRC 位变为1后退出 while 循环。 如果勘误权变措施仍然不起作用、则您可能尚未找到勘误表、而是我不知道原因的其他问题。 正如您提到的、28个中只有2个出现了意外行为。 问题似乎与硬件有关。  

    静态空
    _HibernateWriteComplete (空)

    //
    //旋转直到写入完成位被置位。
    //
    while (!(HWREG (HIB_CTL)& HIB_CTL_WRC))


      

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

    也许您也可以尝试启用外设、然后按如下所示进行复位。  

    void Board_InitHibernate (void)

    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);
    while (!map_SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))

    SysCtlPeripheralReset (SYSCTL_Periph_HIBERNATE);

    while (!SysCtlPeripheralReady (SYSCTL_Periph_HIBERNATE))

     快来吧……

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

    这一点根本没有帮助。 与以前完全相同的情况。

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

    在执行  HibernateEnableExpClk (system_clock); 行后、WRC 永远不会变为1。

    当我退出循环时、虽然 WRC 不是1、但它不能解决我的情况、因为 此后 HibernateCalendarGet 函数不起作用。

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

    您好、Erman、

     在我对这篇文章的第一次答复中、我建议您执行 ABA 交换测试。 请再次查看我之前的答复。 您能否 就此请求提供反馈?

    "为了进一步隔离问题、您可以进行 ABA 交换测试吗? 将 MCU 从问题板换用为熟悉的板、您是否仍然可以重现问题? 将已知良好的 MCU 换用到问题板中? MCU 是否会继续工作?"