stm32低功耗模式
stm32有三种低功耗模式——睡眠,停止,待机。
睡眠模式:内核时钟关闭,不影响外设和存储器的运行。
停止模式:内核时钟关闭,关闭内核逻辑电路的所有时钟,关闭时钟系统。
待机模式:内核时钟关闭,关闭内核逻辑电路的所有时钟,关闭时钟系统,关闭电压调节器。
待机模式节能效果最好但是程序会复位,少数条件才能唤醒。
那么相关模式怎么配置呢?其实很简单,首先我们可以将三个模式的唤醒均设为WKUP唤醒,之后再分别对三个模式设置
睡眠模式:
1。直接进入睡眠模式就可以,直接调用HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI)。
停止模式:
1.进入停止模式:HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI)。
2.等待WKUP外部中断唤醒
3.重新设置时钟、重新选择滴答时钟源、失能systick中断。
sys_stm32_clock_init(RCC_PLL_MUL9); /* 重新设置时钟, 72Mhz */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
HAL_SuspendTick();
待机模式:
1.使能电源时钟__HAL_RCC_PWR_CLK_ENABLE()。
2.使能WKUP的唤醒功能HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1)。
3.清除唤醒标记WUF__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU)。
4.进入待机模式HAL_PWR_EnterSTANDBYMode()。
附一份正点原子程序代码,能更好的理解
int main(void)
{
uint8_t key;
uint8_t t = 0;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化 */
led_init(); /* 初始化LED */
key_init(); /* 初始化按键 */
pwr_wkup_key_init(); /* WKUP引脚初始化 */
pwr_pvd_init(); /* PVD配置 */
printf("Enter to LowPower Test \r\n");
while(1)
{
key = key_scan(0); /* 得到键值 */
if (key)
{
switch (key)
{
/* 进入待机模式 */
case KEY2_PRES:
/* 使能电源时钟 */
__HAL_RCC_PWR_CLK_ENABLE();
/* 使能WKUP上升沿的唤醒功能 */
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
/* 清除唤醒标记 */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
printf("Enter STANDBY Mode \r\n");
HAL_PWR_EnterSTANDBYMode();
printf("Exit STANDBY Mode \r\n");
break;
/* 进入停止模式 */
case KEY1_PRES:
LED1(0); /* 点亮绿灯,提示进入停止模式 */
printf("Enter STOP Mode \r\n");
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
sys_stm32_clock_init(RCC_PLL_MUL9); /* 重新设置时钟, 72Mhz */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
HAL_SuspendTick();
printf("Exit STOP Mode \r\n");
LED1(1);
break;
/* 进入睡眠模式 */
case KEY0_PRES:
printf("Enter SLEEP Mode \r\n");
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
printf("Exit SLEEP Mode \r\n");
break;
}
}
if ((t % 20) == 0)
{
LED0_TOGGLE(); /* 每200ms,翻转一次LED0 */
}
delay_ms(10);
t++;
}
}
LED0_TOGGLE(); /* 每200ms,翻转一次LED0 */
}
delay_ms(10);
t++;
}
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/2302_77864418/article/details/146921844
|
|