TI中文支持网
TI专业的中文技术问题搜集分享网站

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);//任务阻塞

}

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

请问这是为什么。

Cherry Zhou:

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

,

Cherry Zhou:

您试着使用最新的 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);
}

,

Cherry Zhou:

首先您需要注意看门狗并未在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_treloadValue;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 msif (reloadValue != 0) {Watchdog_setReload(WatchdogHandle, reloadValue);}// Power_disablePolicy();while(1){Task_sleep(100000); //1 sWatchdog_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模式是吗

,

Cherry Zhou:

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

赞(0)
未经允许不得转载:TI中文支持网 » CC1310: 看门狗
分享到: 更多 (0)