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.

[参考译文] CC1310:看门狗问题

Guru**** 2482155 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1234189/cc1310-watchdog-issue

器件型号:CC1310

大家好、

使用 simplelink_cc13x0_sdk_2_20_00_38、将看门狗设置为8S、并在回调中直接调用复位 API。 仅创建了一个任务、在此任务中单独测试了两段代码、但会显示不同的结果:  

1.  

void watchdogCallback (uintptr_t 未使用)

 debug_uart_send_u8 (0xcc);
 SysCtrlSystemReset();
}

void UserFxn (UArg arg0、UArg arg1)

 WATCHDOG_PARAMS 参数;
 watchdog_init();
 /*创建并启用禁用复位的看门狗*/
 WATCHDOG_PARAMS_INIT (&params);
 params.callbackFxn =(Watchdog_Callback)看门狗回调;
 params.resetMode = Watchdog_reset_on;
 WatchdogHandle = Watchdog_open (Board_WATCHDOG0、&params);

 while (1)

 {

   Task_sleep (1000000);//10s

 }

}

在串行端口上打印8S 测试结果时、进入看门狗回调并复位。  

2.上述看门狗配置不变,创建一个计时器并使用信标阻止进入睡眠状态。  

while (1)

 ClockP_setTimeout (clockp_handle1、1000000);//单位:10us

 //启动计时器  
 ClockP_start (clockp_handle1);

  //挂起等待计时器进入睡眠状态的时间  
 Semaphore_pend (semaphore_handle (&SemStructurt)、BIOS_wait_forever);//任务阻断  

}

测试结果 是没有看门狗回调。  

为什么会这样? 您能帮助检查这个问题吗? 谢谢。

此致、

樱桃

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

    您能否以最新的 SDK (4_20)为起点、然后使用看门狗示例?

    为我提供两个 watchdog.c 文件、我可以在 LP 上测试它们、并说明您遇到的问题。 这样、我就能获得资源、我测试/实现方式与您相同。

    为什么要  在 看门狗设置为执行复位( params.resetMode = Watchdog_reset_on)时的回调中执行 SysCtrlSystemReset ()?

    Siri.

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

    尊敬的 Siri:

    感谢您的支持。

    为什么要执行  SysCtrlSystemReset();在 将看门狗设置为执行复位的回调中( params.resetMode = Watchdog_reset_on)?

    由于复位需要两个周期、因此第二个周期始终进入看门狗回调、客户在第一次进入回调时对其进行复位。  

    为我提供两个 watchdog.c 文件,我可以在我们的 LP 上测试这些文件,以阐明您看到的问题。 这样,我就可以根据您的情况进行测试/实施。

    请查看代码:

    #include <stdbool.h>
    #include <stdint.h>
    #include <stddef.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/Watchdog.h>
    /* Example/Board Header files */
    #include "Board.h"
    #include <ti/devices/cc13x0/driverlib/sys_ctrl.h>
    Watchdog_Handle WatchdogHandle;
    /*
     *  ======== watchdogCallback ========
     *  Watchdog interrupt callback function.
     */
    void watchdogCallback(uintptr_t unused)
    {
        /* Clear watchdog interrupt flag */
    
        SysCtrlSystemReset();
    
     //   watchdogExpired = true;
    
        /* Insert timeout handling code here. */
    }
    
    /*
     *  ======== mainThread ========
     */
    void UserWatchDog_Init()
    {
        Watchdog_Params params;
        Watchdog_init();
        /* Create and enable a Watchdog with resets disabled */
        Watchdog_Params_init(&params);
        params.callbackFxn = (Watchdog_Callback)watchdogCallback;
        params.resetMode = Watchdog_RESET_ON;
        WatchdogHandle = Watchdog_open(Board_WATCHDOG0, &params);
    }

    谢谢。此致、

    樱桃

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

    首先、您需要知道看门狗未在待机模式下运行。

    其次、 当您将看门狗配置为执行复位时、您不应该是 SysCtrlSystemReset。

    我已获取您的代码、但添加了一些 LED 闪烁:

    #include <stdbool.h>
    #include <stdint.h>
    #include <stddef.h>
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/Watchdog.h>
    #include "Board.h"
    #include <ti/devices/cc13x0/driverlib/sys_ctrl.h>
    #include <ti/sysbios/knl/Task.h>
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/Power.h>
    
    uint32_t        reloadValue;
    
    Watchdog_Handle WatchdogHandle;
     void UserWatchDog_Init();
    
    void watchdogCallback(uintptr_t unused)
    {
        GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_ON);
    }
    
    void *mainThread(void *arg0)
    {
        GPIO_init();
        GPIO_setConfig(Board_GPIO_LED0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(Board_GPIO_LED1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_OFF);
        GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_OFF);
    
        Task_sleep(10000); 
    
        GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON);
        GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_ON);
    
        Task_sleep(10000); 
    
        GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_OFF);
        GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_OFF);
    
        Task_sleep(10000); 
    
        GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON);
        GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_ON);
    
        Task_sleep(10000); 
    
        GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_OFF);
        GPIO_write(Board_GPIO_LED1, Board_GPIO_LED_OFF);
    
        Task_sleep(10000); 
    
        Watchdog_Params params;
        Watchdog_init();
    
        /* Create and enable a Watchdog with resets disabled */
        Watchdog_Params_init(&params);
        params.callbackFxn = (Watchdog_Callback)watchdogCallback;
        params.resetMode = Watchdog_RESET_ON;
        WatchdogHandle = Watchdog_open(Board_WATCHDOG0, &params);
    
        reloadValue = Watchdog_convertMsToTicks(WatchdogHandle, 800); // 800 ms
    
        if (reloadValue != 0) {
            Watchdog_setReload(WatchdogHandle, reloadValue);
        }
    
        // Power_disablePolicy();
    
        while(1)
        {
            Task_sleep(100000); //1 s
            Watchdog_clear(WatchdogHandle);
    
            GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON);
            Task_sleep(1000); 
            GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_OFF);
            Task_sleep(1000);
            GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON);
            Task_sleep(1000); 
            GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_OFF);
            Task_sleep(1000); 
        }
    }
    
    void UserWatchDog_Init()
    {
        Watchdog_Params params;
        Watchdog_init();
        /* Create and enable a Watchdog with resets disabled */
        Watchdog_Params_init(&params);
        params.callbackFxn = (Watchdog_Callback)watchdogCallback;
        params.resetMode = Watchdog_RESET_ON;
        WatchdogHandle = Watchdog_open(Board_WATCHDOG0, &params);
    }

    如果不使用"Power_disablePolicy ();"、器件将进入待机状态、并且您将永远不会获得回调(或重置器件):

    包括"Power_disablePolicy ();"、您将看到设备 正在正确复位。

    Siri.

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

    尊敬的 Siri:

    这是否意味着 Task_sleep 不会立即进入 STANDBY 模式?  

    谢谢。此致、

    樱桃

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

    Task_sleep();仅当允许时才会使设备进入待机状态(默认情况下允许)。

    这意味着如果您添加 Power_disablePolicy();,即使您调用  Task_sleep(),也不会进入待机状态;

    在这种情况下、WD 将始终运行并按预期工作。

    Siri.