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: 看门狗

Part Number: CC1310

我遇到一个问题,使用simplelink_cc13x0_sdk_2_20_00_38,看门狗设置为8S,并且直接在回调里调用复位API。只创建了一个任务,并且在这个任务里分别测试了两段代码,但是有不同的结果。

一:

void watchdogCallback(uintptr_t unused)
{
  debug_uart_send_u8(0xcc);
  SysCtrlSystemReset();
}

void UserFxn(UArg arg0, UArg arg1)

{

  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);

  while(1)

  {

    Task_sleep(1000000);//10s

  }

}

通过串口打印测试结果为8S的时候会进看门狗回调并复位。

二:上述看门狗配置不变,创建一个定时器,改用信号量阻塞来实现休眠。

while(1)

{

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

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

  // 挂起等待定时器时间到 休眠
  Semaphore_pend(Semaphore_handle(&SemStruct), BIOS_WAIT_FOREVER);//任务阻塞

}

二的测试结果是不会进看门狗回调。

请问这是为什么。

  • 您好,您的问题我们升级到英文论坛看下,有答复尽快给您。

  • 您试着使用最新的 SDK (4_20),然后使用看门狗示例着手再进行测试?

    还请提供两个我们可以在 LP 上测试的 watchdog.c 文件(这些文件可以说明您看到的问题)。 这样我们的专家可以根据自己的情况进行测试/实施。

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

  • 测试代码,因为复位需要两个周期,第二个周期内会一直进入看门狗回调,我这边就在第一次进入回调的时候进行复位。

    UserWatchDog.c
    #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);
    }
    

  • 首先您需要注意看门狗并未在standby模式下运行。 其次,当配置看门狗执行重置时,不应使用 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();",设备将进入待机状态,您将永远不会收到回调(或reset设备):

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

  • 也就是说Task_sleep并不会进入standby模式是吗

  • Task_sleep();只有在允许时才会使器件进入standby状态(默认情况下是允许的)。 这意味着如果添加 Power_disablePolicy(),即使调用 Task_sleep(),也不会将您置于standby状态。在这种情况下,WD 将始终运行并按预期工作。