stm32l0的停止模式怎么唤醒_「正点原子STM32Mini板资料连载」第十九章 待机唤醒实验...

1)实验平台:正点原子STM32mini开发板

2)摘自《正点原子STM32 不完全手册(HAL 库版)关注官方微信号公众号,获取更多资料:正点原子

a9f6a63d0a9464c645ac8bcb5a0c45f2.png

第十九章 待机唤醒实验

本章我们将向大家介绍 STM32 的待机唤醒功能。在本章中,我们将使用 WK_UP 按键来实

现唤醒和进入待机模式的功能,然后使用 DS0 指示状态。本章将分为如下几个部分:

19.1 STM32 待机模式简介

19.2 硬件设计

19.3 软件设计

19.4 下载验证

19.1 STM32 待机模式简介

很多单片机都有低功耗模式,STM32 也不例外。在系统或电源复位以后,微控制器处于运

行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,

可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗,

最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。STM32 的 3 种低功耗模

式我们在 5.2.4 节有粗略介绍,这里我们再回顾一下。

STM32 的低功耗模式有 3 种:

1)睡眠模式(CM3 内核停止,外设仍然运行)

2)停止模式(所有时钟都停止)

3)待机模式(1.8V 内核电源关闭)

在运行模式下,我们也可以通过降低系统时钟关闭 APB 和 AHB 总线上未被使用的外设的

时钟来降低功耗。三种低功耗模式一览表见表 19.1.1 所示:

db0a9a90222d9d5010630a713b04849b.png

表 19.1.1 STM32 低功耗一览表

在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要 2uA 左右的电

流。停机模式是次低功耗的,其典型的电流消耗在 20uA 左右。最后就是睡眠模式了。用户可

以根据自己的需求来决定使用哪种低功耗模式。

本章,我们仅对 STM32 的最低功耗模式-待机模式,来做介绍。待机模式可实现 STM32

的最低功耗。该模式是在CM3 深睡眠模式时关闭电压调节器。整个1.8V 供电区域被断电。PLL、

HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。仅备份的寄存器和待机电路维持供电。

那么我们如何进入待机模式呢?其实很简单,只要按图 19.1.1 所示的步骤执行就可以了:

ebd8f4d8064ddb0dbaa09b266c059d19.png

图 19.1.1 STM32 进入及退出待机模式的条件

图 19.1.1 还列出了退出待机模式的操作,从图 19.1.1 可知,我们有 4 种方式可以退出待机

模式,即当一个外部复位(NRST 引脚)、IWDG 复位、WKUP 引脚上的上升沿或 RTC 闹钟事件

发生时,微控制器从待机模式退出。从待机唤醒后,除了电源控制/状态寄存器(PWR_CSR),所

有寄存器被复位。

从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚,读取复位向量等)。

电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。

在进入待机模式后,除了复位引脚以及被设置为防侵入或校准输出时的 TAMPER 引脚和被

使能的唤醒引脚(WK_UP 脚),其他的 IO 引脚都将处于高阻态。

图 19.1.1 已经清楚的说明了进入待机模式的通用步骤,其中涉及到 2 个寄存器,即电源控

制寄存器(PWR_CR)和电源控制/状态寄存器(PWR_CSR)。下面我们介绍一下这两个寄存器:

电源控制寄存器(PWR_CR),该寄存器的各位描述如图 19.1.2 所示:

cc602198b71ca19d1372c2d027031c8a.png

这里我们通过设置 PWR_CR 的 PDDS 位,使 CPU 进入深度睡眠时进入待机模式,同时我

们通过 CWUF 位,清除之前的唤醒位。电源控制/状态寄存器(PWR_CSR)的各位描述如图 19.1.3

所示:

c0105fe579b252865acd4273b0e99cab.png

图 19.1.3 PWR_ CSR 寄存器各位描述

这里,我们通过设置 PWR_CSR 的 EWUP 位,来使能 WKUP 引脚用于待机模式唤醒。我

们还可以从 WUF 来检查是否发生了唤醒事件。不过本章我们并没有用到。

通过以上介绍,我们了解了进入待机模式的方法,以及设置 WK_UP 引脚用于把 STM32

从待机模式唤醒的方法。具体步骤如下:

1)使能 PWR 时钟。

因为要配置 PWR 寄存器,所以必须先使能 PWR 时钟。

在 HAL 库中,使能 PWR 时钟的方法是:

__HAL_RCC_PWR_CLK_ENABLE(); //使能 PWR 时钟

2) 设置 WK_UP 引脚作为唤醒源。

使能时钟之后后再设置 PWR_CSR 的 EWUP 位,使能 WK_UP 用于将 CPU 从待机模式唤

醒。在 HAL 库中,设置使能 WK_UP 用于唤醒 CPU 待机模式的函数是:

HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); //设置 WKUP 用于唤醒

3)设置 SLEEPDEEP 位,设置 PDDS 位,执行 WFI 指令,进入待机模式。

进入待机模式,首先要设置 SLEEPDEEP 位(详见《CM3 权威指南》,第 182 页表 13.1)

接着我们通过 PWR_CR 设置 PDDS 位,使得 CPU 进入深度睡眠时进入待机模式,最后执行

WFI 指令开始进入待机模式,并等待 WK_UP 中断的到来。在库函数中,进行上面三个功能进

入待机模式是在函数 HAL_PWR_EnterSTANDBYMode 中实现的:

void HAL_PWR_EnterSTANDBYMode(void);

4)最后编写 WK_UP 中断服务函数。

因为我们通过 WK_UP 中断(PA0 中断)来唤醒 CPU,所以我们有必要设置一下该中断函

数,同时我们也通过该函数里面进入待机模式。关于外部中断服务函数以及中断服务回调函数

的使用方法请参考外部中断实验,这里我们就不做过多讲解。

通过以上几个步骤的设置,我们就可以使用 STM32F1 的待机模式了,并且可以通过

KEY_UP 来唤醒 CPU,我们最终要实现这样一个功能:通过长按(3 秒)KEY_UP 按键开机,

并且通过 DS0 的闪烁指示程序已经开始运行,再次长按该键,则进入待机模式,DS0 关闭,程

序停止运行。类似于手机的开关机。

19.2 硬件设计

本实验用到的硬件资源有:

1) 指示灯 DS0

2) WK_UP 按键

3) TFTLCD 模块

本章,我们使用了 WK_UP 按键用于唤醒和进入待机模式。然后通过 DS0 和 TFTLCD 模块

来指示程序是否在运行。这几个硬件的连接前面均有介绍。

19.3 软件设计

打开待机唤醒实验工程,我们可以发现工程中多了一个 wkup.c 和 wkup.h 文件,相关的用

户代码写在这两个文件中。同时,对于待机唤醒功能,我们需要引入 stm32f1xx_hal_pwr.c 和

stm32f1xx_hal_pwr.h 文件。

打开 wkup.c,可以看到如下关键代码:

//系统进入待机模式

void Sys_Enter_Standby(void)

{

__HAL_RCC_APB2_FORCE_RESET(); //复位所有 IO 口

__HAL_RCC_PWR_CLK_ENABLE(); //使能 PWR 时钟

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //清除 Wake_UP 标志

HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); //设置 WKUP 用于唤醒

HAL_PWR_EnterSTANDBYMode(); //进入待机模式

}

//检测 WKUP 脚的信号

//返回值 1:连续按下 3s 以上

// 0:错误的触发

u8 Check_WKUP(void)

{

u8 t=0; //记录按下的时间LED0=0; //亮灯 DS0

while(1)

{

if(WKUP_KD)

{

t++;

//已经按下了

delay_ms(30);

if(t>=100)

//按下超过 3 秒钟

{

LED0=0;

//点亮 DS0

return 1; //按下 3s 以上了

}

}else

{

LED0=1;

return 0; //按下不足 3 秒

}

}

}

//外部中断线 0 中断服务函数

void EXTI0_IRQHandler(void)

{

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

}

//中断线 0 中断处理过程

//此函数会被 HAL_GPIO_EXTI_IRQHandler()调用

//GPIO_Pin:引脚

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin==GPIO_PIN_0)//PA0

{

if(Check_WKUP())//关机

{

Sys_Enter_Standby();//进入待机模式

}

}

}

//PA0 WKUP 唤醒初始化

void WKUP_Init(void)

{

GPIO_InitTypeDef GPIO_Initure;

__HAL_RCC_GPIOA_CLK_ENABLE();

//开启 GPIOA 时钟

GPIO_Initure.Pin=GPIO_PIN_0;

//PA0

GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //中断,上升沿

GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉

GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //快速

HAL_GPIO_Init(GPIOA,&GPIO_Initure);

//检查是否是正常开机

if(Check_WKUP()==0)

{

Sys_Enter_Standby();//不是开机,进入待机模式

}

HAL_NVIC_SetPriority(EXTI0_IRQn,0x02,0x02);//抢占优先级 2,子优先级 2

HAL_NVIC_EnableIRQ(EXTI0_IRQn);

}

该部分代码比较简单,我们在这里说明三点:

1,在 void Sys_Enter_Standby(void)函数里面,我们要在进入待机模式前把所有开启的外设

全部关闭,我们这里仅仅复位了所有的 IO 口,使得 IO 口全部为浮空输入。其他外设(比如

ADC 等),大家根据自己所开启的情况进行一一关闭就可,这样才能达到最低功耗! 然后我们

调 用 __HAL_RCC_PWR_CLK_ENABLE() 来 使 能

PWR

时 钟 , 调 用 函 数

HAL_PWR_EnableWakeUpPin() 用 来 设 置 WK_UP 引脚作为唤醒源。 最后调用

HAL_PWR_EnterSTANDBYMode()函数进入待机模式。

2,在 void WKUP_Init(void)函数里面,我们首先要使能 GPIOA 时钟,然后对 GPIOA 初始

化为下拉输入,上升沿触发中断,同时初始化 NVIC 中断优先级。这上面的步骤实际上跟我们

之前的外部中断实验知识是一样的,所以不理解的地方大家可以翻到外部中断实验章节看看。

接下来程序通过判断 WK_UP 是否按下了 3 秒钟,来决定要不要开机,如果没有按下 3 秒钟,

程序直接就进入了待机模式。所以在下载完代码的时候,是看不到任何反应的。我们必须先按

WK_UP 按键 3 秒开机,才能看到 DS0 闪烁。

3,外部中断回调函数 HAL_GPIO_EXTI_Callback 内,我们通过调用函数 Check_WKUP()

来判断 WK_UP 按下的时间长短,来决定是否进入待机模式,如果按下时间超过 3 秒,则进入

待机,否则退出中断。

wkup.h 部分代码比较简单,我们就不多说了。最后我们看看 main 函数内容如下:

int main(void)

{

HAL_Init();

//初始化 HAL 库

Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M

delay_init(72);

//初始化延时函数

uart_init(115200);

//初始化串口

usmart_dev.init(84);

//初始化 USMART

LED_Init();

//初始化 LED

LCD_Init();

//初始化 LCD

WKUP_Init();

//待机唤醒初始化

POINT_COLOR=RED;

LCD_ShowString(30,50,200,16,16,"Mini STM32");

LCD_ShowString(30,70,200,16,16,"WKUP TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(30,110,200,16,16,"2019/11/15");

while(1)

{

LED0=!LED0;

delay_ms(250);

}

}

这里我们先初始化 LED 和 WK_UP 按键(通过 WKUP_Init()函数初始化),如果检测到

有长按 WK_UP 按键 3 秒以上,则开机,并执行 LCD 初始化,在 LCD 上面显示一些内容,如

果没有长按,则在 WKUP_Init 里面,调用 Sys_Enter_Standby 函数,直接进入待机模式了。

开机后,在死循环里面等待 WK_UP 中断的到来,在得到中断后,在中断函数里面判断

WK_UP 按下的时间长短,来决定是否进入待机模式,如果按下时间超过 3 秒,则进入待机,

否则退出中断,继续执行 main 函数的死循环等待,同时不停的取反 LED0,让红灯闪烁。

代码部分就介绍到这里,大家记住下载代码后,一定要长按 WK_UP 按键,来开机,否则

将直接进入待机模式,无任何现象。

19.4 下载与测试

在代码编译成功之后,下载代码到 ALIENTEK MiniSTM32 开发板上,此时,看到开发板

DS0 亮了一下(Check_WKUP 函数执行了 LED0=0 的操作),就没有反应了。其实这是正常的,

在程序下载完之后,开发板检测不到 WK_UP 的持续按下(3 秒以上),所以直接进入待机模式,

看起来和没有下载代码一样。此时,我们长按 WK_UP 按键 3 秒钟左右,可以看到 DS0 开始闪

烁。然后再长按 WK_UP,DS0 会灭掉,程序再次进入待机模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pgbouncer 介绍

Pgbouncer 介绍 PostgreSQL 的轻量的连接池。 特性 在轮转连接的时候有好几种方式:Session pooling/会话连接池最礼貌的方法。在客户端连接的时候,在它的连接生命期内,会给它赋予一个服务器连接。在客户端断开的时候,服务器连接会…

阿里全球数学竞赛落幕:全球最强73人出炉,北大获奖人数第一,还“炸出”各路世界大牛...

全世界只有3.14 % 的人关注了爆炸吧知识来源:量子位 ID:QbitAI作者:边策 金磊又是一场学霸的盛宴。阿里达摩院举办的第二届数学竞赛今天顺利结束,这场号召全民参与的数学竞赛,初赛的题目画风是这样的:是不…

【Azure + Core】实现CI/CD(一)构建镜像并推送仓库

(海上生明月,天涯共此时)今天是农历八月十六,大家中秋节快乐!放了三天假,和家人整理下屋子,打扫下卫生,闲着无聊就研究点儿新东西。最近一直再看DevOps相关的内容,自从开…

detectron2训练自己的数据集_keras版MaskRCNN来训练自己的目标检测数据集

向AI转型的程序员都关注了这个号👇👇👇机器学习AI算法工程 公众号:datayx一、运行环境的安装:1、下载好cuda9跟cudnn7,然后在安装好后,cuda其会自动添加到环境变量里,所以使用kera…

Win7系统中必需记住的14个常用快捷键

在使用电脑时,多多少少地都会用到一些快捷键,尤其是在玩游戏,或使用一些软件时。快捷键不仅方便,如果用的好,甚至可以大大提升我们的工作效率。而且,快捷键不仅可以在软件中使用,在Win7系统中其…

git 删除远程分支

2019独角兽企业重金招聘Python工程师标准>>> git branch -r -d origin/dev git push origin :dev 注意: git push origin 后面有个空格 转载于:https://my.oschina.net/u/1176097/blog/391573

我看过《隐秘的角落》才知道,理科生有多可怕!

全世界只有3.14 % 的人关注了爆炸吧知识最近,大家都被《隐秘的角落》刷屏了吧?但吃瓜、看瓜的背后,我看到了理科生的可怕之处。数学课上,为了暗示朱朝阳自己杀人其实是因为被背叛,张东升利用笛卡尔在爱情里或美好与悲惨…

mysql sleep详解_sql注入详解(二)

sql注入详解4、检测方法首先是判断能不能进行sql注入是哪种sql注入(1)数字型?id1 and 11 返回成功?id1 and 12 返回失败这说明是数字型注入,或者叫整型注入此时后台是select * from where id x and 11select * from where id x and 12显然一个判断为真&#x…

Visual Studio的奇淫技巧,你知道多少?

如果你像我一样,或许你也沉迷于开发者工具。这就是我喜欢 Visual Studio 的原因之一——它有无数的生产力技巧。这篇文章将展示五个这样的技巧,这些技巧对我每天的工作都有帮助。请注意,这些仅适用于 Visual Studio。有像ReSharper[1]、Rosly…

promise的状态以及api介绍_前端 api 请求缓存

作者:wsafighthttps://github.com/wsafight/personBlog/issues/2web开发时,性能都是必不可少的话题。对于webpack打包的单页面应用程序而言,我们可以采用很多方式来对性能进行优化,比方说 tree-shaking、模块懒加载、利用 extrens…

哎,累死了~..~

下午睡觉一起床,打开博客园时,才发现后台原来可以用CSS来弄主页啊,我个猪头,才发现。。。弄了一下午,终于搞了个像样的,嘿嘿,浪漫典雅,不失严谨,有点类似Metro风格&#…

RedHat el5.0 搭建 Postfix 邮件服务器系统一

RedHat el5.0 搭建 Postfix 邮件服务器系统 (postfixcyrus-sasl2courier-authlibcourier-imapextmailmaildrop) 一、系统环境 操作系统:rhel-5.2 所需软件(按网上以前的文档,好多版本都找不到&#xff…

C# 数据结构--排序[下]

希尔排序&#xff08;Shell Sort&#xff09; 排序思想&#xff1a; 先取一个小于n的整数d1作为第一个增量&#xff0c;把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序&#xff1b;然后&#xff0c;取第二个增量d2<d1重复上述的…

奥林匹克数学竞赛教练员汇编,最牛奥数资料全集!

全世界只有3.14 % 的人关注了爆炸吧知识1985年&#xff0c;由北京大学、南开大学、复旦大学和中国科技大学四所大学倡议&#xff0c;中国数学会决定&#xff0c;自1986年起每年一月份&#xff08;第29届起改为每年12月举行&#xff09;举行全国中学生数学冬令营&#xff0c;后又…

成长 | 《大厂晋升指南》学习总结(中)

【学习总结】| Edison Zhou上一篇总结了晋升体系和职级详解&#xff0c;本篇总结面评技巧和学习方法。温馨提示&#xff1a;文中的贴图均来自极客时间《大厂晋升指南》课程。1面评技巧PPT框架华仔在多年的晋升答辩评委经历中总结了晋升答辩PPT的3个常见误区&#xff1a;&#x…

window.location.reload()会掉参数吗_iPhone手机电量不够用,你真的会用苹果吗?设置好这几个就OK了!...

用过iPhone的小伙伴都知道iPhone手机里的IOS系统&#xff0c;正是因为IOS系统独特的流畅度吸引了很多的用户成为了果粉。但是如今在中国市场上&#xff0c;iPhone手机在市场上占据的份额一年比一年低&#xff0c;近几年新兴崛起的国产手机华为、VIVO、小米以及年青人品牌的魅族…

Linux 下 MySQL 启动与关闭 说明

一.启动1.1 MySQL 进程可以用ps 命令查看进程&#xff1a;[rootrac2 ~]# ps -ef|grep mysqlroot 2161 1 0 09:38 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe--datadir/var/lib/mysql --pid-file/var/lib/mysql/rac2.pidmysql 2418 2161 0 09:38 ? …

历史上有哪些看似经PS处理实则没有的照片?

全世界只有3.14 % 的人关注了爆炸吧知识使用过xp系统的朋友&#xff0c;对这张图&#xff0c;肯定很是熟悉&#xff0c;毕竟是作为xp系统的经典桌面&#xff0c;名为Bliss。这张图是1996年在美国加利福尼亚州锁诺玛县&#xff0c;锁诺玛山谷南部靠近一家乳品公司旧址拍摄。摄影…

iNeuLink硬件网关与iNeuOS工业互联网操作系统互联互通应用案例

目 录1. 应用概述... 22. 模拟硬件设备配置... 23. iNeuLink硬件网关配置... 43.1 硬件介绍... 43.2 硬件网关配置... 44. iNeuOS工业互联网操作系统配置... 61. 应用概述有一个生产镍的矿业集团&#xff0c;要整合不同厂区的…

dubbo优势_Dubbo 迈出云原生重要一步 应用级服务发现解析

作者 | 刘军(陆龟) Apache Dubbo PMC概述社区版本 Dubbo 从 2.7.5 版本开始&#xff0c;新引入了一种基于实例(应用)粒度的服务发现机制&#xff0c;这是我们为 Dubbo 适配云原生基础设施的一步重要探索。版本发布到现在已有近半年时间&#xff0c;经过这段时间的探索与总结&a…