1、所有时钟都已经停止
2、进入方式:配置PWR_CR寄存器的PDDS+LPDS位+SLEEPDEEP位+WFI或WFE命令
3、唤醒方式:任意外部中断
4、关闭所有1.8v区域的时钟
5、HSI和HSE的振荡器关闭
6、开启或处于低功耗模式(依据电源控制寄存器的设定)
// 暂停滴答时钟,防止通过滴答时钟中断唤醒
HAL_SuspendTick();
//进入停止模式,设置电压调节器为低功耗模式,等待中断唤醒
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
SYSCLKConfig_STOP();
// 被唤醒后,恢复滴答时钟
HAL_ResumeTick();
1、配置RCC、SYS、USART1、时钟84MHz
2、添加按键PB8的外部中断模式,LED灯PF9、PF10输出模式
3、生成代码
1、添加外部中断回调函数
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- if(GPIO_Pin==GPIO_PIN_10)
- {
- HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);
- }
- }
2、在main中添加函数
- // 使用绿灯指示,运行状态
- HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
- HAL_Delay(2000);
- HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET);
- //进入睡眠降低功耗
- HAL_Delay(2000);
- //进入停止状态
- HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
- //暂停滴答时钟,防止通过滴答时钟中断唤醒
- HAL_SuspendTick();
- //使能PWR时钟
- __HAL_RCC_PWR_CLK_ENABLE();
- //清除唤醒标记
- __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
- // 进入停止模式
- HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
-
- HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET);
- // 刚从STOP模式唤醒时钟默认使用内部高速8M时钟,所以需要重新配置时钟
- SystemClock_Config();
- // 被唤醒后,恢复滴答时钟
- HAL_ResumeTick();
- // 获取重新配置后的时钟状态
- SYSCLK_Frequency = HAL_RCC_GetSysClockFreq();
- HCLK_Frequency = HAL_RCC_GetHCLKFreq();
- PCLK1_Frequency = HAL_RCC_GetPCLK1Freq();
- PCLK2_Frequency = HAL_RCC_GetPCLK2Freq();
- SYSCLK_Source = __HAL_RCC_GET_SYSCLK_SOURCE();
-
- // 重新配置时钟源后始终状态
- HAL_Delay(2000);
- HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET);