0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32实例-待机唤醒实验

jf_pJlTbmA9 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2023-10-26 15:48 次阅读

本文我们来学习下STM32的待机唤醒功能。要实现的功能是:系统运行时 D1 指示灯闪烁,5 秒后进入待机模式,D1 指示灯熄灭,同时串口 printf输出相关提示信息,可通过 K_UP 按键实现唤醒。学习本内容可以参考《STM32F10x中文参考手册》-4 电源控制器(PWR)章节。

STM32低功耗模式介绍

很多单片机具有低功耗模式,比如 MSP430STM8L等。我们的STM32也不例外,相关文章:STM32低功耗模式。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为 CPU 提供时钟,并执行程序代码。当 CPU 不需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省功耗。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

当然在运行模式下,也可以通过如下方式降低功耗:

(1)降低系统时钟速度

(2)不使用 APBx 和 AHB 外设时,将对应的外设时钟关闭

STM32 提供了 3 种低功耗模式,以达到不同层次的降低功耗的目的,这三种模式如下:

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

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

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

这三种模式所需的功耗是逐级递减,也就是说待机模式功耗是最低的。三种低功耗模式汇总表如下图所示:

wKgZomUD9JuAHOQoAARkfpYyNIM263.png

我们仅对 STM32 的待机模式进行介绍,其他 2 种模式可以参考《STM32F10x 中文参考手册》-4电源控制器(PWR)章节,里面有详细的介绍。

(1)待机模式

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设, CM3 核心的外设全都照常运行。在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。在待机模式中, 它除了关闭所有的时钟, 还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 BOOT 条件,从头开始执行程序。低功耗开发相关文章:STM32低功耗开发时,需要注意的GPIO配置问题。

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

wKgaomUD9JyADy5cAANOwSXFqHM423.png

上图还列出了退出待机模式的操作,当检测到外部复位(NRST 引脚)、

IWDG 复位、 WKUP 引脚上升沿、 RTC 闹钟事件的上升沿时,微控制器退出待机模式。本文我们是通过 WKUP 引脚(PA0)上升沿来退出待机模式,当然也可以直接通过芯片复位管脚 NRST退出。

从待机模式唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有的寄存器豆被复位,程序将按照复位(启动引脚采样、复位向量已获取等)后的方式重新执行。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。

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

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

由于篇幅限制,本文并没有对待机模式相关寄存器进行介绍,大家可以参考《STM32F10x 中文参考手册》-4 电源控制器(PWR)章节,里面有详细的讲解。如果看不懂的可以暂时放下,因为我们使用的是库函数开发。

待机模式配置步骤

接下来我们介绍下如何使用库函数进入和退出待机模式。这个也是在编写程序中必须要了解的。

具体步骤如下:(电源管理相关库函数在 stm32f10x_pwr.c和 stm32f10x_pwr.h 文件中)

(1)使能电源时钟

因为低功耗模式是通过 STM32 电源(PWR)系统进行管理的,所以需要使能电源时钟,调用的库函数为:

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

(2)设置 WK_UP 引脚为唤醒源

待机唤醒方式有很多种,我们选择 WK_UP 引脚(PA0)上升沿来退出待机模式。在库函数中,设置使能 WK_UP 用于唤醒 CPU 待机模式的函数是:

PWR_WakeUpPinCmd(ENABLE);

因为按键 K_UP 连接在PA0 管脚上,并且是高电平有效,这样一来就可以使用 K_UP按键来退出待机模式。

(3)进入待机模式

进入待机模式, 首先要设置 SLEEPDEEP 位 ( 详见 《 Cortex M3 权威指南(中文)》 , chpt13 Cortex-M3 的其它特性--电源管理章节) ,接着我们通过 PWR_CR设置 PDDS 位,使得 CPU 进入深度睡眠时进入待机模式,最后执行 WFI 指令开始进入待机模式,并等待 WK_UP 中断的到来。整个操作可以通过一个库函数完成,如下:

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

通常在进入待机模式前,我们会清除唤醒标志,以等待下次进入。清除唤醒标志库函数为:

PWR_ClearFlag(PWR_FLAG_WU);//清除 Wake-up 标志

以上几步全部配置好后,我们就可以正常进入待机模式了,并且可以通过按键 K_UP或者复位按键唤醒。

特别提醒下,如果学到 RTC 实时时钟实验的时候,需要进入待机模式,如果使能了 RTC 闹钟中断的时候,进入待机模式前,必须按如下操作处理:

1.禁止 RTC 中断( ALRAIE、 ALRBIE、 WUTIE、 TAMPIE 和 TSIE 等)。

2.清零对应中断标志位。

3.清除 PWR 唤醒(WUF)标志(通过设置 PWR_CR 的 CWUF 位实现)。

4.重新使能 RTC 对应中断。

5.进入低功耗模式。

本实验使用到硬件资源如下:

(1)D1 指示灯

(2)串口 1

(3)K_UP 按键

D1指示灯、K_UP 按键、串口 1 电路在前面章节都介绍过,这里不多说。D1指示灯用来提示系统正常运行,K_UP 按键用来唤醒待机模式,串口 1 用来输出提示信息。

所要实现的功能是:系统运行时 D1 指示灯闪烁,5 秒后进入待机模式,D1 指示灯熄灭,同时串口 printf 输出相关提示信息,通过 K_UP 按键实现唤醒。

程序框架如下:

(1)配置进入与退出待机模式

(2)编写主函数

前面介绍待机模式配置步骤时,就已经讲解如何配置。下面我们打开“待机唤醒实验”工程,在 APP 工程组中可以看到添加了wkup.c文件(里面包含了待机模式驱动程序),在 StdPeriph_Driver 工程组中添加了 stm32f10x_pwr.c 库文件。电源系统管理相关操作的库函数都放在stm32f10x_pwr.c 和 stm32f10x_pwr.h 文件中,所以使用到电源系统管理就必须加入 stm32f10x_pwr.c 文件,同时还要包含对应的头文件路径。

这里我们分析几个重要函数,其他部分程序大家可以打开工程查看。

待机模式配置函数

要让系统进入待机模式,我们必须对它进行配置。进入待机模式代码如下:

/****************************************************************
* 函 数 名 : Enter_Standby_Mode
* 函数功能 : 进入待机模式
* 输 入 : 无
* 输 出 : 无
*****************************************************************/
void Enter_Standby_Mode(void)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能 PWR 外设时钟
  PWR_ClearFlag(PWR_FLAG_WU);//清除 Wake-up 标志
  PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚 使能或者失能唤醒管脚功能
  PWR_EnterSTANDBYMode();//进入待机模式
}

该函数首先使能电源PWR时钟,然后清除唤醒标志位,并使能 WK_UP管脚为唤醒方式,最后进入待机模式。这一过程在前面步骤介绍中已经提了。

主函数

配置待机模式后,我们就可以编写主函数,代码如下:

/****************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*****************************************************************/
int main()
{
  SysTick_Init(72);
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2 组
  LED_Init();
  USART1_Init(9600);
  while(1)
  {
    printf("time: 5rn");
    led1=0;
    delay_ms(1000); //隔 1 秒显示计数
    printf("time: 4rn");
    led1=1;
    delay_ms(1000);
    printf("time: 3rn");
    led1=0;
    delay_ms(1000);
    printf("time: 2rn");
    led1=1;
    delay_ms(1000);
    printf("time: 1rn");
    led1=0;
    delay_ms(1000);
    printf("进入系统待机模式rn");
    Enter_Standby_Mode();
  }
}

主函数实现的功能很简单,首先调用之前编写好的硬件初始化函数,包括

SysTick 系统时钟,中断分组,LED 初始化等。然后进入 while 循环,每间隔一秒让 printf 输出一个信息,同时指示灯状态发生变化。倒计 5 秒钟后,调用函数 Enter_Standby_Mode进入待机模式,此时指示灯熄灭。

将工程程序编译后下载到开发板内,可以看到系统运行时 D1 指示灯不断闪烁,5 秒钟后进入待机模式,此时 D1 指示灯熄灭。当按下 K_UP 按键或复位按键时,待机模式被唤醒,系统重新运行,同时串口打印提示信息。如果想在串口调试助手上看到输出信息,可以打开“串口调试助手”,首先勾选下标号 1 DTR 框,然后再取消勾选。这是因为此串口助手启动时会把系统复位住, 通过 DTR 状态切换下即可。然后设置好波特率等参数后,串口助手上即会收到 printf发送过来的信息。(串口助手上先勾选下标号1 DTR框,然后再取消勾选)如下图所示。

wKgZomUD9J-AKy0LAATfaIFzDAw254.png

实验说明:下载待机唤醒实验程序后,若使用普中 ARM 仿真器下载其他的程序会出现报警,这是因为处于低功耗模式时,所有外设时钟都已关闭,所以需要在下载程序前先复位下系统。

来源:STM32嵌入式开发
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2249

    文章

    10725

    浏览量

    350316
  • 低功耗
    +关注

    关注

    10

    文章

    2247

    浏览量

    103005
收藏 人收藏

    评论

    相关推荐

    关于STM32待机唤醒功能

    本文我们来学习下STM32待机唤醒功能。要实现的功能是:系统运行时 D1 指示灯闪烁,5 秒后进入待机模式,D1 指示灯熄灭,同时串口 printf输出相关提示信息,可通过 K_UP
    发表于 07-20 17:57 5533次阅读

    请问ucosii stm32待机唤醒唤醒源怎么区分?

    我用stm32+ucosii写了一个程序,现在碰到了一个关于休眠唤醒的问题。首先我采用的是待机模式休眠、wkup脚唤醒重启,同时防止系统跑飞,加了软狗和硬狗监测系统。现在是
    发表于 10-08 08:11

    「正点原子STM32Mini板资料连载」第十九章 待机唤醒实验

    1)实验平台:正点原子STM32mini开发板2)摘自《正点原子STM32 不完全手册(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子第十九章 待机
    发表于 04-09 11:30

    STM32待机唤醒的实现方法

    唤醒。具体程序参考原子哥的唤醒实验代码。从正常运行模式切换到待机模式:按住wkup键 外部中断0中断被触发 执行中断服务函数 Check_up()函数开始检测 如果时间没超过3s 返回
    发表于 05-26 07:00

    STM32待机唤醒实验分析

    STM32待机唤醒实验分析(基于原子哥程序)  
    发表于 02-02 07:09

    STM32实现待机唤醒

    STM32实现待机唤醒 寄存器版上篇使用了库函数实现 待机唤醒本文将使用寄存器版本实现关机模式寄存器版本跟库函数版本实现基本一致,可以通过查
    发表于 08-17 09:10

    STM32实现待机唤醒

    STM32实现待机唤醒 库函数版很多单片机都有低功耗模式,STM32 也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代
    发表于 08-18 06:59

    记录STM32待机模式的进入和唤醒

    数据,采集完毕进入停止模式,定时器唤醒等待下次数据采集。(stm32f103ret6)备注:本节只记录待机模式的进入和唤醒,停止模式的实现方式见[S
    发表于 08-18 06:46

    请问STM32如何实现待机唤醒

    请问STM32如何实现待机唤醒
    发表于 11-23 06:20

    如何对STM32单片机的待机模式进行唤醒实验

    STM32单片机有哪几种低功耗模式呢?如何对STM32单片机的待机模式进行唤醒实验呢?
    发表于 11-25 06:37

    ALIENTEK_MINISTM32_实验12_待机唤醒实验

    ALIENTEK MINISTM32 实验12 待机唤醒实验,很好的资料,快来下载吧
    发表于 02-19 11:36 6次下载

    STM32CubeMX系列|待机唤醒

    待机唤醒1. 低功耗模式简介2. 硬件设计本实验用D1指示灯提示系统正常运行,指示灯熄灭表示进入待机模式,K_UP按键用来唤醒
    发表于 12-24 19:11 0次下载
    <b class='flag-5'>STM32</b>CubeMX系列|<b class='flag-5'>待机</b><b class='flag-5'>唤醒</b>

    stm32的低功耗模式---->待机唤醒

    嵌入式设备的续航时间在这个时代也越发重要了stm32有三种低功耗模式---->睡眠模式,待机唤醒,停止模式功耗选择:低到高 待机唤醒--
    发表于 12-31 19:03 5次下载
    <b class='flag-5'>stm32</b>的低功耗模式----><b class='flag-5'>待机</b><b class='flag-5'>唤醒</b>

    STM32学习心得二十二:低功耗待机唤醒实验

    记录一下,方便以后翻阅~主要内容:1) STM32低功耗模式讲解;2) 寄存器和库函数配置;3) 实验代码解读。实验功能:针对GPIOA,引脚0,启动后LED0和LED1闪烁,长按3秒进入
    发表于 12-31 19:09 13次下载
    <b class='flag-5'>STM32</b>学习心得二十二:低功耗<b class='flag-5'>待机</b><b class='flag-5'>唤醒</b><b class='flag-5'>实验</b>

    基于STM32单片机待机唤醒实验使用库文件设计

    基于STM32单片机待机唤醒实验使用库文件设计源代码
    发表于 04-26 14:45 0次下载