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.

[参考译文] CC2538:唤醒中断后器件复位

Guru**** 2457340 points
Other Parts Discussed in Thread: Z-STACK

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1405451/cc2538-device-resets-after-wakeup-interrupt

器件型号:CC2538
Thread 中讨论的其他器件:Z-stack

工具与软件:

您好!

我正在尝试配置一些引脚以唤醒器件。 但是、当这三个引脚中的两个(BSP_KEY_1、BOARD_SWITCH_NC_PIN)被触发时、看门狗会有时触发、而不是始终触发

为什么会发生这种情况?  

以下是 hal_sys_ctrl.c 文件的代码及其配置

Filename:       hal_sys_ctrl.c

/**************************************************************************************************
 * @fn          SysCtrlWakeupSetting
 *
 * @brief       Setup which peripherals can/cannot wakeup the processor
 *
 * input parameters
 *
 * @param       None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
void SysCtrlWakeupSetting(void)
{ 
  /* GPIO A, C and SM Timer can wake up the processor */
  GPIOIntWakeupEnable(GPIO_IWE_PORT_A);
  GPIOIntWakeupEnable(GPIO_IWE_PORT_B);
  GPIOIntWakeupEnable(GPIO_IWE_PORT_C);
  GPIOIntWakeupEnable(GPIO_IWE_PORT_D);
  GPIOIntWakeupDisable(GPIO_IWE_USB);
  GPIOIntWakeupEnable(GPIO_IWE_SM_TIMER);
  
  /* Setup GPIO B as a falling edge  */
  GPIOPowIntTypeSet(BSP_KEY_BASE, BSP_KEY_1, GPIO_POW_FALLING_EDGE);
  GPIOPowIntTypeSet(BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN, GPIO_POW_FALLING_EDGE);
  GPIOPowIntTypeSet(I2C_INT_BASE, I2C_GPIO_PIN, GPIO_POW_FALLING_EDGE);
}

/**************************************************************************************************
 * @fn          SysCtrlPowIntEnableSetting
 *
 * @brief       Enable power-up interrupt for the specified port, using 
 *              GPIO_PI_IEN register
 *
 * input parameters
 *
 * @param       None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
void SysCtrlPowIntEnableSetting(void)
{
  GPIOPowIntEnable(BSP_KEY_BASE, BSP_KEY_1);
  GPIOPowIntEnable(BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN);
  GPIOPowIntEnable(I2C_INT_BASE, I2C_GPIO_PIN);
}

/**************************************************************************************************
 * @fn          SysCtrlPowIntDisableSetting
 *
 * @brief       Disable power-up interrupt for the specified port, using 
 *              GPIO_PI_IEN register
 *
 * input parameters
 *
 * @param       None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
void SysCtrlPowIntDisableSetting(void)
{
  GPIOPowIntDisable(BSP_KEY_BASE, BSP_KEY_1);
  GPIOPowIntDisable(BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN);
  GPIOPowIntDisable(I2C_INT_BASE, I2C_GPIO_PIN);
}

/**************************************************************************************************
 * @fn          SysCtrlPowIntDisableSetting
 *
 * @brief       Clear the Power Interrupt registers
 *
 * input parameters
 *
 * @param       None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
void SysCtrlPowIntClear(void)
{
  GPIOPowIntClear(BSP_KEY_BASE, BSP_KEY_1);
  GPIOPowIntClear(BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN);
  GPIOPowIntClear(I2C_INT_BASE, I2C_GPIO_PIN);
}

/**************************************************************************************************
 * @fn          SysCtrlClockStartupSetting
 *
 * @brief       Setup clock startup sequence
 *
 * input parameters
 *
 * @param       None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
void SysCtrlClockStartSetting(void)
{
  /* Setup the clock startup sequence to 32 MHz external 
   * osc and 32k sourced from external oscillator
   */
  IOCPadConfigSet(GPIO_D_BASE, 0xC0, IOC_OVERRIDE_ANA);
  SysCtrlClockSet(OSC_32KHZ, false, SYS_CTRL_SYSDIV_32MHZ);
}

#define BSP_KEY_BASE            GPIO_B_BASE     //!< Common key Base
#define BSP_KEY_1               GPIO_PIN_3      //!< PB3 Common key 1

#define PUSH_BTN_1_PIN_INIT()                                     \
{                                                                 \
  /* Configure button  as input */                                \
  GPIOPinTypeGPIOInput(BSP_KEY_BASE, BSP_KEY_1);                  \
  IOCPadConfigSet(BSP_KEY_BASE, BSP_KEY_1, IOC_OVERRIDE_PUE);     \
}

#define PUSH_BTN_1_INITIALIZE_INTERRUPT(_cb)                      \
{                                                                 \
  GPIOPinIntClear(  BSP_KEY_BASE, BSP_KEY_1 );                    \
  GPIOPinIntEnable( BSP_KEY_BASE, BSP_KEY_1 );                    \
  ioPinIntRegister( BSP_KEY_BASE, BSP_KEY_1, _cb );               \
  GPIOIntTypeSet(   BSP_KEY_BASE, BSP_KEY_1, GPIO_FALLING_EDGE);  \
}

#define BOARD_SWITCH_NC_BASE            GPIO_A_BASE
#define BOARD_SWITCH_NC_PIN             GPIO_PIN_7

#define SWITCH_NC_PIN_INIT()                                     \
{                                                                 \
  GPIOPinTypeGPIOInput(BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN);                  \
  IOCPadConfigSet(BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN, IOC_OVERRIDE_PUE);     \
}

#define SWITCH_NC_PIN_INTERRUPT(_cb)\
{\
  GPIOPinIntClear( BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN );\
  GPIOPinIntEnable( BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN );\
  ioPinIntRegister( BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN, _cb );\
  GPIOIntTypeSet( BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN, GPIO_FALLING_EDGE );\
}

#define I2C_INT_BASE   GPIO_C_BASE
#define I2C_GPIO_PIN   GPIO_PIN_6

#define I2C_PIN_INIT()\
{ \
  GPIOPinTypeGPIOInput(I2C_INT_BASE, I2C_GPIO_PIN);\
    IOCPadConfigSet(I2C_INT_BASE, I2C_GPIO_PIN, IOC_OVERRIDE_PUE); \
}

#define I2C_INITIALIZE_INTERRUPT(_cb)                       \
{                                                                       \
  GPIOPinIntClear( I2C_INT_BASE, I2C_GPIO_PIN );                        \
    GPIOPinIntEnable( I2C_INT_BASE, I2C_GPIO_PIN );                       \
      ioPinIntRegister( I2C_INT_BASE, I2C_GPIO_PIN, _cb );                  \
        GPIOIntTypeSet(   I2C_INT_BASE, I2C_GPIO_PIN, GPIO_FALLING_EDGE);     \
           IntPrioritySet(INT_GPIOC, HAL_INT_PRIOR_KEY);\
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Panagiotis、

    能否提供更多代码、例如回调和看门狗使用?  另外、您使用什么代码资源?  GPIO 中断示例可能已经存在、您可以将其用作参考。  根据您的说明、似乎正在进入回调、但可能存在涉及及时清除看门狗或错误地清除中断标志的竞态条件。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如果不通过设置中断来唤醒器件(删除 hal_sys_ctrl.c 中的相应代码)、那么在触发中断时看门狗没有任何问题。

    我使用的是 Zigbee 1.2.2a

    我在每个事件循环函数开始时清除看门狗。 我尝试在设备唤醒后清除它、但它无法正常工作


    下面是一个回调示例

    #define SWITCH_NC_PIN_CLEAR_INT() GPIOPinIntClear( BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN );
    
    void TamperSwitchNCISR(void)
    {
      SWITCH_NC_PIN_CLEAR_INT();
      GPIOPowIntClear(BOARD_SWITCH_NC_BASE, BOARD_SWITCH_NC_PIN);
      
    /* do stuff */
      
      CLEAR_SLEEP_MODE();
      
      return;
    }
    
    #define PUSH_BTN_1_CLEAR_ISR()  GPIOPinIntClear( BSP_KEY_BASE, BSP_KEY_1 ) 
    
    void HandleKey_1_ISR(void)
    {
      // Clear Interrupt status
      PUSH_BTN_1_CLEAR_ISR();
      GPIOPowIntClear(BSP_KEY_BASE, BSP_KEY_1);
    
    /* do stuff */
      
      CLEAR_SLEEP_MODE();
    
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您不必更改 Zigbee HA 1.2.2a 资源的 hal_sys_ctrl.c 中的任何内容。  如果您想要休眠 ZED、可按照《Z-Stack Home 开发人员指南》中的说明选择 power_saving 预定义来进行此配置。  

    休眠器件不会定期进入事件循环、这可能会导致看门狗计时器到期。  您可以设置一个能够可靠地调用看门狗的计时器。  我还建议您使 GPIO 中断线程安全、并且尽可能少做、以便应用程序可以按预期继续运行。

    我还建议您在 IAR 中进行进一步调试、以确定器件复位的确切原因。

    此致、
    Ryan