就是进入停止模式之前初始化外部中断,之后进入停止模式之后按键没反应啊,我自己用我自己做的板子的
主函数里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);
}
} |