请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CC2640 我们有一个应用将 BLE 堆栈配置为每200ms 广播一次。 在添加启用看门狗计时器的代码之前、只要器件已通电、器件就会正确广播。 启用看门狗计时器后、我们看到器件会在大约20分钟后停止广播、堆栈不会生成任何事件。 我们知道看门狗实现似乎设置正确、因为我们可以通过在应用中检测无限循环来强制看门狗超时。 我们还注意到、如果我们禁用睡眠模式、广播不会停止。 我们通过执行 我们在 PowerCC26XX_AK_STANDBY_Late 事件发生时向电源模块注册的函数来"宠物"看门狗计时器。 是否有什么想法会导致这种行为?
驱动看门狗计时器的代码如下(请注意、如果我们将看门狗计时器配置为使用 NMI 或常规 INT、则会发生相同的行为):
#include #include #include #include #include ==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== * 定义*=================================================================================================================================================================================================== /*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ // #define WDT_TIMEOUT_MS_DEFAULT (5000UL) /*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ * 全局变量*======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== /*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ */ 静态看门狗 CC26XX_Object WDT_object; /*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ */ static Watchdog_handle WDT_handle = NULL;/*=========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== */ 静态 const WatchdogCC26XX_HWAttrs WDT_attrs ={ WDT_BASE、 INT_NMI_FAULT、 WDT_TIMEOUT_MS_DEFAULT };/*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== */ const uint_least8_t Watchdog_count = 1; /*=================================================================================================================================================== 驱动程序使用的*//*全局配置结构*/ const Watchdog_Config Watchdog_config[]={ { fxnTablePtr =&WatchdogCC26XX_fxnTable、 .object = WDT_object (&W)、 hwAttrs =&WDT_ATTRS、 }、 {NULL、NULL、NULL}、 }; /=========================================================================================================================================================================================================================================================================================================================================================================================================================== */ Power_NotifyObj WDT_powerNotifyObj; /*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ * 局部函数 =========================================================================================================================================== /*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ // 静态 void WDT_callbackFxn (uintptr_t args) { /*这是在 WDT 中断触发时被调用的函数。 *当然、这种情况绝不会发生、因此如果发生、只需进行记录 *异常级别错误并重置设备。 * logCode ( ERROR_WDT_TIMEOUT ); 返回; }/*======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== // static int wDT_powerNotifyFxn (unsigned int eventType、uintptr_t eventArg、uintptr_t clientArg) { /*只要设备从睡眠状态唤醒,就会调用此函数。 *只需携带 WDT 计时器。 * WDT_PE(); 返回 Power_NOTIFYDONE; }/==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== * 公共函数 *======================================================================================================================================================== /*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ // void WDT_init (void) { Watchdog_Params 参数; Watchdog_init(); Watchdog_Params_init (params); params.callbackFxn = WDT_callbackFxn; WDT_Handle = Watchdog_open (0,params); assert( WDT_Handle != NULL ); /*在 Watchdog_open 中,看门狗驱动程序库将其设置为 NMI,但它是这样 *似乎未正确插入矢量表的 NMI 条目。 *以下代码执行该操作。 * Hwi_plug (INT_NMI_FAULT、(void *) WDT_callbackFxn); /*注册接收从睡眠状态唤醒的通知*/ power_registerNotify (&WDT_powerNotifyObj、PowerCC26XX_WAK_STANDBY_Late、WDT_powerNotifyFxn、0); /*使用默认超时值启动 WDT */ WDT_PE(); }/=================================================================================================================================================================================================== // void WDT_pet (void) { Watchdog_clear( WDT_Handle ); }