野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21116|回复: 1

停止模式卡住了怎么办

[复制链接]
发表于 2014-5-28 19:04:09 | 显示全部楼层 |阅读模式
就是进入停止模式之前初始化外部中断,之后进入停止模式之后按键没反应啊,我自己用我自己做的板子的
主函数里Sleep_Init();
        Sleep_ON;


#ifndef __SLEEP_H__
#define __SLEEP_H__

#define Sleep_ON  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , ENABLE)
#define Sleep_Off  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , DISABLE)
void Sleep_Init(void);
void SLEEP_TIM_Mode_Init(void);
void Sleep_In(void);
void SYSCLKConfig_WakeUp(void);
void EXTI_WakeUp_Config(void);
void Sleep_Out(void);
#endif


#include "sleep.h"


/******************************************************************************************
************************************自动待机部分设置*****************************************
*******************************************************************************************/
uint16_t Time_Acount;
/*************************************
*中断向量配置
**************************************/
        void TIM6_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                                                                                         
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;          
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
/*************************************
*定时器初始化函数
**************************************/
void SLEEP_TIM_Mode_Init(void)
{
                TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
               
                /* 设置TIM2CLK 为 72MHZ */
               
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , ENABLE);
    //TIM_DeInit(TIM6);
       
        /* 自动重装载寄存器周期的值(计数值) */
                /*每接收到50KHz时候引起中断事件,而
                引发一次的时间为50KHz/10khz/S=5s
                */
        TIM_TimeBaseStructure.TIM_Period=50000;
       
    /* 累计 TIM_Period个频率后产生一个更新或者中断 */
          /* 时钟预分频数为7200 */
                /*1秒钟内72M/7200=1M/100=1000KHz/100=10KHz
                即每秒钟产生10KHz个计数脉冲
                */
    TIM_TimeBaseStructure.TIM_Prescaler= 7199;
       
                /* 对外部时钟进行采样的时钟分频,这里没有用到 */
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
       
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
       
    TIM_ClearFlag(TIM6, TIM_FLAG_Update);
       
    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
               
    TIM_Cmd(TIM6, ENABLE);                                                                                                                                               
   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , DISABLE);                /*先关闭等待使用*/
}

void Sleep_Init(void)
{
        TIM6_NVIC_Configuration();
        SLEEP_TIM_Mode_Init();
}


void Sleep_In(void)
{
       
        if ( TIM_GetITStatus(TIM6 , TIM_FLAG_Update) != RESET )
        {       
                TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update);  
                /*
                *触发待机时间
                *计算公式:Total_Time=Time_Acount*5s
                */
                Time_Acount++;
                /*如果待机时间达到规定时间*/
                if(Time_Acount>=2)
                {
                        /*清零时间计数器*/
                        Time_Acount=0;
                        /*初始化唤醒所用的按键设置*/
                        EXTI_WakeUp_Config();
                        /*开启电源管理模块时钟*/
                        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
                       
                        /*进入停止模式,选择电源设置为低电压设置,进入唤醒为wait for interrupt*/
                        PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
                }
                       
                         
        }                        
       
}

        /*
        *应用本函数配置停止状态后的时钟采用
        *外部高速HSE时钟若本函数未被使用将造
        *成时间混乱
        */
        /*
  *   停机唤醒后配置系统时钟: 使能 HSE, PLL
  *         并且选择PLL作为系统时钟
  */
void SYSCLKConfig_WakeUp(void)
{
        ErrorStatus HSEStartUpStatus;
  /* 使能 HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* 等待 HSE 准备就绪 */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {

    /* 使能 PLL */
    RCC_PLLCmd(ENABLE);

    /* 等待 PLL 准备就绪 */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* 选择PLL作为系统时钟源 */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* 等待PLL被选择为系统时钟源 */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  }

/******************************************************************************************
************************************待机唤醒键设置*****************************************
*******************************************************************************************/

        void EXTI_WakeUp_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                                                                                         
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;          
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*注:本函数仅在进入进入休眠模式之前设置*/
        void EXTI_WakeUp_Config(void)
        {
                /*开启GPIOG的复用时钟*/
               
                GPIO_InitTypeDef GPIO_InitStructure;
                EXTI_InitTypeDef EXTI_InitStructure;
                /*初始化中断向量设置*/
                EXTI_WakeUp_NVIC_Configuration();
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);
               
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;      
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         // 上拉输入
                GPIO_Init(GPIOG, &GPIO_InitStructure);
       

        /* EXTI line(PC13) mode config */
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource8);
               
                EXTI_InitStructure.EXTI_Line=EXTI_Line8;
                /*外部中断类型选择中断模式*/
                EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
                /*中断触发选择下降沿触发*/
                EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
                /*开启中断*/
                EXTI_InitStructure.EXTI_LineCmd=ENABLE;
                /*中断初始化*/
                EXTI_Init(&EXTI_InitStructure);       
       
        }
void Sleep_Out(void)
{
        if(EXTI_GetITStatus(EXTI_Line8) != RESET)
        {       
        EXTI_InitTypeDef EXTI_InitStructure;
        EXTI_ClearITPendingBit(EXTI_Line8);
        SYSCLKConfig_WakeUp();
        EXTI_InitStructure.EXTI_Line=EXTI_Line8;
        EXTI_InitStructure.EXTI_LineCmd=DISABLE;
        EXTI_Init(&EXTI_InitStructure);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE);
          
        }
}
回复

使用道具 举报

发表于 2014-5-29 23:27:48 | 显示全部楼层
因为有个硬件bug,那个PA0按键无法产生上升沿信号,导致无法唤醒
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 03:55 , Processed in 0.034945 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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