cc2530 zha1.2 看门狗 如何使用
为防止协调器出现死机现象 采用看门狗进行喂狗
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里面也应该喂狗