【问题标题】:STM32WL immediately wakes from shutdown sleep modeSTM32WL 立即从关机睡眠模式唤醒
【发布时间】:2022-11-13 16:06:52
【问题描述】:

我正在尝试使用关机模式使 STM32WL(目前在 WL55JC1 开发板上)进入睡眠状态,并且遇到了 MCU 在进入后立即退出睡眠的问题。

这是我用来睡觉的东西:

                    Radio.Sleep();
                    HAL_SUBGHZ_MspDeInit(&hsubghz);
                    LL_RCC_RF_EnableReset();
                    __disable_irq();
                    HAL_SuspendTick();
                    HAL_PWREx_DisableSRAMRetention();
                    HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_LPSLEEP);
                    HAL_PWR_DisablePVD();
                    HAL_SUBGHZ_ExecSetCmd(&hsubghz, RADIO_SET_SLEEP, 0x0000, 2);
                    HAL_Delay(3000);

                    HAL_PWREx_EnterSHUTDOWNMode();

进入休眠时,我尝试挂起systick,然后使用HAL宏进入shutdown休眠模式。从我读过的内容来看,这似乎就是我所需要的,但显然不是在这种情况下。

无论我的开发板上的板载 ST-Link 模块是否通电,都会从睡眠中退出。

NRST 目前处于浮动状态,因为当我将其拉至地时,芯片会关闭并拉出 700uA。另一个难题要弄清楚。

编辑:不确定是否有帮助,但这是我的系统时钟配置:

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure LSE Drive Capability
  */
  HAL_PWR_EnableBkUpAccess();
  __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3|RCC_CLOCKTYPE_HCLK
                              |RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
                              |RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.AHBCLK3Divider = RCC_SYSCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

【问题讨论】:

  • 什么应该触发你的唤醒?在您的主代码中,您只需在进入关机模式后恢复滴答声……恢复滴答声会产生一个中断,因此它可能是唤醒系统的那个。
  • 我正在通过 NRST 引脚触发唤醒。我已经更新了代码 sn-ps 以反映我目前正在尝试的内容。在这一点上,我降低到大约 3mA 的功耗(所以模块处于某种睡眠状态,只是没有关闭),但不能再低了。
  • 显然不太可能,但是在你睡觉之前有一些挂起的中断呢?

标签: c stm32 sleep stm32cubeide


【解决方案1】:

原来我只需要在睡觉前清除一些标志。将所有 GPIO 设置为 GPIO_PIN_RESET 也很重要。我无法衡量差异,但这是我的 ST FAE 的话。

Radio.Sleep();

/* Enable wake-up pin pull-up state in Standby mode.*/
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1_HIGH);

/* Clear all related wakeup flags*/
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF1);
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WRFBUSY);

/* Enter the Standby mode */
HAL_PWREx_EnterSHUTDOWNMode();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2017-06-25
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多