1.STM32待机模式介绍
1.1 STM32低功耗模式介绍
很多单片机具有低功耗模式,比如MSP430、STM8L等,我们的STM32 也不例外。默认情况下,系统复位或上电复位后,微控制器进入运行模 式。在运行模式下,HCLK 为CPU提供时钟,并执行程序代码。当 CPU 不 需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省 功耗。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等 条件,选定一个最佳的低功耗模式。
当然在运行模式下,也可以通过如下方式降低功耗:
(1)降低系统时钟速度
(2)不使用 APBx 和 AHB 外设时,将对应的外设时钟关闭
STM32 提供了 3 种低功耗模式,以达到不同层次的降低功耗的目 的,这三种模式如下:
(1)睡眠模式( CM3内核停止工作,外设仍在运行)
(2)停止模式(所有时钟都停止)
(3)待机模式( 1.8 V 内核电源关闭)
这三种模式所需的功耗是逐级递减,也就是说待机模式功耗是最低的 。
2.待机模式配置步骤
接下来我们介绍下如何使用库函数进入和退出待机模式。这个也是在
编写程序中必须要了解的。具体步骤如下:(电源管理相关库函数在
stm32f10x_pwr.c和stm32f10x_pwr.h文件中)
(1)使能电源时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
(2)设置WK_UP引脚为唤醒源 PWR_WakeUpPinCmd(ENABLE);
(3)进入待机模式
PWR_EnterSTANDBYMode();//进入待机模式
PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up标志
实现的功能是:系统运行时D1指示灯闪烁,5秒后进入待机
模式,D1指示灯熄灭,同时串口printf输出相关提示信息,通过K_UP按
键实现唤醒。程序框架如下:
(1)配置进入与退出待机模式
(2)编写主函数
wkup.c
#include "wkup.h"
/*******************************************************************************
* 函 数 名 : Enter_Standby_Mode
* 函数功能 : 进入待机模式
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Enter_Standby_Mode(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR外设时钟
PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志
PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚 使能或者失能唤醒管脚功能
PWR_EnterSTANDBYMode();//进入待机模式
}
wkup.h
#ifndef _wkup_H
#define _wkup_H
#include "system.h"
void Enter_Standby_Mode(void);
#endif
main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "wkup.h"
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
int main()
{
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init();
USART1_Init(9600);
while(1)
{
printf("time: 5\r\n");
led1=0;
delay_ms(1000); //隔1秒显示计数
printf("time: 4\r\n");
led1=1;
delay_ms(1000);
printf("time: 3\r\n");
led1=0;
delay_ms(1000);
printf("time: 2\r\n");
led1=1;
delay_ms(1000);
printf("time: 1\r\n");
led1=0;
delay_ms(1000);
printf("进入系统待机模式\r\n");
Enter_Standby_Mode();
}
}