zoukankan      html  css  js  c++  java
  • stm32实现待机唤醒

    STM32的低功耗模式有3种:
    1、睡眠模式(CM3内核停止,外设仍然运行)
    2、停机模式(所有时钟都停止)
    3、待机模式(1.8v内核电源关闭)

    进入待机模式的方法,以及设置WK_UP引脚用于把STM32从待机模式唤醒的方法
    一般步骤如下:
    1、设置SLEEPDEEP位
    SCB_SCR的第二位
    2、使能电源时钟,设置WK_UP引脚作为唤醒源
    因为要配置电源控制寄存器,所以必须先使能电源时钟。然后再设置PWR_CSR的EWUP位,使能WK_UP用于将CPU从待机模式唤醒。
    3、设置 PDDS PDDS位,执行 WFI 指令,进入待机模式。
    通过 PWR_CR 设置 PDDS 位,使得 CPU 进入深度睡眠时待机模式,最后执行 WFI指令开始进入待机模式,并等WK_UP中断的到来
    4、最后编写WK_UP中断函数

    下面是进入待机模式的代码

    //进入待机模式
    void STAND_By(void){
        SCB->SCR |= 1<<2; //设置SLEEPDEEP位
        RCC->APB1ENR |= 1<<28;//使能电源时钟
        PWR->CSR |= 1<<8;    //设置WK_UP作为唤醒源
        PWR->CR |= 1<<1;    //设置PDDS位,进入深睡眠模式
        PWR->CR |= 1<<2; //清除唤醒位
        __ASM volatile("wfi"); //执行WFI命令
    }

    最后实现的现象是,烧入程序,复位后,开始执行程序,进入待机模式,长按WK_UP键3秒,退出待机模式,重新执行代码(从待机模式唤醒后的代码执行 等同于复位后代码的执行),小灯开始闪烁。

    之后如果再次长按WK_UP键3秒,就会再次进入待机模式。

    //WK_UP键初始化
    void WKUP_Init(void){
        RCC->APB2ENR |= 1<< 2; //使能GPIOA时钟
        //设置GPIOA为上拉输入
        GPIOA->CRL &= 0xFFFFFFF0;
        GPIOA->CRL |= 0x00000008;
        GPIOA->IDR |= 1<<0; 
        
        //中断配置
        Ex_NVIC_Config(GPIO_A,0,RTIR);//上升沿有效   
        if(CHECK_Wkup()==0) STAND_By();
        MY_NVIC_Init(2,2,EXTI0_IRQn,2);//中断分组    
    }

    上诉代码中非常重要的一句话是:

    if(CHECK_Wkup()==0) STAND_By();

     只有加上这句话,才能实现长按唤醒,而不是一按就唤醒。

  • 相关阅读:
    SQL Server 重新组织生成索引
    atitit.软件设计模式大的总结attialx总结
    Linux防火墙限制指定port仅仅能由指定IP訪问
    android TextView里边实现图文混配效果
    Codeforces Round #270
    HTML5中x-webkit-speech语音输入功能
    oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)
    Android-HttpURLConnection自己主动管理cookie
    iOS UI01_UIView
    Okio简化处理I/O操作原理
  • 原文地址:https://www.cnblogs.com/cuglkb/p/6289549.html
Copyright © 2011-2022 走看看