STM32F10x低功耗之待机模式详解,待机模式

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|=1WFI等待中断函数

//THUMB指令不支持汇编内联//采用如下方法实现执行汇编指令WFI,等待下一个外部中断触发void WFI_SET(void){__ASM volatile("wfi"); }

待机模式唤醒设置

待机模式唤醒通过检测PA0引脚的上升沿信号。

/*************待机模式唤醒设置***********************唤醒方式:WKUP(PA0)上升沿** RTC闹钟事件的上升沿** NRST引脚上外部复位** IWDG复位**配置PA0上升沿触发中断**通过检查PA0,按下3S退出待机模式,未按下进入待机模式****************************************************/void SYS_ExitStandyMode(void){RCC->APB2ENR|=1CRL|=0x00000008;//配置为上下拉输入方式RCC->APB2ENR|=1WKUP按键检测函数
判断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;}}}

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

相关推荐

相关文章