STM32WL немедленно выходит из спящего режима выключения

#c #stm32 #sleep #stm32cubeide

Вопрос:

Я пытаюсь перевести STM32WL (в настоящее время на плате разработчиков WL55JC1) в спящий режим с помощью режима выключения и сталкиваюсь с проблемой, при которой микроконтроллер немедленно выходит из спящего режима после его ввода.

Вот что я использую, чтобы заснуть:

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

Переходя в спящий режим, я пытаюсь приостановить работу системы, а затем использую макрос HAL, чтобы перейти в спящий режим выключения. Из того, что я прочитал, кажется, что это все, что мне нужно, но, очевидно, не в этом случае.

Выход из спящего режима происходит независимо от того, включен или нет встроенный модуль 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(amp;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(amp;RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)  {  Error_Handler();  } }  

Комментарии:

1. Что должно вызвать у вас пробуждение? В вашем основном коде вы просто ставите галочку после входа в режим выключения… Тик возобновления генерирует прерывание, поэтому оно может быть тем, которое разбудит систему.

2. Я запускаю пробуждение с помощью пин-кода NRST. Я обновил фрагменты кода, чтобы отразить то, что я сейчас пытаюсь. На данный момент я снижаю энергопотребление примерно до 3 мА (так что модуль находится в каком-то спящем режиме, просто не выключается), но не могу снизить его.