#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 мА (так что модуль находится в каком-то спящем режиме, просто не выключается), но не могу снизить его.