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: 可以进入低功耗模式却不能通过外部中断唤醒

Part Number: CC2538

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 A, C as a falling edge  */
  GPIOPowIntTypeSet(BSP_KEY_DIR_BASE, BSP_KEY_LEFT | BSP_KEY_RIGHT |
                    BSP_KEY_UP | BSP_KEY_DOWN, GPIO_POW_FALLING_EDGE);
  GPIOPowIntTypeSet(BSP_KEY_SEL_BASE, BSP_KEY_SELECT, GPIO_POW_FALLING_EDGE);
  //设置PB0、PC2、PC3可以唤醒
  GPIOPowIntTypeSet(GPIO_B_BASE,GPIO_PIN_0,GPIO_POW_FALLING_EDGE);
  GPIOPowIntTypeSet(GPIO_C_BASE,GPIO_PIN_2,GPIO_POW_FALLING_EDGE);
  GPIOPowIntTypeSet(GPIO_C_BASE,GPIO_PIN_3,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_DIR_BASE, BSP_KEY_LEFT | BSP_KEY_RIGHT | BSP_KEY_UP |
                   BSP_KEY_DOWN);
  GPIOPowIntEnable(BSP_KEY_SEL_BASE, BSP_KEY_SELECT);
 
    //设置PB0、PC2、PC3可以唤醒
    GPIOPowIntEnable(GPIO_B_BASE,GPIO_PIN_0);
    GPIOPowIntEnable(GPIO_C_BASE,GPIO_PIN_2);
    GPIOPowIntEnable(GPIO_C_BASE,GPIO_PIN_3);
}

/**************************************************************************************************
 * @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_DIR_BASE, BSP_KEY_LEFT | BSP_KEY_RIGHT | BSP_KEY_UP |
                   BSP_KEY_DOWN);
  GPIOPowIntDisable(BSP_KEY_SEL_BASE, BSP_KEY_SELECT);
 
    //禁止PB0、PC2、PC3喚醒中断
    GPIOPowIntDisable(GPIO_B_BASE,GPIO_PIN_0);
    GPIOPowIntDisable(GPIO_C_BASE,GPIO_PIN_2);
    GPIOPowIntDisable(GPIO_C_BASE,GPIO_PIN_3); 
}

/**************************************************************************************************
 * @fn          SysCtrlPowIntDisableSetting
 *
 * @brief       Clear the Power Interrupt registers
 *
 * input parameters
 *
 * @param       None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
void SysCtrlPowIntClear(void)
{
  GPIOPowIntClear(BSP_KEY_DIR_BASE, BSP_KEY_LEFT | BSP_KEY_RIGHT | BSP_KEY_UP |
                  BSP_KEY_DOWN);
  GPIOPowIntClear(BSP_KEY_SEL_BASE,BSP_KEY_SELECT);
 
    //清除PB0、PC2、PC3唤醒中断
    GPIOPowIntClear(GPIO_B_BASE,GPIO_PIN_0);
    GPIOPowIntClear(GPIO_C_BASE,GPIO_PIN_2);
    GPIOPowIntClear(GPIO_C_BASE,GPIO_PIN_3);   
}

/**************************************************************************************************
 * @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);
}

可以进入低功耗模式,却不能通过外部中断唤醒

  • 您好

    针对你提到的CC2538芯片进入低功耗模式后无法通过外部中断唤醒的问题,这里有一些可能的解决步骤和考虑因素:

    1. 检查外部中断配置‌:

      • 确保你已经正确配置了外部中断,包括中断触发方式(上升沿、下降沿或边沿触发)和中断优先级。
      • 检查NVIC(嵌套向量中断控制器)中是否已使能相应的外部中断向量。
    2. 低功耗模式配置‌:

      • 确认你的代码在进入低功耗模式前已经清除了所有外部中断的请求位(挂起寄存器)。
      • 检查电源控制寄存器(PWR_CR)的配置,确保LPDS位已正确设置以选择电压调节器的低功耗模式。
    3. 唤醒源‌:

      • 确认你的唤醒源是外部中断,而不是其他如RTC闹钟事件或NRST引脚上的外部复位。
      • 如果使用了WFI(等待中断)指令进入低功耗模式,确保任一外部中断线已设置为中断模式。
    4. 硬件连接‌:

      • 检查外部中断引脚与CC2538的连接是否正确,包括引脚号、电气特性和布线。
      • 确保外部中断信号在唤醒时能够正确触发CC2538的外部中断引脚。
    5. 软件调试‌:

      • 在进入低功耗模式前,添加调试语句或断点,以验证外部中断配置和低功耗模式配置的正确性。
      • 使用调试工具观察CC2538在进入低功耗模式后的行为,特别是外部中断引脚的电平变化。
    6. 查阅数据手册和参考手册‌:

      • 仔细查阅CC2538的数据手册和参考手册,特别是关于低功耗模式和外部中断唤醒的部分。
      • 这将帮助你更好地理解CC2538的低功耗模式行为和如何正确配置外部中断唤醒。
    7. 硬件问题‌:

      • 如果以上步骤都无法解决问题,可能需要考虑硬件故障的可能性。
      • 检查CC2538芯片本身是否存在问题,或者与外部中断相关的硬件电路是否存在故障。

    https://www.ti.com.cn/cn/lit/ug/swru319c/swru319c.pdf

    这是官方给出的指导书,您可以参考这个说明配置中断。