芯源半导体CW32
直播中

王健

8年用户 1033经验值
私信 关注
[问答]

CW32L083低功耗项目休眠后无法唤醒怎么解决?

配置STOP模式后GPIO中断唤醒失效,RTC闹钟唤醒倒是正常,电路设计遵循了手册建议,求排查思路...

回帖(1)

京五环以外

2025-11-28 18:11:57

针对CW32L083在STOP模式下GPIO中断唤醒失效的问题(RTC唤醒正常),结合常见陷阱和手册要求,以下是系统化的排查思路和解决方案:




关键排查步骤:




  1. 唤醒源配置确认



    • 检查 PWR_STOPCFG 寄存器中 STOPWUCK 位:
      PWR_StopCfg(PWR_STOP_ENTRY_WFI, PWR_STOP_WAKEUP_RTC); // 错误:仅允许RTC唤醒
      PWR_StopCfg(PWR_STOP_ENTRY_WFI, PWR_STOP_WAKEUP_GPIO | PWR_STOP_WAKEUP_RTC); // 正确:启用GPIO和RTC唤醒

    • 重点:必须通过 PWR_StopCfg() 明确使能 PWR_STOP_WAKEUP_GPIO 标志位。




  2. GPIO中断配置复查



    • EXTI控制器使能
      EXTI_InitTypeDef EXTI_InitStruct = {0};
      EXTI_InitStruct.EXTI_Line = EXTI_LINE_X; // 替换为具体引脚线(如EXTI_LINE_0)
      EXTI_InitStruct.EXTI_Mode = EXTI_MODE_INTERRUPT;
      EXTI_InitStruct.EXTI_Trigger = EXTI_TRIGGER_RISING_FALLING; // 根据需求选择边沿
      EXTI_InitStruct.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStruct);

    • NVIC优先级配置
      NVIC_EnableIRQ(GPIOx_IRQn); // 确保对应GPIO组的NVIC中断已开启(x为A/B/C...)




  3. 引脚复用功能冲突



    • 若唤醒引脚复用于 SWD调试接口(PB3/PB4)其他外设

      • 在进入STOP前关闭冲突外设:__HAL_AFIO_RELEASE_SWDIO(); 或禁用相关外设时钟。

      • 确认引脚配置为纯GPIO输入模式:  
        GPIO_InitStruct.Pin = GPIO_PIN_X;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_PULLUP; // 根据硬件选择上拉/下拉
        HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);





  4. 中断标志未清除



    • 进入STOP模式前强制清除所有可能残留中断标志:
      EXTI_ClearIntPendingBit(EXTI_LINE_X);   // 清除EXTI中断标志
      NVIC_ClearPendingIRQ(GPIOx_IRQn);       // 清除NVIC挂起标志




  5. 低功耗模式入口代码时序



    • 确保执行唤醒操作的 最后一条指令是WFI/WFE
      __WFI();  // 进入STOP模式

    • 模式切换后立即进入休眠,避免插入其他操作。




  6. 唤醒后时钟恢复延迟



    • 唤醒后等待HSI稳定(通常需几μs):
      while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET) {} // 检查HSI就绪标志




  7. 电气信号测量



    • 用示波器检查唤醒引脚:

      • 是否产生符合阈值的 清晰边沿(>50ns)。

      • 是否存在 抖动(添加硬件滤波电容)。

      • 引脚电压在休眠时是否稳定(无浮空)。







针对性解决方法:


// 正确配置示例片段:
void Enter_STOP_Mode(void) {
  // 1. 配置唤醒引脚为输入+中断
  GPIO_Init(GPIOx, GPIO_PIN_X, GPIO_MODE_INPUT_PULLUP);
  EXTI_Init(..., EXTI_TRIGGER_FALLING, ENABLE);

  // 2. 清除所有残留中断标志
  EXTI_ClearIntPendingBit(EXTI_LINE_X);
  NVIC_ClearPendingIRQ(GPIOx_IRQn);

  // 3. 配置STOP模式并启用GPIO唤醒
  PWR_StopCfg(PWR_STOP_ENTRY_WFI, PWR_STOP_WAKEUP_GPIO);

  // 4. 关闭调试接口(如果使用PB3/PB4)
  __HAL_AFIO_RELEASE_SWDIO();

  // 5. 执行WFI进入休眠
  __WFI();

  // 6. 唤醒后等待时钟稳定
  while(!RCC_GetFlagStatus(RCC_FLAG_HSIRDY)) {}
}



补充建议:



  • 检查低功耗模式级别:确认实际进入的是STOP模式而非其他模式(如STANDBY)。

  • 固件库版本:升级到最新CW32库(某些旧版本存在EXTI配置Bug)。

  • 复用功能重映射:若使用非标准引脚,检查 AFIO->MAPR 是否冲突。

  • 最小工程测试:剥离复杂逻辑,仅保留GPIO唤醒代码验证基础功能。


通过以上步骤,90%以上的GPIO唤醒失效问题可被定位。重点在于唤醒源使能、中断标志清除、引脚配置隔离这三个核心环节的严格排查。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分