Estoy intentando hacer que un STM32WL (actualmente en un devboard WL55JC1) entre en modo de suspensión usando el modo de apagado, y me encuentro con un problema en el que la MCU sale inmediatamente del modo de suspensión después de ingresar.
Esto es lo que estoy usando para conciliar el sueño:
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();
Al entrar en modo de suspensión, intento suspender el sysstick y luego uso la macro HAL para ingresar al modo de suspensión de apagado. Por lo que he leído, esto parece ser todo lo que necesito, pero obviamente no en este caso.
La salida del modo de suspensión ocurre independientemente de que el módulo ST-Link integrado en mi placa de desarrollo esté encendido o no.
NRST actualmente está flotando, ya que cuando lo conecto a tierra, el chip se apaga y consume 700uA. Otro enigma por resolver.
Editar: no estoy seguro de si ayudará, pero aquí está la configuración del reloj de mi sistema:
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(); } }