stm32的待机模式解析

发布者:beta12最新更新时间:2019-03-29 来源: eefocus关键字:stm32  待机模式 手机看文章 扫描二维码
随时随地手机看文章

stm32的待机模式是stm32最省电的模式,几乎所有的内部寄存器都掉电了,只有待机电路和RTC部分等还有电。假如寄存器都掉电的话,那就是和按复位键一样了,程序重新从main函数开始执行。


那么如何进入待机模式:


1.RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR外设时钟


2.PWR_EnterSTANDBYMode();                                                                //进入STANDBY模式 


如何出待机模式:


1.PA0的上升沿


2.闹钟中断的上升沿


3.独立看门狗的复位


4.复位引脚


一般来讲采用1和2来唤醒待机模式下的stm32。


1.模式PA0的配置(并不需要配置中断)


   GPIO_InitTypeDef  GPIO_InitStructure;    

NVIC_InitTypeDef NVIC_InitStructure;

EXTI_InitTypeDef EXTI_InitStructure;

 

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和复用功能时钟

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; //PA.0

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉输入

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO

在进入待机模式之前要配置PA0唤醒的功能

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟

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

PWR_EnterSTANDBYMode();   //进入待命(STANDBY)模式  

2.RTC的闹钟唤醒


首先要配置RTC,使能闹钟中断。


NVIC_InitTypeDef NVIC_InitStructure;

/* Enable PWR and BKP clocks */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);


/* Allow access to BKP Domain */

PWR_BackupAccessCmd(ENABLE);


/* Reset Backup Domain */

BKP_DeInit();


/* Enable LSE */

RCC_LSEConfig(RCC_LSE_ON);

/* Wait till LSE is ready */

while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

{}


/* Select LSE as RTC Clock Source */

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);


/* Enable RTC Clock */

RCC_RTCCLKCmd(ENABLE);


/* Wait for RTC registers synchronization */

RTC_WaitForSynchro();


/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask();


/* Enable the RTC Second */

RTC_ITConfig(RTC_IT_SEC, ENABLE);


/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask();


/* Set RTC prescaler: set RTC period to 1sec */

RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */


/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask();

 

 

NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;             //TIM2中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //从优先级3级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);                          //初始化NVIC寄存器

我的做法是将RTC的CNT值读出然后加上一个多长时间进入闹钟中断的值,写入RTC闹钟的计数器中

temp = RTC_GetCounter();

temp+=5;


RTC_WaitForSynchro();

RTC_SetAlarm(temp);

RTC_WaitForLastTask();


RTC_WaitForSynchro();

RTC_ITConfig(RTC_IT_ALR | RTC_IT_SEC, ENABLE);

/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask();


这里使能了秒中断和ALR中断。中断函数是这样写的

void RTC_IRQHandler()

{

u32 temp = 0;

static u8 temp1= 5;

if(RTC_GetITStatus(RTC_IT_ALR) == SET)

{

RTC_ClearITPendingBit(RTC_IT_ALR);

temp = RTC_GetCounter();

temp+=5;

RTC_WaitForSynchro();

RTC_SetAlarm(temp);

RTC_WaitForLastTask();

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟

PWR_EnterSTANDBYMode();   //进入STANDBY模式  

}

else if(RTC_GetITStatus(RTC_IT_SEC) == SET)

{

RTC_ClearITPendingBit(RTC_IT_SEC);

temp1--;

LCD_ShowString(30,65,200,16,16,"count down:");

LCD_ShowxNum(120,65,temp1,2,16,0x80);

}

 

 

 

}

发生RTC中断的时候,重新配置ALR等,然后进入待机模式,秒中断则是在LCD上显示倒计时的数字。



3.同时使用PA0和RTC闹钟中断。


PA0的配置是这样的:


void WKUP_Init(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure;    

NVIC_InitTypeDef NVIC_InitStructure;

EXTI_InitTypeDef EXTI_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和复用功能时钟

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; //PA.0

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉输入

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟

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

此时,stm32就同时支持RTC定时唤醒和PA0的唤醒了。


关键字:stm32  待机模式 引用地址:stm32的待机模式解析

上一篇:STM32之低功耗——WKUP待机唤醒(LCD显示)
下一篇:STM32F030低功耗之停机模式的进入和唤醒

推荐阅读最新更新时间:2024-03-16 16:26

STM32关于printf重定向到串口
------------------------------------------------------------------------------------------------------------------- 一、MDK中使用printf出问题的原因 如在MDK中使用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 标准库函数的默认输出设备是电脑显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数。 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ #define
[单片机]
<font color='red'>STM32</font>关于printf重定向到串口
NVIC中断优先级管理
一,STM32中断介绍 CM3内核支持256个中断,16个内核中断和240个外部中断,具有256级可编程中断设置 STM32只使用了CM3内核的一部分,84个中断:16个内核中断+68个可屏蔽中断(外部中断),具有16级可编程的中断优先级 STM32F103系列只有60个可屏蔽中断(F107系列有68个) 二,中断管理 STM32有如此多的中断,那么是如何进行管理的 中断优先级分组:  SCB- AIRCR 3位寄存器 : 配置分组,确定中断具有几位抢占优先级和几位响应优先级 每一个中断都具有一个 4位IP寄存器,通过这4个位来设置抢占和响应优先级, 16级可编程中断优先级(2的4次方=16) 配置
[单片机]
NVIC中断优先级管理
STM32F407 - 低功耗模式待机唤醒
默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下, CPU 通过HCLK 提供时钟,并执行程序代码。 STM32F407提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗。 低功耗模式 低功耗模式: 功耗比较: 睡眠模式(Cortex™-M4F内核停止,外设保持运行) - 停止模式(所有时钟都停止) 次低功耗 待机模式(1.2 V域断电) 最低功耗 以上之外的降低运行模式功耗的方法: ● 降低系统时钟速度 ● 不使用APBx和AHBx时,关闭对应的外设时钟(在运行模式下降低功耗的有效手段) 表18 待机模式(篇幅有限,本文仅介绍待机模式) 如何进入和退
[单片机]
STM32 串口通讯 发送 接收
STM32的使用有利有弊,种类多---但是种类有太多,资料也是比较乱的,还有就是库的调用,经常忘记一些函数的使用------比如最常用的串口------ ------------------------------------------------------------------------------USART ----设置------------------------------- void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC
[单片机]
单片机stm32时钟频率和配置方法详解
  单片机stm32时钟频率   STM32F103内部8M的内部震荡,经过倍频后最高可以达到72M。目前TI的M3系列芯片最高频率可以达到80M。   在stm32固件库3.0中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。系统给出的函数为SystemInit()。但在调用前还需要进行一些宏定义的设置,具体的设置在system_stm32f10x.c文件中。   文件开头就有一个这样的定义:   //#define SYSCLK_FREQ_HSE HSE_Value   //#define SYSCLK_FREQ_20MHz 20000000   //#define SYSCLK_FREQ_36MHz
[单片机]
单片机<font color='red'>stm32</font>时钟频率和配置方法详解
基于L298N的STM32的直流电机PWM调速控制
这两天研究了一下基于L298N与stm32的直流电机调速,实验结果良好,可以根据调节STM32的PWM占空比来进行直流电机的调速。实验系统图如下: 首先整个PWM实验选用的是stm32f103系列,驱动模块选择的是L298N驱动模块,以及12V直流电源。简单的来说,电机调速就是通过stm32输出PWM来进行控制L298N的使能端ENA。 L298N驱动模块 使用方法: 输出A:通道A输出,连接直流电机 输出B:通道B输出,连接电机 12V供电:主电源正极输入 GND:主电源正负极输入 5V输出:5V电压输出端,可用于给STM32开发板进行供电 ENA:通道A使能 ENB:通道B使能 IN1—IN4:逻辑输入IN1-IN
[单片机]
基于L298N的<font color='red'>STM32</font>的直流电机PWM调速控制
IOTA基金会与意法半导体联手加速物联网技术整合
IOTA基金会是一家非营利组织,提供世界上第一个可扩展,无损且完全分散的分布式账本技术,正在与意法半导体合作,创建一个新级别的强大,无缝且经济高效的物联网接入功能。 这项合作的基石是将IOTA Tangle(一种免费的点对点技术解决方案)集成到ST的STM32Cube扩展软件中,该软件用于业界领先的STM32 32位MCU生态系统X-CUBE-IOTA1。 这种关系将为ST用户社区提供物联网集成功能,使客户能够轻松快速地为单个或多个设备创建和构建新的物联网解决方案。同样重要的是,开发人员可以在享受通过IOTA功能开发系统,环境,产品和服务的能力的同时工作,以及Tangle分布式,高度可扩展的点对点网络和无感结构等强大功能。 “通过
[单片机]
STM32/GD32翻新或假货
今天,我的技术交流群在讨论芯片涨价和咸鱼上卖芯片的话题,然后又看到了公众号嵌入式ARM分享了一篇《GD32也开始假货泛滥了》文章,我也来说说关于芯片涨价和假货的一些问题。 1 芯片涨价背景前两年的中美毛衣战,使国内一些技术型大企业受到了影响,比如华为。但是绝大部分电子相关的企业,受到的影响很小。 2020年,一场疫情,导致了一些半导体企业受到很大打击,比如工人罢工。 然后,一些原材料价格开始出现了不同程度的上涨,特别是今年初开始,很多金属、塑料等绝大部分原材料价格都上涨了,小到电阻电容,大到电视冰箱等消费电子产品,都出现了不同程度的涨价。 芯片亦如此,我们熟知的MCU价格出现了不同程度的涨价,相信大家都知道了,特别是STM32
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved