微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > cc2530 zha1.2 看门狗 如何使用

cc2530 zha1.2 看门狗 如何使用

时间:10-02 整理:3721RD 点击:

为防止协调器出现死机现象 采用看门狗进行喂狗

TI的zha1.2标准协议栈   是否有固定的api 供我们调用?

我预编译了    WDTIMX

if ( (zclSampleLight_NwkState == DEV_ZB_COORD) ||
(zclSampleLight_NwkState == DEV_ROUTER) ||
(zclSampleLight_NwkState == DEV_END_DEVICE) )
{
#ifdef WDT_IN_PM1                   //状态改变   清除
WDCTL = 0xa0;
WDCTL = 0x50;
osal_start_timerEx( zclSampleLight_TaskID, SAMPLELIGHT_WATCHDOG_EVT,800);
#endif

}

#ifdef WDT_IN_PM1
if ( events & SAMPLELIGHT_WATCHDOG_EVT )
{
HalLedSet(HAL_LED_ALL,HAL_LED_MODE_TOGGLE);
WDCTL = 0xa0;
WDCTL = 0x50;
osal_start_timerEx( zclSampleLight_TaskID, SAMPLELIGHT_WATCHDOG_EVT,800);
return ( events ^ SAMPLELIGHT_WATCHDOG_EVT );
}

问题:这样给 其喂狗正确么  

           如果正确 为什么还经常重新复位

/* WATCHDOG TIMER DEFINITIONS */
// WDCTL bit definitions

#define WDINT0     0x01  // Interval, bit0
#define WDINT1     0x02  // Interval, bit1
#define WDINT      0x03  // Interval, mask
#define WDMODE     0x04  // Mode: watchdog=0, timer=1
#define WDEN       0x08  // Timer: disabled=0, enabled=1
#define WDCLR0     0x10  // Clear timer, bit0
#define WDCLR1     0x20  // Clear timer, bit1
#define WDCLR2     0x40  // Clear timer, bit2
#define WDCLR3     0x80  // Clear timer, bit3
#define WDCLR      0xF0  // Clear timer, mask

// WD timer intervals
#define WDTISH     0x03  // Short: clk * 64
#define WDTIMD     0x02  // Medium: clk * 512
#define WDTILG     0x01  // Long: clk * 8192
#define WDTIMX     0x00  // Maximum: clk * 32768

// WD clear timer patterns
#define WDCLP1     0xA0  // Clear pattern 1
#define WDCLP2     0x50  // Clear pattern 2


/* WATCHDOG TIMER DEFINITIONS */
#define WatchDogEnable(wdti)              \
{                                         \
  WDCTL = WDCLP1 | WDEN | (wdti & WDINT); \
  WDCTL = WDCLP2 | WDEN | (wdti & WDINT); \
}

#define WatchDogFeed()              \
{                                         \
  WDCTL = WDCLP1; \
  WDCTL = WDCLP2; \
}

使用方法;

 // Start watchdog
  WatchDogEnable(WDTIMX);  

然后要喂狗的地方调用

WatchDogFeed()    

喂狗超时时间有4个选择, 而且最好在OSAL主循环的地方喂狗:

void osal_start_system( void ) { #if !defined ( ZBIT ) && !defined ( UBIT )   for(;;)  // Forever Loop #endif   {     osal_run_system();   } }

 

我设置的是在主循环的地方喂狗,然后我的所有按键都只能使用一次,

我不加看门狗的时候,按键可以一直使用,

建议在hal poll里面喂狗,另外UART Read里面也应该喂狗

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top