待机唤醒实验

在系统或电源复位以后,微控制器处于 运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行 时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。

STM32的3种低功耗模式:

① 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。
② 停止模式:所有时钟都已停止。1.8V内核电源工作。PLL,HIS和HSE RC振荡器功能禁止。寄存器和SRAM内容保留。
③待机模式:1.8V内核电源关闭。只有备份寄存器和待机电路维持供电。寄存器和SRAM内容全部丢失。实现最低功耗。

在运行模式下,可以通过下面方式降低功耗:

① 降低系统时钟。

② 关闭APB和AHB总线上未被使用的外设时钟。

在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要 2.2uA 左右的 电流。停机模式是次低功耗的,其典型的电流消耗在 350uA 左右。最后就是睡眠模式了。根据最低电源消耗,最快启动时间和可用的唤醒源等条件,选择一种最佳的低功耗模式。

STM32F4的待机模式

待机模式可实现 STM32F4 的最低功耗。该模式是在CM4 深睡眠模式时关闭电压调节器。整个1.2V 供电区域被断电。PLL、 HSI 和 HSE 振荡器也被断电。SRAM 和寄存器内容丢失。除备份域(RTC 寄存器、RTC 备份 寄存器和备份 SRAM)和待机电路中的寄存器外,SRAM 和寄存器内容都将丢失。

从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚,读取复位向量等)。 电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。

进入待机模式涉及到 2 个寄存器,电源控制寄存器(PWR_CR)和电源控制/状态寄存器(PWR_CSR)。

PWR_CR电源控制寄存器

①设置PDDS位进入深度睡眠时进入待机模式。

②设置CWUF位,清除之前的WUF唤醒位。

PWR_CSR电源控制/状态寄存器

① 设置EWUP,使能WKUP 引脚用于待机唤醒。

② WUF唤醒标志,用来判断是否发生唤醒事件。

对于使能了 RTC 闹钟中断或 RTC 周期性唤醒等中断的时候,进入待机模式前,必须按如 下操作处理:

1, 禁止 RTC 中断(ALRAIE、ALRBIE、WUTIE、TAMPIE 和 TSIE 等)。

2, 清零对应中断标志位。

3, 清除 PWR 唤醒(WUF)标志(通过设置 PWR_CR 的 CWUF 位实现)。

4, 重新使能 RTC 对应中断。

5, 进入低功耗模式。

在有用到 RTC 相关中断的时候,必须按以上步骤执行之后,才可以进入待机模式,否则可能无法唤醒。

固件库中低功耗操作函数

文件:stm32f4xx_pwr.c  / stm32f4xx_pwr.h

void PWR_EnterSTOPMode();//进入停机模式

void PWR_EnterSTANDBYMode(void);//进入待机模式

void PWR_WakeUpPinCmd(FunctionalState NewState);//使能Wakeup引脚唤醒

FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);

void PWR_ClearFlag(uint32_t PWR_FLAG);

文件: core_cm4.h

__WFI() ;

__WFE() ;

待机唤醒配置步骤:

①使能电源时钟。因为要配置电源控制寄存器,所以必须先使能电源时钟。RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

② RTC相关处理:关闭RTC相关中断。

③设置WK_UP引脚作为唤醒源。设置PWR_CSR的EWUP位,使能WK_UP用于将CPU从待机模式唤醒。

PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能

④设置SLEEPDEEP位,设置PDDS位,执行WFI指令,进入待机模式。

void PWR_EnterSTANDBYMode(void);

配置以及主函数

通过串口在屏幕上打印时间,我们在13:50:00前通过KEY0按键来开启待机模式,通过闹钟在13:50:00唤醒。

int main(void)
{ 
	u32 x=0;
	RTC_TimeTypeDef RTC_TimeStruct;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	
	delay_init(168);  //初始化延时函数
	LED_Init();				//初始化LED端口 
	BEEP_Init();      //初始化蜂鸣器端口
	KEY_Init();       //初始化与按键连接的硬件接口
	My_RTC_Init();
	uart_init(115200);		//初始化串口波特率为115200
	LED0=0;				  	//先点亮红灯
	delay_ms(1000);
	while(1)
  {
		if(x%100==0)
		{
			RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
			printf("Time:%02d:%02d:%02d\r\n",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);
		}
    if(KEY_Scan(0)==KEY0_PRES)
		{
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);	//使能PWR外设时钟
       PWR_BackupAccessCmd(ENABLE);//后备区域访问使能
      RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断	       
      RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。
     PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志
     PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能		
			RTC_Set_AlarmA(5,13,50,0); 
      PWR_EnterSTANDBYMode();	  //进入待命(STANDBY)模式
		}
    delay_ms(10);
		x++;
	}

}

运行视频

待机唤醒实验

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值