STM32 L4系列单片机低功耗模式(STOP模式)
STM32 L4系列单片机的STOP2模式。
目录
- 一、应用场景
- 二、设计思路
- 三、关键代码
- 四、功能验证
一、应用场景
在实际的项目开发过程中,有些产品是要求有睡眠模式的,比如智能手表、对讲机等移动设备,在不使用的时候希望设备不要耗电来延长设备工作时间。这里提供一种解决思路:收到睡眠指令(或某个按键按下时)进入睡眠模式并开启唤醒按键的GPIO中断,当唤醒按键按下时退出睡眠模式。
二、设计思路
1、关闭已打开的外设(包括调试烧录口)
2、所有GPIO设置为模拟输入
3、关闭所有GPIO时钟
4、开启GPIO中断(中断唤醒用,如果不用GPIO中断唤醒不用开)
5、进入STOP模式
三、关键代码
/* 关闭调试口 */
HAL_DBGMCU_DisableDBGStopMode();
HAL_DBGMCU_DisableDBGSleepMode();
HAL_DBGMCU_DisableDBGStandbyMode();
/* 关闭串口1时钟 */
LL_USART_DeInit(USART1);
__HAL_RCC_USART1_CLK_DISABLE();
/* 设置所有引脚为模拟输入 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_All;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);
HAL_GPIO_Init(GPIOH,&GPIO_InitStruct);
HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
HAL_GPIO_Init(GPIOD,&GPIO_InitStruct);
/* 关闭所有GPIO时钟 */
__HAL_RCC_GPIOC_CLK_DISABLE();
__HAL_RCC_GPIOH_CLK_DISABLE();
__HAL_RCC_GPIOA_CLK_DISABLE();
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOD_CLK_DISABLE();
//开启GPIO中断唤醒MCU
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = OK_key_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
HAL_PWR_DisablePVD(); //禁用电源电压检测器(PVD)
HAL_SYSCFG_DisableVREFBUF(); //禁用内部电压基准缓冲器(VREFBUF)
HAL_SYSCFG_DisableIOAnalogSwitchBooster(); //禁用I/O模拟量开关电压升压器。
__HAL_PWR_PVM3_EXTI_DISABLE_RISING_FALLING_EDGE(); //禁用PVM3中断
__HAL_PWR_PVM4_EXTI_DISABLE_RISING_FALLING_EDGE(); //禁用PVM4中断
/* 降低核心工作电压,需要根据实际工作频率设置,建议在Cubemx内的RCC项目中配置 */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
HAL_SuspendTick(); // 暂停滴答时钟,防止通过滴答时钟中断唤醒
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标记
__HAL_RCC_PWR_CLK_ENABLE(); //运行电源管理时钟
//进入STOP模式2
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
四、功能验证
可以将设备接在稳压源或专门的功耗测试设备上,对比正常工作下的电流和睡眠模式下的电流大小。