问答

汇集网友智慧,解决技术难题

21ic问答首页 - StandBY待机模式,WakeUp失效,只能通过NRTST复位

STANDBY 单片机 技术交流 嵌入式 ST 失效

StandBY待机模式,WakeUp失效,只能通过NRTST复位

MOUN2023-05-03
不知道怎么添加本地图片#include "stm32f10x.h"
#include "stdint.h"
#include "LED.h"
#include "KEY.h"
#include "stdio.h"
#include "OLED.h"

#include "PRINTF.h"//虽然名字是是打印,但是重定向到OLED失败了,这里是待机初始化有关的函数

static void Delay(__IO uint32_t nCount);

//进入休眠:熄灯,并显示“StandBy”
//退出休眠:亮灯,并显示“welcome to use”
int main(void)
{
        //初始化复位按键,这是特殊的,尽管在待机模式下不识别外部中断?擦擦擦啊
        WakeUp_Init();
       
        //屏幕初始化
        OLED_Init();

        //灯泡引脚初始化
        LED_GPIO_Config();
       
        //初始化进入待机按键,这里长按进入待机,引脚是PA6
        Key_GPIO_Config();
       

       
        OLED_ShowString(1,1,"WelCome to use");
       
        //延时,让屏幕显示久一点让你看到
        Delay(0x3fffff);

        //从待机唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有寄存器被复位
        //检查WakeUp标志位,如果是1,就代表是从待机模式下唤醒
        if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET)
        {
                OLED_ShowString(1,1,"From StandBy");
                        Delay(0x3fffff);

        }
        else
        {
                OLED_ShowString(1,1,"Not From StandBy");
                        Delay(0x3fffff);

        }
        while(1)
        {
       
                OLED_ShowString(1,1,"Working");
                LED_H(LED_GPIO_PORT,LED_GPIO_PIN);
               
                //长按进入待机状态
                if(KEY2_LongPress())
                {
                       
                OLED_ShowString(1,1,"StandBy");       
                Delay(0x5fffff);
                       
                /*进入待机模式,清除WakeUp标志位也是在这里*/
                Enter_StandBy();
                       
                }

               

        }
}

static void Delay(__IO uint32_t nCount)
{
        for (; nCount!=0;nCount--);
}

###NextPage[title=EnterStandBy()函数,WakeUp_Init()函数]###
#include "PRINTF.h"


void WakeUp_Init(void)
{       

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR ,ENABLE);

        /*打开WakeUp唤醒功能*/
        PWR_WakeUpPinCmd(ENABLE);
       
}

void Enter_StandBy(void)
{
        /*清除唤醒标志位*/
        PWR_ClearFlag (PWR_FLAG_WU);       

        //清除待机标志位
        PWR_ClearFlag(PWR_FLAG_SB);
       
        /*进入待机模式*/
        PWR_EnterSTANDBYMode();
}


回答 +关注 16
1128人浏览 0人回答问题 分享 举报
0 个回答

您需要登录后才可以回复 登录 | 注册