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.

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里面也应该喂狗