zoukankan      html  css  js  c++  java
  • (stm32f103学习总结)—待机唤醒实验

    一、STM32待机模式介绍

    1.1 STM32低功耗模式介绍

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

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

    (1)降低系统时钟速度

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

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

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

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

    (3)待机模式( 1.8 V 内核电源关闭) 这三种模式所需的功耗是逐级递减,也就是说待机模式功耗是最低的 。三种低功耗模式汇总表如图所示:

     二、三种低功耗模式的比较

    (1)在睡眠模式中,仅关闭了内核时钟,内核停止运行但其片上外设, CM3 核心的外设全都照常运行。

    (2)在停止模式中,进一步关闭了其它所有 的时钟,于是所有的外设以及内核都停止了工作,但由于其 1.8V 区域的部分电 源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤 醒,并重新开启时钟后,还可以从上次停止处继续执行代码。

    (3)在待机模 式中,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了, 也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对 芯片复位,重新检测BOOT条件,从头开始执行程序。

    如何进入待机模式

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

      在进入待机模式后,除了复位引脚以及被设置为防侵入或校准输出时 的 TAMPER (PC13)引脚和被使能的唤醒引脚( WK_UP 脚(PA0)), 其他的 IO 引脚都将处于高阻态。

    三、待机模式配置步骤

    (1)使能电源时钟

      RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);

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

      PWR_WakeUpPinCmd(ENABLE); 

    (3)进入待机模式

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

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

    四、编写待机唤醒程序

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

    程序框架如下:

    (1)配置进入与退出待机模式 (2)编写主函数

    1 #ifndef _wkup_H
    2 #define _wkup_H
    3 
    4 #include "system.h"
    5 
    6 
    7 void Enter_Standby_Mode(void);
    8 
    9 #endif

      

     1 #include "wkup.h"
     2 
     3 /*******************************************************************************
     4 * 函 数 名         : Enter_Standby_Mode
     5 * 函数功能           : 进入待机模式
     6 * 输    入         : 无
     7 * 输    出         : 无
     8 *******************************************************************************/
     9 void Enter_Standby_Mode(void)
    10 {
    11         
    12     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR外设时钟
    13     
    14     PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up(唤醒)标志
    15     
    16     PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚    使能或者失能唤醒管脚功能
    17     
    18     
    19     PWR_EnterSTANDBYMode();//进入待机模式
    20 }
     1 #include "system.h"
     2 #include "SysTick.h"
     3 #include "led.h"
     4 #include "usart.h"
     5 #include "wkup.h"
     6 
     7 
     8 /*******************************************************************************
     9 * 函 数 名         : main
    10 * 函数功能           : 主函数
    11 * 输    入         : 无
    12 * 输    出         : 无
    13 *******************************************************************************/
    14 int main()
    15 {
    16 
    17     SysTick_Init(72);
    18     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
    19     LED_Init();
    20     USART1_Init(9600);
    21     
    22     while(1)
    23     {
    24         printf("time: 5
    ");
    25         led1=0;
    26         delay_ms(1000);    //隔1秒显示计数
    27         
    28         printf("time: 4
    ");
    29         led1=1;
    30         delay_ms(1000);
    31         
    32         printf("time: 3
    ");
    33         led1=0;
    34         delay_ms(1000);
    35         
    36         printf("time: 2
    ");
    37         led1=1;
    38         delay_ms(1000);
    39         
    40         printf("time: 1
    ");
    41         led1=0;
    42         delay_ms(1000);
    43         
    44         printf("进入系统待机模式
    ");
    45         Enter_Standby_Mode();    
    46     }
    47 }
  • 相关阅读:
    qemu-img check命令详解
    cinder migrate基础内容-1
    lvm常用指令
    ceph 快照,克隆
    http请求工作流程
    Python 生成二维码
    python 往 elasticsearch 存入数据时,文档字段类型问题注意事项
    python 往 elasticsearch 存入数据,然后通过kinaba 检索分析
    git 删除某次提交
    git 强制回滚【覆盖】远程 源码库
  • 原文地址:https://www.cnblogs.com/zhj868/p/12687978.html
Copyright © 2011-2022 走看看