STM32睡眠模式实验:Sleep Mode、Stop Mode和Standby Mode
1.硬件准备
实验使用STM32F103RBT6最小系统板,实物与原理图如下图,飞线使用外部3.3V电源连接LDO后端VCC_3V3。
2.低功耗模式说明
3. Sleep mode实验
使用PC13驱动LED D2亮灭提示程序正在运行,PA0外部中断唤醒MCU。
实验代码:
void pwr_key_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_init_struct.Pin = GPIO_PIN_0;
gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; /* 中断,下降沿 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
pwr_key_init();
MX_GPIO_Init();
while (1)
{
for (uint32_t i = 0; i < 20; i++)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);
}
HAL_SuspendTick();//防止SysTick中断,触发MCU退出Sleep模式
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
}
}
实验现象:
上电后LED闪烁10次,然后停止;
连接PA0到GND一下,LED重新开始闪烁10次,然后停止。
实验结果:
Sleep模式下3.3V电流0mA,有可能是电源电流测量精度不够,如下图:
运行模式下3.3V电流9~10mA,如下图:
4. stop mode实验
使用PC13驱动LED D2亮灭提示程序正在运行,PA0外部中断唤醒MCU。
实验代码:
void pwr_key_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_init_struct.Pin = GPIO_PIN_0;
gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; /* 中断,下降沿 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 2);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
pwr_key_init();
MX_GPIO_Init();
while (1)
{
for (uint32_t i = 0; i < 20; i++)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);
}
/*
* 使用Stop mode不必禁用SysTick中断,因为Stop mode中 All 1.8V domain clocks OFF
* 退出Stop mode后,HSI作为系统时钟,需要重新调用SystemClock_Config()恢复MUC时钟配置
*/
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config();
}
}
实验现象:
上电后LED闪烁10次,然后停止;
连接PA0到GND一下,LED重新开始闪烁10次,然后停止。
5. standy mode实验
使用PC13驱动LED D2亮灭提示程序正在运行,PA0-WKUP唤醒MCU。
实验代码:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
for (uint32_t i = 0; i < 20; i++)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);
}
/***********************Standby模式实验***************************************/
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); /* 设置WKUP用于唤醒 */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); /* 清除Wake_UP标志 */
HAL_PWR_EnterSTANDBYMode(); /* 进入待机模式 */
}
}
实验现象:
上电后LED闪烁10次,然后停止;
连接PA0到3.3V一下,LED重新开始闪烁10次,然后停止。
作者:李李伟