我正在尝试使用
STM32F 的待机模式并通过 WKUP (PA0) 引脚唤醒它。
进入待机似乎还可以,功耗达到 4 uA。
如果我用 RESET 引脚重置 MCU,它会正常启动:在 250 ms 延迟后它会进入睡眠状态并消耗 4 uA
https://i.stack.imgur.com/nDM6f.png
但是,如果我用 WKUP 引脚唤醒它,它会表现得很奇怪:消耗量保持在“运行”水平,我看到我的 250 延迟周期结束,MCU 不断重启而不是进入睡眠状态。
https://i.stack.imgur.com/KYPqM.png
我的代码非常简单:
- #include
- #ifdef __cplusplus
- extern "C"
- #endif
- void Systick_Handler(void)
- {
- HAL_IncTick();
- HAL_SYSTICK_IRQHandler();
- }
- void Error_Handler()
- {
- __asm("bkpt 255");
- __asm("bx lr");
- }
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
- RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
- __HAL_RCC_AFIO_CLK_ENABLE();
- __HAL_RCC_PWR_CLK_ENABLE();
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI;
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
- RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
- RCC_OscInitStruct.LSIState = RCC_LSI_ON;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
- RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL_NONE;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- /** Initializes the CPU, AHB and APB buses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
- | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
- {
- Error_Handler();
- }
- /** Configure the Systick interrupt time
- */
- __HAL_RCC_PLLI2S_ENABLE();
- }
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- __HAL_AFIO_REMAP_SWJ_NOJTAG();
- HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
- HAL_Delay(250);
- HAL_PWR_EnterSTANDBYMode();
- }