【STM32】待机唤醒程序示例
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】待机唤醒程序示例相关推荐
- 【STM32】RTC程序示例
00. 目录 文章目录 00. 目录 01. RTC时钟简介 02. 硬件设计 03. RTC日历配置步骤 04. 设置和获取日期示例 05. 设置闹钟中断示例 06. 设置唤醒中断示例 07. 附录 ...
- STM32——待机唤醒实验-低功耗-M4
一.低功耗模式介绍 低功耗模式:在系统或者电源复位后,微控制器出于运行状态之下,HCLK为CPU提供时钟,内核执行代码.当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发 ...
- 【STM32】ADC程序示例
00. 目录 文章目录 00. 目录 01. ADC简介 02. 硬件资源 03. 编程思路 04. 程序示例 05. 预留 06. 附录 07. 声明 01. ADC简介 STM32F4xx 系列一 ...
- (24)STM32——待机唤醒(低功耗)笔记
目录 学习目标 运行结果 待机唤醒 模式 待机模式 寄存器 配置 代码 总结 学习目标 本节我们讲解的是有关待机唤醒的知识,这部分知识在51中并未涉及到,我感觉还是有点意思的,有点类似与我们手机的锁屏 ...
- 【STM32】SPI程序示例
00. 目录 文章目录 00. 目录 01. SPI简介 02. 功能描述 03. 硬件模块 04. 软件设计 05. 结果验证 06. 附录 07. 声明 01. SPI简介 SPI 是英语 Ser ...
- 【STM32】DMA程序示例
00. 目录 文章目录 00. 目录 01. DMA简介 02. 功能描述 03. 硬件设计 04. 程序设计 05. 结果验证 06. 附录 07. 声明 01. DMA简介 DMA,全称为:Dir ...
- 【STM32】DAC程序示例
00. 目录 文章目录 00. 目录 01. DAC简介 02. 硬件模块 03. 程序设计 04. 结果验证 05. 预留 06. 附录 07. 声明 01. DAC简介 STM32F4的DAC模块 ...
- STM32之待机唤醒
前段时间我稍微涉及节能减排大赛..倡导节能的社会..没错了.你真是太聪明了..知道了我今天要讲关于STM32节能方面的模块..没错..这标题已经告诉你了是吧..哦,对,标题有写..所以..言归正传.至 ...
- STM32开发,HAL函数实现待机唤醒功能以及SVN使用简介
STM32开发,HAL函数实现待机唤醒功能以及SVN简介 1 概述 1.1 资源概述 1.2 实现功能 2 程序实现 2.1实现原理 2.2 程序源码 3 SVN简介 4官方例程库driver精简 5 ...
最新文章
- Linux 修改主机名 和 ip 映射关系
- 关于dlg和pro的问题
- 01 辅助函数之加密函数
- php 实现的n,php 实现数据N等分。
- unix 获取程序占用内存_如何减少Docker和Kubernetes中的JVM应用程序内存占用
- envi矢量图层外面有蓝色边框_蓝白渐层英短猫多少钱一只,美短银渐层大概多少钱...
- 黄聪:sqlserver 2008修改数据库表的时候错误提示“阻止保存要求重新创建表的更改”...
- 还真碰到不会cd命令的同事
- 百度云的云推送中的Native liberary not found 问题
- java excel导入导出案例
- Excel常用电子表格公式大全【汇总篇】
- google 企业邮箱 smtp pop3设置
- 常见服务器默认管理口地址
- LG化学成为海水淡化领域膜领导品牌后,大举进军苦咸水反渗透膜市场
- 黄金矿工java_欢乐黄金矿工游戏
- 求长方柱的体积和表面积
- 使用 Neo4j 图数据库可视化(网络安全)知识图谱
- 人工智能之父 艾伦·图灵 —— 我在战争中才华横溢,却在和平中寸步难行
- H5流式播放(FMP4转封装与mediaSource)
- Win10配置Java开发环境
热门文章
- 水题 逆序对 NOIP 2013 火柴排队
- 多少行数_经验丰富的程序员和其每日代码行数
- python美多商城项目百度网盘_美多商城项目(七)
- 河南科技大学c语言网络教学平台,计算机基础教学部
- Java黑皮书课后题第10章:**10.25(新的字符串split方法)String类中的split方法会返回一个字符串数组,该数组是由分隔符分隔开的子串构成的
- java利用求余水仙花数_java求水仙花数
- 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题
- JavaScript pop()函数弹出数组最后数据
- C#中的线程(三) 使用多线程
- 有关“优秀工作流引擎”的评价