STM32F10x低功耗--待机模式

STM32F10x低功耗–待机模式

待机模式介绍

STM32F10x待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。 PLL、HSI和HSE振荡器也被断电。 SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。
在待机模式下,下列功能需要单独设置:

  1. 独立看门狗(IWDG):独立看门狗一旦启动,除了系统复位,它不能再被停止。可通过看门狗的键寄存器或硬件选择来启动IWDG。
  2. 实时时钟(RTC):可通过区域控制寄存器(RCC_BDCR)中的RTCEN位来设置。
  3. 内部RC振荡器(LSI RC):通过控制/状态寄存器(RCC_CSR)的LSION位来设置。
  4. 外部低速时钟LSE(32.768KHZ):通过备份域寄存器(RCC_BDCR)的LSEON位设置。

待机模式配置

  • 退出待机模式
    通过以下方式可退出待机模式:
  • 外部引脚复位引脚(NRST引脚)
  • 看门狗复位(IWDG)
  • WKUP引脚的上升沿触发(PA0)
  • RTC闹钟事件的上升沿触发
    从待机模式唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有寄存器被复位;从待机模式唤醒的代码等同于复位重启。
  • 进入待机模式配置步骤
    1、设置Cortex™-M3系统控制寄存器中的SLEEPDEEP位(SCB_SCR参考Cortex-M3权威指南182页)。
    2、开启PWR时钟(RCC_APB1的PWR位)
    3、设置电源控制寄存器(PWR_CR)的PDDS位
    4、清除电源控制/状态寄存器(PWR_CSR)中的WUF位
    5、等待中断触发唤醒(WFI等待中断或者WFE等待事件)
/************进入待机模式配置***************************
**
**注:使用待机模式若通过KEY_UP触发这需要PWR_CSR的EWUP位
**
*******************************************************/
void SYS_standby_mode(void)
{
    
    
	SCB->SCR|=1<<2;//使能SLEEPDEEP位 Cortex-M3权威指南182页	
	RCC->APB1ENR|=1<<28; //使能电源时钟
	PWR->CSR|=1<<8;//设置WKUP唤醒(使用PA0唤醒需要配置)
	PWR->CR|=1<<1;//进入待机模式
	PWR->CR|=1<<2;//清除WUF唤醒位
	WFI_SET();//等待中断触发唤醒
}
  • WFI等待中断函数
//THUMB指令不支持汇编内联
//采用如下方法实现执行汇编指令WFI,等待下一个外部中断触发
void WFI_SET(void)
{
    
    
	__ASM volatile("wfi");		  
}
  • 待机模式唤醒设置
    待机模式唤醒通过检测PA0引脚的上升沿信号。
/*************待机模式唤醒设置*********************
**唤醒方式:WKUP(PA0)上升沿
**				 RTC闹钟事件的上升沿
**				 NRST引脚上外部复位
**				 IWDG复位
**配置PA0上升沿触发中断
**通过检查PA0,按下3S退出待机模式,未按下进入待机模式
****************************************************/
void SYS_ExitStandyMode(void)
{
    
    
	RCC->APB2ENR|=1<<2;//开启PA时钟
	GPIOA->CRL&=0xFFFFFFF0;//清除原来寄存器中的值
	GPIOA->CRL|=0x00000008;//配置为上下拉输入方式
	RCC->APB2ENR|=1<<0;//AFIO
	AFIO->EXTICR[0]&=~(0xf<<0*4);//PA0作为外部中断0输入源	
	EXTI->IMR|=1<<0;//开启EXTI0中断请求
	EXTI->RTSR|=1<<0;//允许EXTI0上升沿触发
	STM32_NVIC_SetPriority(EXTI0_IRQn,1,1);//设置优先级	
	if(WKUP_Check()==0)SYS_standby_mode();	
}

WKUP按键检测函数
判断PA0引脚是否连续按下2S,连续按下2s则进入或退出待机模式。

/****************检测WKUP按键****************/
u8 WKUP_Check(void)
{
    
    
	u16 t=0;
	LED2=0;
	while(1)
	{
    
    
		if(KEY1)//检测是否按下
		{
    
    
			t++;
			Delay_Ms(10);
			if(t>=200)
			{
    
    
				LED2=1;
				return 1;
			}
		}
		else 
		{
    
    
			LED2=1;
			return 0;
		}
	}
}
  • 主函数实现
    实现功能:
    1.系统初始化后直接进入待机模式
    2.初始化通过RTC配置闹钟中断30s后唤醒
    3.通过检测WKUP按键(PA0)持续按下3S后退出待机模式
    4.在正常模式下可通过WKUP按键(PA0)持续按下3S进入待机模式或者通过按下KEY2进入待机模式
int main()
{
    
    
	u16 cnt=0;
	u8 key=0;
	Beep_Init();
	Led_Init();
	Key_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	printf("初始化完成\r\n");
	RTC_Init();//RTC配置
	Delay_Ms(1000);
	Delay_Ms(1000);
	SYS_ExitStandyMode();//待机模式设置
	while(1)
	{
    
    
		Delay_Ms(1);
		cnt++;
		if(cnt>=500)
		{
    
    
			cnt=0;
			LED1=!LED1;
		}
		key=Key_Scan();
		if(key==2)
		{
    
    
			SYS_standby_mode();//按键2按下进待机模式
		}
		if(usart1_flag)
		{
    
    
			usart1_rx_buff[usart1_cnt]='\0';
			printf("USART1:%s\r\n",usart1_rx_buff);
			usart1_flag=0;
			usart1_cnt=0;
		}
	}
}

闹钟中断实现效果,或者按键触发
在这里插入图片描述
实验示例:
https://download.csdn.net/download/weixin_44453694/13747693

猜你喜欢

转载自blog.csdn.net/weixin_44453694/article/details/111478286