单片机
返回首页

STM32F10x低功耗之待机模式详解

2023-10-08 来源:elecfans

1.待机模式介绍

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位设置。


2.待机模式配置

退出待机模式

通过以下方式可退出待机模式:


外部引脚复位引脚(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('初始化完成rn');

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]='';

printf('USART1:%srn',usart1_rx_buff);

usart1_flag=0;

usart1_cnt=0;

}

}

}

闹钟中断触发唤醒,或者按键触发唤醒

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章