00. 目录

文章目录

  • 00. 目录
  • 01. 待机模式简介
  • 02. 硬件模块
  • 03. 相关函数
  • 04. 程序示例一
  • 05. 程序示例二
  • 06. 附录
  • 07. 声明

01. 待机模式简介

很多单片机都有低功耗模式,STM32F4 也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。STM32F4 的 3 种低功耗模式我们在 5.2.4 节有粗略介绍,这里我们再回顾一下。
STM32F4 提供了 3 种低功耗模式,以达到不同层次的降低功耗的目的,这三种模式如下:
1)睡眠模式(CM4 内核停止工作,外设仍在运行);
2)停止模式(所有的时钟都停止);
3)待机模式;

02. 硬件模块

用到的硬件资源有:
1) 指示灯 DS0
2) KEY_UP 按键
3) TFTLCD 模块

03. 相关函数

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();

04. 程序示例一

按下KEY0进入待机模式 KEY_UP唤醒

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usmart.h"
#include "lcd.h"
#include "rtc.h"
#include "rng.h"
#include "key.h"int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);uart_init(115200);usmart_dev.init(84);LED_Init();KEY_Init();LCD_Init();POINT_COLOR = RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");  LCD_ShowString(30,70,200,16,16,"PWR TEST");   LCD_ShowString(30,90,200,16,16,"ATOM@tom");LCD_ShowString(30,110,200,16,16,"2020/09/10");   while(1){if (Key_Scan() == KEY0_PRESS){//使能PWR时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //后备区域访问使能PWR_BackupAccessCmd(ENABLE);//关闭RTC相关中断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);//清除wake-up标志PWR_ClearFlag(PWR_FLAG_WU);//使能唤醒管脚功能PWR_WakeUpPinCmd(ENABLE);//进入待机模式PWR_EnterSTANDBYMode();}delay_ms(10);}
}

05. 程序示例二

wkup.h

#ifndef __WK_UP_H__
#define __WK_UP_H__#include "sys.h"#define WKUP_KD PAin(0)//检测WKUP脚的信号
u8 Check_WKUP(void);//WKUP唤醒初始化
void WKUP_Init(void);//系统进入待机模式
void Sys_Enter_Standby(void);#endif/*__WK_UP_H__*/

wkup.c

#include "wkup.h"#include "led.h"
#include "delay.h"//检测WKUP脚的信号
u8 Check_WKUP(void)
{u8 t = 0;//记录松开的次数u8 tx = 0;LED1 = 0;while(1){if (WKUP_KD){t++;tx = 0;}else{tx++;//查过90ms没有WKUP信号if (tx > 3){LED1 = 1;return 0;}}delay_ms(30);if (t >= 100){LED1 = 0;return 1;}}
}//WKUP唤醒初始化
void WKUP_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;NVIC_InitTypeDef   NVIC_InitStructure;EXTI_InitTypeDef   EXTI_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  //(检查是否是正常开)机            if(Check_WKUP()==0){Sys_Enter_Standby(); //不是开机,进入待机模式  }SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0EXTI_Init(&EXTI_InitStructure);//配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道NVIC_Init(&NVIC_InitStructure);//配置NVIC
}//系统进入待机模式
void Sys_Enter_Standby(void)
{//等待按键松开while(WKUP_KD);//复位所有的IO口RCC_AHB1PeriphResetCmd(0x04FF, ENABLE);//使能PWR时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //后备区域访问使能PWR_BackupAccessCmd(ENABLE);//关闭RTC相关中断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);//清除wake-up标志PWR_ClearFlag(PWR_FLAG_WU);//使能唤醒管脚功能PWR_WakeUpPinCmd(ENABLE);//进入待机模式PWR_EnterSTANDBYMode();
}//中断,检测到PA0脚的一个上升沿.
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{                                                       EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位if(Check_WKUP())//关机?{          Sys_Enter_Standby(); //进入待机模式 }
}

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usmart.h"
#include "lcd.h"
#include "rtc.h"
#include "rng.h"
#include "key.h"
#include "wkup.h"int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);uart_init(115200);usmart_dev.init(84);LED_Init();KEY_Init();LCD_Init();WKUP_Init();POINT_COLOR = RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");  LCD_ShowString(30,70,200,16,16,"PWR TEST");   LCD_ShowString(30,90,200,16,16,"ATOM@tom");LCD_ShowString(30,110,200,16,16,"2020/09/10");   while(1){LED2 = !LED2;delay_ms(250);}
}

06. 附录

6.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

07. 声明

该教程参考了正点原子的《STM32 F4 开发指南》

【STM32】待机唤醒程序示例相关推荐

  1. 【STM32】RTC程序示例

    00. 目录 文章目录 00. 目录 01. RTC时钟简介 02. 硬件设计 03. RTC日历配置步骤 04. 设置和获取日期示例 05. 设置闹钟中断示例 06. 设置唤醒中断示例 07. 附录 ...

  2. STM32——待机唤醒实验-低功耗-M4

    一.低功耗模式介绍 低功耗模式:在系统或者电源复位后,微控制器出于运行状态之下,HCLK为CPU提供时钟,内核执行代码.当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发 ...

  3. 【STM32】ADC程序示例

    00. 目录 文章目录 00. 目录 01. ADC简介 02. 硬件资源 03. 编程思路 04. 程序示例 05. 预留 06. 附录 07. 声明 01. ADC简介 STM32F4xx 系列一 ...

  4. (24)STM32——待机唤醒(低功耗)笔记

    目录 学习目标 运行结果 待机唤醒 模式 待机模式 寄存器 配置 代码 总结 学习目标 本节我们讲解的是有关待机唤醒的知识,这部分知识在51中并未涉及到,我感觉还是有点意思的,有点类似与我们手机的锁屏 ...

  5. 【STM32】SPI程序示例

    00. 目录 文章目录 00. 目录 01. SPI简介 02. 功能描述 03. 硬件模块 04. 软件设计 05. 结果验证 06. 附录 07. 声明 01. SPI简介 SPI 是英语 Ser ...

  6. 【STM32】DMA程序示例

    00. 目录 文章目录 00. 目录 01. DMA简介 02. 功能描述 03. 硬件设计 04. 程序设计 05. 结果验证 06. 附录 07. 声明 01. DMA简介 DMA,全称为:Dir ...

  7. 【STM32】DAC程序示例

    00. 目录 文章目录 00. 目录 01. DAC简介 02. 硬件模块 03. 程序设计 04. 结果验证 05. 预留 06. 附录 07. 声明 01. DAC简介 STM32F4的DAC模块 ...

  8. STM32之待机唤醒

    前段时间我稍微涉及节能减排大赛..倡导节能的社会..没错了.你真是太聪明了..知道了我今天要讲关于STM32节能方面的模块..没错..这标题已经告诉你了是吧..哦,对,标题有写..所以..言归正传.至 ...

  9. STM32开发,HAL函数实现待机唤醒功能以及SVN使用简介

    STM32开发,HAL函数实现待机唤醒功能以及SVN简介 1 概述 1.1 资源概述 1.2 实现功能 2 程序实现 2.1实现原理 2.2 程序源码 3 SVN简介 4官方例程库driver精简 5 ...

最新文章

  1. Linux 修改主机名 和 ip 映射关系
  2. 关于dlg和pro的问题
  3. 01 辅助函数之加密函数
  4. php 实现的n,php 实现数据N等分。
  5. unix 获取程序占用内存_如何减少Docker和Kubernetes中的JVM应用程序内存占用
  6. envi矢量图层外面有蓝色边框_蓝白渐层英短猫多少钱一只,美短银渐层大概多少钱...
  7. 黄聪:sqlserver 2008修改数据库表的时候错误提示“阻止保存要求重新创建表的更改”...
  8. 还真碰到不会cd命令的同事
  9. 百度云的云推送中的Native liberary not found 问题
  10. java excel导入导出案例
  11. Excel常用电子表格公式大全【汇总篇】
  12. google 企业邮箱 smtp pop3设置
  13. 常见服务器默认管理口地址
  14. LG化学成为海水淡化领域膜领导品牌后,大举进军苦咸水反渗透膜市场
  15. 黄金矿工java_欢乐黄金矿工游戏
  16. 求长方柱的体积和表面积
  17. 使用 Neo4j 图数据库可视化(网络安全)知识图谱
  18. 人工智能之父 艾伦·图灵 —— 我在战争中才华横溢,却在和平中寸步难行
  19. H5流式播放(FMP4转封装与mediaSource)
  20. Win10配置Java开发环境

热门文章

  1. 水题 逆序对 NOIP 2013 火柴排队
  2. 多少行数_经验丰富的程序员和其每日代码行数
  3. python美多商城项目百度网盘_美多商城项目(七)
  4. 河南科技大学c语言网络教学平台,计算机基础教学部
  5. Java黑皮书课后题第10章:**10.25(新的字符串split方法)String类中的split方法会返回一个字符串数组,该数组是由分隔符分隔开的子串构成的
  6. java利用求余水仙花数_java求水仙花数
  7. 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题
  8. JavaScript pop()函数弹出数组最后数据
  9. C#中的线程(三) 使用多线程
  10. 有关“优秀工作流引擎”的评价