微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32f103-实例睡眠模式的唤醒

STM32f103-实例睡眠模式的唤醒

时间:11-17 来源:互联网 点击:
main.c

/***************************************************************************/
// environment : writ by Chen maolin in 2010/9/23 on Kiel 4.0
// finktion : about a projiect to setup EXTI
//hardware optimization :
// update :2010/9/26 陈茂林
/**************************************************************************/
#include "stm32f10x_lib.h"
#include "platform_config.h"
#include

extern vu32 TimingDelay ;
ErrorStatus HSEStartUpStatus;

void SYSCLKconfig_STOP(void);
void RCC_Configuration(void);
void EXTI_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void RTC_Configuration (void);
void SysTick_Configuration(void);
void Delay(vu32 nCount);

int main(void)
{
#ifdef DEBUG
debug();
#endif
RCC_Configuration();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE );
GPIO_Configuration();
EXTI_Configuration();
RTC_Configuration ();
NVIC_Configuration();
SysTick_Configuration();

while (1)
{
Delay(200);/*延时2s*/
RTC_ClearFlag(RTC_FLAG_SEC); /*清秒中断标志位*/
while(RTC_GetFlagStatus(RTC_FLAG_SEC)==RESET);/*等待秒中断*//*意思是要等1s才有反应*/
RTC_SetAlarm(RTC_GetCounter()+3);/*设置秒报警中断*/
RTC_WaitForLastTask(); /*等待最后一条写命令*/
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
PWR_EnterSTOPMode( PWR_Regulator_ON, PWR_STOPEntry_WFI ); /*这条是睡眠;PLL时钟停止,
PC指令停止执行,一但有中断服务程序触发会使得PC指令向下执行但我们还需要通过一个函数恢复
他的PLL时钟**/
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
SYSCLKconfig_STOP();
GPIO_SetBits(GPIOB,GPIO_Pin_7);

}
}

/*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the different system clocks.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void) /*初始时钟*/
{
RCC_DeInit(); /* RCC system reset(for debug purpose) */
RCC_HSEConfig(RCC_HSE_ON); /* Enable HSE */
HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Wait till HSE is ready */

if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Enable Prefetch Buffer */
FLASH_SetLatency(FLASH_Latency_2); /* Flash 2 wait state */
RCC_HCLKConfig(RCC_SYSCLK_Div1); /* HCLK = SYSCLK */
RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK2 = HCLK */
RCC_PCLK1Config(RCC_HCLK_Div2); /* PCLK1 = HCLK/2 */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLCmd(ENABLE); /* Enable PLL */

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| /*总线APB2周围时钟设置*/
RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO ,
ENABLE
);

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) /* Wait till PLL is ready */
{

}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Select PLL as system clock source */
while(RCC_GetSYSCLKSource() != 0x08) /* Wait till PLL is used as system clock source */
{
}
}
}

/*******************************************************************************
* Function Name : 从停机模式下唤醒之后: 配置系统时钟允许HSE,和 pll 作为系统时钟。
* Description : Inserts a delay time.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SYSCLKconfig_STOP(void)
{
RCC_HSEConfig(RCC_HSE_ON); /*HSES使能*/
HSEStartUpStatus = RCC_WaitForHSEStartUp(); /*等待*/
if(HSEStartUpStatus == SUCCESS)
{
RCC_PLLCmd(ENABLE);/*使能*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET); /*等待PLL有效*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*将PLL作为系统时钟*/
while(RCC_GetSYSCLKSource() != 0x08);/*等待*/
}
}

/**************************************************

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top