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.

[参考译文] CC3235SF:WDT 重置问题

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1616188/cc3235sf-wdt-resetting-problem

器件型号: CC3235SF

当系统上的电源启用策略处于活动状态时、一个空闲任务正在运行。 系统进入和退出此过程、我可以通过示波器上的引脚 47 进行监控。 但是、经过一段不确定的时间(有时是 1 分钟、有时是 1 天)后、系统将完全冻结。 禁用电源启用策略时、它不会执行此操作。 主要问题是 WDT 在此类冻结期间不会激活和复位系统的原因。 由于此问题、我无法在现场部署设备。 无论我做什么、我都无法解决这些问题。 请提供帮助。

以下是我的 WDT 代码:

Watchdog_Handle wdtHandle;

Watchdog_Params wdtParams;

/*======================================================== */  
/*硬件看门狗初始化*/  
/*======================================================== */  
watchdog_init ();  
Watchdog_Params_(&wdtParams);  
wdtParams.resetMode = Watchdog_reset_on;  
wdtParams.debugStallMode = WATCHDOG_DEBUG_STALL_OFF;  

wdtHandle = Watchdog_open (CONFIG_WATCHDOG_0、&wdtParams);  
如果 (wdtHandle == NULL){  
/* WDT 失败 — 硬件危机,最深的重置*/  
System_Deep RecoveryReset();  
}

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

    您好:

    使用 7.10.00.13 SDK 中的看门狗示例、我启用了电源策略、尽管用于使看门狗过期的按钮可将器件从睡眠状态唤醒、但看门狗仍能正常工作并复位器件。 您可以尝试类似的设置吗?

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

    是的、我尝试过、但它不起作用。 当电源使能策略处于活动状态时、器件会在未指定的时间后冻结、并完全无响应。 我认为 WDT 应该在这种情况下恢复系统、但它无法恢复。 当我没有电源启用策略时、不会出现此问题。 此外、当我调用电源禁用策略时、系统会给出相同的响应、似乎再次冻结。 在参考设计中、当我查看连接到引脚 45-46 的线圈的信号时、通常会得到 0.3V 到 3.3V 之间的方波、但在死机时没有得到这种信号。 另外、在引脚 47 上、通常可以获得恒定的 3.3V 电压、但在死机时没有得到这种电压。 但是、稳压器和处理器电源中仍然存在 3.3V 电压。

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

    调用电源使能策略后、我使用创建一个无限循环while来测试 WDT、并且系统会无限期冻结。

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

    您的设置是否类似这样?

    power_enablePolicy();

    while (1);

    在这里、您正在等待 WDT 触发?

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

    不是很像,但是很相似。 我这样做是为了尝试 WDT 租赁服务。

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

    您能告诉我您的项目设置吗?

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

    void *sleepTask(void *arg0){
    (void) arg0;

    /*最初的短暂延迟 — 等待系统准备就绪*/
    TASK_SLEEP (5000);/*等待 5 秒*/

    while (1){
    Heartbeat_Kick (TASK_IDX_SLEEP);

    /*进入 LPDS 所需的条件*/
    if (is_Connected (Network_if_StatusGet ()&&)&&
    IS_IP_ACQUIRED (Network_if_StatusGet ()&&
    System.System.Taramaflag State_Get ()== 1 && System.System.Postflag State_Get ()== 0 &&
    State_Get System.Httpstart()== 1 && State_Get System.I2ccontrol()== 1 &&
    Systemm System.Otaflagstart()== 0 && State_Get System.Appmode()== State_Get 0){

    /*满足条件 — 进入 LPDS */
    enterLPDSMode();

    /*从 LPDS 唤醒后的短暂等待*/
    /*处理 HTTP 请求时、系统保持活动状态*/
    }其他{
    /*不满足条件 — 正常运行*/
    }
    TASK_SLEEP (10000);

    }

    返回 NULL;
    }

    static int prepareForLPDS (void){
    /*必须已禁用 I2C(在 controlTask 中完成)*/
    /* GPIO 引脚必须已处于正确的模式*/

    /*启用电源策略(仅一次)*/
    if(!LPDS_ENABLED){
    power_enablePolicy();
    LPDS_ENABLED = TRUE;
    Display_printf (display、0、0、“[LPDS]电源策略已启用“);
    }

    返回 0;
    }

    /**
    *@短暂进入 LPDS 模式
    *@详细说明系统进入 LPDS 模式。 它会在 HTTP 请求到达时自动唤醒。
    * LPDS 消耗~电流的 1mA、仅 NWP 工作。
    *@请注意、当 HTTP 请求到达时、SimpleLink 会自动唤醒系统。
    *@请注意、当 HTTP 服务器处于运行状态时、NWP 已在运行、因此不需要 sl_Start。
    */
    void enterLPDSMode (void){
    /* LPDS 准备*/
    如果 (prepareForLPDS()< 0){
    DISPLAY_printf (DISPLAY_0、0、“[LPDS]准备失败“);
    /*准备失败 — 更新一致性标志*/
    返回;
    }
    }

    void *systemMonitorTask(void *arg0){
    (void) arg0;/*未使用的参数*/
    uint32_t reloadValue;

    Watchdog_Handle wdtHandle;
    Watchdog_Params wdtParams;

    /*======================================================== */
    /*硬件看门狗初始化*/
    /*======================================================== */
    watchdog_init ();
    Watchdog_Params_(&wdtParams);
    wdtParams.resetMode = Watchdog_reset_on;
    wdtParams.debugStallMode = WATCHDOG_DEBUG_STALL_OFF;

    wdtHandle = Watchdog_open (CONFIG_WATCHDOG_0、&wdtParams);
    如果 (wdtHandle == NULL){
    /* WDT 失败 — 硬件危机,最深的重置*/
    System_Deep RecoveryReset();
    }
    g_wdtHandleForTimer = wdtHandle;

    /*启动基于计时器的辅助 WDT — 通过硬件中断进行 WDT 馈送*/

    Timer_Handle feederHandle;
    Timer_Params feederParams;
    timer_init();
    Timer_Params_(&feederParams);
    feederParams.timerMode = Timer_CONTINUAL_CALLBACK;
    feederParams.periodUnits = Timer_PERIOD_US;
    feederParams.period =(uint32_t) SYSMON_WDT_INPUT_TIMER_MS * 1000U;
    feederParams.timerCallback = WdtFeederTimerCallback;
    feederHandle = Timer_OPEN (CONFIG_TIMER_0、&feederParams);
    if (feederHandle == NULL){
    /*无法打开计时器 — 将再次从 systemMonitorTask 执行 WDT 馈送*/
    G_wdtHandleForTimer = NULL;
    g_wdtFeederTimerHandle = NULL;
    }其他{
    g_wdtFeederTimerHandle = feederHandle;
    INT_fast16_t tstat = Timer_START (feederHandle);
    if (tstat!= Timer_STATUS_SUCCESS){
    timer_close (feederHandle);
    G_wdtHandleForTimer = NULL;
    g_wdtFeederTimerHandle = NULL;
    }
    }
    }

    /*
    *看门狗重新加载值在过程中被初始化
    * watchdog_open() 调用。 也可以是重新加载值
    *在运行时动态设置。
    *
    *将 TIMEOUT_MS 转换为看门狗时钟周期。
    *此 API 不适用于所有设备。
    *请参阅特定于设备的看门狗驱动程序文档
    *用于您的设备。
    */
    reloadValue = Watchdog_convertMsToTicks (wdtHandle、WDTTIME);

    /*
    *零值 (0) 表示转换后的值超过 32 位
    *或者该 API 不适用于此特定设备。
    */
    如果 (reloadValue !=0){
    watchdog_setReload (wdtHandle、reloadValue);
    }
    /*======================================================== */
    /*启动心跳系统*/
    /*======================================================== */
    Heartbeat_Init ();
    GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
    GPIO_setConfig (LED、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
    GPIO_setConfig (LED2、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
    GPIO_WRITE (CONFIG_GPIO_LED_0、0);
    GPIO_WRITE (LED、0);
    GPIO_WRITE (LED2、0);
    TASK_SLEEP (1000);
    //
    GPIO_WRITE (CONFIG_GPIO_LED_0、1);
    TASK_SLEEP (1000);
    GPIO_WRITE (CONFIG_GPIO_LED_0、0);
    GPIO_WRITE (LED、0);
    GPIO_WRITE (LED2、0);
    Task_sleep (2000);
    /*======================================================================== */
    /* LPDS 安全网:进入 LPDS 之前需要立即唤醒 RTC */
    /*(WDT 在 LPDS 下不工作;冻结=不从 LPDS 中唤醒的风险)*/
    /*======================================================================== */(void) Power_registerNotify (&g_lpdsSafetyNetNotify、
    (UINT_fast16_t) PowerCC32XX_Entering_LPDS、
    电源 Notify_Entering LPDS、(uintptr_t) 0);

    /* LPDS 退出通知*/
    静态 Power_Notify 对象 lpdsWakeNotify;
    POWER_registerNotify (&lpdsWakeNotify、PowerCC32XX_Awake_LPDS、
    电源 Notify_Awake LPDS、(uintptr_t) 0);
    /*========================================================================= */
    /*主监控循环 — 最小且安全*/
    /*======================================================================== */

    静态 uint32_t loopCount = 0;

    while (1){
    /*---------------------------------------------------------------------------------------- */
    /* A.安全网 — 在 SYSMON_SAFETY_NET_REFRELATE_SEC 中刷新一次警报
    */
    /*---------------------------------------------------------------------------------------- */


    /*---------------------------------------------------------------------------------------- */
    /* B.心跳和运行状况检查*/
    /*---------------------------------------------------------------------------------------- */
    Heartbeat_Check stuckTask = ALL();

    if (stuckTask >= 0){
    System_Deep RecoveryReset();
    }

    /*---------------------------------------------------------------------------------------- */
    /* B2. HTTP 请求超时(必须在请求到达后的 60 秒内结束)
    */
    /*---------------------------------------------------------------------------------------- */
    If (System.HttpRequestActive() State_Get &   

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

    我将详细介绍。 谢谢。

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

    系统的工作方式大致如下:进入 LPDS 后、当我在任意位置添加一个 while 循环时、WDT 不会复位。

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

    您能找出原因吗?

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

    计时器中断会不断馈送看门狗、因此即使您卡在某个位置、看门狗也会不断馈送、因此不复位。

    这与 TI 看门狗示例不同、在该示例中、只有主循环清除看门狗、但按下按钮会卡在 GPIO ISR 的 while 循环中、并且不馈送看门狗、因此看门狗计时器将递减计数然后复位。