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.

[参考译文] LP-CC2652RB:使用 BIM 时看门狗不会复位 MCU

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1464785/lp-cc2652rb-watchdog-not-resetting-mcu-when-using-bim

器件型号:LP-CC2652RB

工具与软件:

你好。 我正在摆弄看门狗设置、发现它根本不起作用。 我已经浏览了其他主题、我的看门狗配置似乎是正确的:

    Watchdog_init();
    Watchdog_Params_init(&wdgParams);
    wdgParams.callbackFxn = (Watchdog_Callback) wdgCallback;
    wdgParams.resetMode = Watchdog_RESET_ON;
    wdgParams.debugStallMode = Watchdog_DEBUG_STALL_ON;

    wdgHandle = Watchdog_open(CONFIG_WATCHDOG_0, &wdgParams);

    if (!wdgHandle)
    {
        while (1)
            ;
    }

    uint32_t tickValue = Watchdog_convertMsToTicks(wdgHandle, 10000);
    Watchdog_setReload(wdgHandle, tickValue);

Void wdgCallback(UArg handle)
{
    SysCtrlSystemReset();
}

据我从文档中了解到的、看门狗会首先计数到零、然后重新加载计数器值、并在第二次倒计时到零时、MCU 应该会重新启动。 但是、这似乎没有任何效果。 我在回调中放置了一个断点、并使用"Memory"视图检查了 WDT 寄存器。 看门狗的寄存器似乎设置正确:控制寄存器的值为0x07 (NMI、复位启用、中断启用)、RIS 为0x01 (发生了超时事件)、MIS 为0x01 (发生了超时事件)。 即使这样、也不会发生我期望的电路板复位和代码重新启动。 如果我在调试时发生这种情况、我收到一个调试器断开连接的错误、但似乎不是真正的复位。

我还读到、在 NMI 上下文中调用 OS API 是不安全的、所以我在看门狗回调中尝试了另外两件事:while (1)循环和手动写入复位寄存器、如 SysCtrlSystemReset (HWREGBITW (AON_PMCTL_BASE + AON_PMCTL_O_RESETTL、AON_PMCTL_RESTL_SYSRN)= 1)。 这两种方法都不起作用。

我有一个两线程的程序、一个是 ZigBee 堆栈、另一个是我自己的线程、我在其上进行传感器测量并保持活动的 LED。 我可以告诉看门狗无法正常工作、因为我有一个 LED 在启动电路板时闪烁几次、还有一个活动 LED 每10秒闪烁一次。 启动指示灯不会亮起。 我从不复位看门狗、因此我希望电路板能够按照看门狗初始化过程中的配置每隔10秒进行一次自我复位。

我尝试了提供的看门狗示例、它能按预期正常运行、但那是一个单线程程序。 从 sys cfg 激活 watchdog0时、ZigBee 堆栈是否会检测它并自行清除看门狗?  

目前、我希望能够强制以固定的间隔执行电路板复位、但似乎不清除看门狗还不够。 使用 util_timer 调用 SysCtrlSystemReset 也不起作用。

在特定情况下、如何强制进行电路板复位?  

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

    您好!

    在待机模式下、看门狗不会进行节拍(仅在 Idle 或 Active 状态下进行节拍)。
    请参阅此处的相关帖子: https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/789856/cc2652r-using-watchdog-resets-in-standby-mode-instead-of-paused-as-described-in-the-datasheet

    在看门狗 SDK 示例中、当看门狗触发时、器件可能处于运行/空闲(非待机)状态。

    对于 Zigbee 示例、您是否正在使用 Zigbee 终端设备(zed)?
    如果是、则该器件将在其生命周期的大部分时间内保持待机状态、并且工作/空闲时间可能不足以触发10秒的看门狗超时。
    要防止待机状态用于测试看门狗, 您是否可以尝试像看门狗示例中所做的那样调用"Power_disablePolicy ();"? 这将保持看门狗滴答声。

    谢谢!
    Toby

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

    感谢您的答复!

    [报价用户 id="324727" url="~/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1464785/lp-cc2652rb-watchdog-not-resetting-mcu-when-using-bim/5619997 #5619997"]对于 Zigbee 示例、您使用的是 Zigbee 终端设备(zed)吗?

    是的! 我不知道这是一个重要的细节,因此我没有提到这一点。

    我做了更多测试、实际上、即使在调用回调时、MCU 也不会重新启动。 我设法通过使用计时器强制定期重启、因此这目前是有效的。

    然而、我是否需要从硬故障/不良状态中实际恢复、我能否实现这一点、同时在 MCU 正常工作期间允许 CPU 按预期睡眠? 根据我了解文档的情况、看门狗生成的中断是在 NMI 上下文中调用的、所以不能调用高级 API。 我已经尝试从看门狗中断打印到控制台、但它无法正常工作。 这是否也适用于 Power_disablePolicy?

    这是否有效、在中断中调用 Power_disablePolicy 并在其中输入 while (1)循环来强制重新启动是否足够?

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

    调用"SysCtrlSystemReset();"应该足以引起设备的重置。

    [报价 userid="509946" url="~/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1464785/lp-cc2652rb-watchdog-not-resetting-mcu-when-using-bim/5621905 #5621905"]然而、我是否需要从硬故障/不良状态中实际恢复?我能否在允许 CPU 在 MCU 正常工作期间按预期休眠的同时实现此目标?[/QUOT]

    对于此器件、看门狗不会在待机模式下计数、因为它源自未在待机模式下运行的 HF (高频时钟)。 计时器可以在待机模式下运行、因为它们依赖于 RTC (依赖于低频的实时时钟、低频时钟、在待机模式下进行节拍)、因此需要通过单独的机制来实现这一点(例如您使用计时器实现的功能)。

    我已尝试通过看门狗中断向控制台打印、但该操作无法正常使用

    这不起作用、因为打印输出(通常是 UART)驱动程序会在 RTOS 信标上挂起、无法在中断上下文中调用(通常不应在中断上下文中进行阻塞调用)。 如果您使用低级驱动程序调用(例如 UARTCharPutNonBlocking)、那么我认为打印会起作用。

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

    您好、Toby。 感谢您提供的信息、我已经成功地使用 SysCtrlSystemReset 和计时器重置了电路板。  

    关于 ZED 温度项目不再重新开始的其它问题:除了 ZigBee 堆栈、我还添加了另一个处理传感器测量的任务、我使用这些任务更新指针存储在属性定义中的变量(MS TEMP 测量值、MS hum 测量值)。 我是否始终需要在我的任务中使用信标来保护对变量的更新? 在没有任何并发保护的情况下更新变量是否安全?  

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

    您好!

    对不起我的延迟。

    通常、最好更新临界区内的变量、使 其在2个或多个线程/等之间同步

    如果不这样做、就始终存在读取/使用过时值的风险。 一些用例可以从容地处理这种情况、例如、如果温度  从24°C 变为26°C、但应用使用过时 的值24°C 或25°C、则实际运行可能仍然可以。

    谢谢!
    Toby