野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11350|回复: 6

电源管理之待机模式求解

[复制链接]
发表于 2017-8-6 15:48:31 | 显示全部楼层 |阅读模式
火哥,根据您发的电源管理待机模式的源码,把源码中3个LED灯的IO口更改成我板子上的IO口(PB0,PF7,PF8),程序中说LED为红绿蓝三个,我板子上三个全是蓝的,但我都一一对应了,今天在stm32f103ZET6开发板上试了一下,发现能够进入待机,但是无法唤醒,查看中断服务函数发现没有编写中断函数,现在板子估计处于待机模式(因为无法再次烧写程序),无法退出,怎么办
主程序:
/** ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2013-xx-xx
  * @brief   待机唤醒实验
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火 F103-指南者 STM32 开发板
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */

#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./key/bsp_key.h"
#include "./usart/bsp_usart.h"


static void Delay(__IO u32 nCount);
static uint8_t KEY2_LongPress(void);


/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{       
                /* 使能电源管理单元的时钟,必须要使能时钟才能进入待机模式 */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);

        LED_GPIO_Config();       
       
  /*初始化USART1*/
  USART_Config();                       

        /*初始化按键,不需要中断,仅初始化KEY2即可,只用于唤醒的PA0引脚不需要这样初始化*/
        Key_GPIO_Config();   
       
        printf("\r\n 欢迎使用野火  STM32  开发板。\r\n");
  printf("\r\n 野火STM32 待机模式例程\r\n");
       
        printf("\r\n 实验说明:\r\n");

        printf("\r\n 1.本程序中,绿灯表示本次复位是上电或引脚复位,红灯表示即将进入待机状态,蓝灯表示本次是待机唤醒的复位\r\n");
        printf("\r\n 2.长按KEY2按键后,会进入待机模式\r\n");
        printf("\r\n 3.在待机模式下,按KEY1按键可唤醒,唤醒后系统会进行复位,程序从头开始执行\r\n");
        printf("\r\n 4.可通过检测WU标志位确定复位来源\r\n");
       
        printf("\r\n 5.在待机状态下,DAP下载器无法给STM32下载程序,需要唤醒后才能下载");

       
        //检测复位来源
        if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET)
        {
                LED_BLUE;
                printf("\r\n 待机唤醒复位 \r\n");
        }
        else
        {
                LED_GREEN;
                printf("\r\n 非待机唤醒复位 \r\n");
        }
       
  while(1)
  {                       
                // K2 按键长按进入待机模式
                if(KEY2_LongPress())
                {
                       
                        printf("\r\n 即将进入待机模式,进入待机模式后可按KEY1唤醒,唤醒后会进行复位,程序从头开始执行\r\n");
                        LED_RED;       
                        Delay(0xFFFF);
                       
                        /*清除WU状态位*/
                        PWR_ClearFlag (PWR_FLAG_WU);
                       
                        /* 使能WKUP引脚的唤醒功能 ,使能PA0*/
                        PWR_WakeUpPinCmd (ENABLE);
                       
                        /* 进入待机模式 */
                        PWR_EnterSTANDBYMode();
                }

  }
}


static void Delay(__IO uint32_t nCount)         //简单的延时函数
{
        for(; nCount != 0; nCount--);
}



/**
  * @brief  用于检测按键是否被长时间按下
  * @param  无
  * @retval 1 :按键被长时间按下  0 :按键没有被长时间按下
  */
static uint8_t KEY2_LongPress(void)
{                       
        uint8_t downCnt =0;                        //记录按下的次数
        uint8_t upCnt =0;                        //记录松开的次数                       

        while(1)        //死循环,由return结束
        {       
                Delay(0x2FFFF);                //延迟一段时间再检测

                if(GPIO_ReadInputDataBit ( KEY2_GPIO_PORT, KEY2_GPIO_PIN ) == SET)        //检测到按下按键
                {
                        downCnt++;                //记录按下次数
                        upCnt=0;                //清除按键释放记录

                        if(downCnt>=100)                //按下时间足够
                        {
                                return 1;                         //检测到按键被时间长按下
                        }
                }
                else
                {
                        upCnt++;                         //记录释放次数
                        if(upCnt>5)                    //连续检测到释放超过5次
                        {
                                return 0;                //按下时间太短,不是按键长按操作
                        }
                }//        if(GPIO_ReadInputDataBit
        }//while
}


串口调试助手显示的信息:

欢迎使用野火  STM32  开发板。

野火STM32 待机模式例程

实验说明:

1.本程序中,绿灯表示本次复位是上电或引脚复位,红灯表示即将进入待机状态,蓝灯表示本次是待机唤醒的复位

2.长按KEY2按键后,会进入待机模式

3.在待机模式下,按KEY1按键可唤醒,唤醒后系统会进行复位,程序从头开始执行

4.可通过检测WU标志位确定复位来源

5.在待机状态下,DAP下载器无法给STM32下载程序,需要唤醒后才能下载
非待机唤醒复位

即将进入待机模式,进入待机模式后可按KEY1唤醒,唤醒后会进行复位,程序从头开始执行



回复

使用道具 举报

 楼主| 发表于 2017-8-6 15:51:29 | 显示全部楼层
这是待机模式的程序,我只修改了LED灯的管脚配置

待机模式程序.rar

2.12 MB, 下载次数: 9

回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-6 16:54:47 | 显示全部楼层
问题解决了,按下复位键,在下载程序的瞬间松开(这里的程序是别的晨程序,比如流水灯之类的),可以把单片机救回正常模式,但是火哥的待机模式程序好像还是有点问题
回复 支持 反对

使用道具 举报

发表于 2017-8-7 09:38:55 | 显示全部楼层
13009621840 发表于 2017-8-6 16:54
问题解决了,按下复位键,在下载程序的瞬间松开(这里的程序是别的晨程序,比如流水灯之类的),可以把单片 ...

待机唤醒的PA0必须要能产生上升沿信号,旧版的一些板子PA0只能产生下降沿信号,所以唤醒不了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-8 19:39:05 | 显示全部楼层
flyleaf 发表于 2017-8-7 09:38
待机唤醒的PA0必须要能产生上升沿信号,旧版的一些板子PA0只能产生下降沿信号,所以唤醒不了

flyleaf哥,我用EXTI中断测试了我板子上的PA0,他是可以产生上升沿信号的,但是在待机模式里还是没办法把单片机唤醒,您能帮我看下我修改的程序吗,已经弄了好几天了,感觉没问题了,但就是无法唤醒单片机

电源管理-待机模式.rar

6.75 MB, 下载次数: 8

回复 支持 反对

使用道具 举报

发表于 2017-8-9 08:49:37 | 显示全部楼层
13009621840 发表于 2017-8-8 19:39
flyleaf哥,我用EXTI中断测试了我板子上的PA0,他是可以产生上升沿信号的,但是在待机模式里还是没办法把 ...

不用改,直接用我们的程序就可以的,程序兼容STM32F103的芯片,不行就是硬件问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-9 10:30:52 | 显示全部楼层
flyleaf 发表于 2017-8-9 08:49
不用改,直接用我们的程序就可以的,程序兼容STM32F103的芯片,不行就是硬件问题

好吧,谢谢flyleaf哥
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 14:36 , Processed in 0.064808 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表