stm32f103系列低功耗模式(附代码)

在低功耗模式下,stm32f103系列的实际功耗st官方芯片手册有给出,也可以看如下文章:
https://blog.csdn.net/yky189/article/details/89914928

进入代码模式:
不用初始化其它rtc时钟有个的其它配置:直接调用如下函数即可进入待机模式并设置RTC闹钟在15s后发生闹钟事件唤醒MCU,wake_up管脚唤醒MCU

/*******************************************************************************
* 函数名        : Enter_Standby_Mode
* 函数功能	 : 进入待机模式
* 输入        	: 无
*输出        	: 无
*******************************************************************************/
void Enter_Standby_Mode(void)
{
 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);
	PWR_BackupAccessCmd(ENABLE);
	RTC_SetAlarm(RTC_GetCounter()+15);
	RTC_WaitForLastTask();
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR外设时钟	
	PWR_ClearFlag(PWR_FLAG_WU);//清楚Wake—up标志	
	PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚	
	PWR_EnterSTANDBYMode();//进入待机模式
}

**进入停机模式:
**不用初始化rtc时钟和有个的配置,直接调用此函数进入停机模式,RTC15s后唤醒,外部中断0唤醒

u8 StRtc_Init(void)
{
    RCC_LSICmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);	
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);		  
    RCC_RTCCLKCmd(ENABLE);	
    RTC_WaitForLastTask();	
    RTC_WaitForSynchro();		
    RTC_WaitForLastTask();	
    RTC_EnterConfigMode();
    RTC_SetPrescaler(40000);
    RTC_WaitForLastTask();	
    RTC_ExitConfigMode();

    return 1;
}
    /*******************************************************************************
    * 函数名    	   : Enter_Stop_Mode
    * 函数功能	   :进入停机模式
    * 输入 		       : 无
    *输出	  		   : 无
    *******************************************************************************/
    void Enter_Stop_Mode(void)	
    {
   		EXTI_InitTypeDef EXTI_InitStructure;
   		NVIC_InitTypeDef NVIC_InitStructure;
    /**************************************1*********************************/
        EXTI_ClearITPendingBit(EXTI_Line17);                                  
        EXTI_InitStructure.EXTI_Line = EXTI_Line17;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
    
    /**************************************2*********************************/		
        NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;   
                                                                                                        
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        
        NVIC_Init(&NVIC_InitStructure);
    
    /**************************************3*********************************/
   		RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);
   		PWR_BackupAccessCmd(ENABLE);
        RTC_SetAlarm(RTC_GetCounter() + 15);     
                                                                                
        RTC_WaitForLastTask();                                 
        RTC_ITConfig(RTC_IT_ALR, ENABLE);        
        RTC_WaitForLastTask();
    		
   		PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//PWR_Regulator_ON
    	
    	/*停机模式回来后会回到刚才停止的地方,也就是这个位置,因为停机模式关闭了所有的时钟,在此处需要使能需要用到的时钟*/	
    	SystemInit();
    	RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    }

/*******************************************************************************
* 函数名          : My_EXTI_Init
* 函数功能	   : Í外部中断初始化
* 输入      	   :无
* 输出			   : 无
*******************************************************************************/
void My_EXTI_Init(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	EXTI_InitTypeDef  EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择GPIO管脚用作外部中断线路	
	
	//EXTI0 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//¸初始化VIC寄存器
	
	EXTI_InitStructure.EXTI_Line=EXTI_Line0;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStructure);	
}


/*******************************************************************************
* 函数名          : My_EXTI_Init
* 函数功能	   : 外部中断0函数
* 输入      	   :无
* 输出			   : 无
*******************************************************************************/
void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line0)==1)
	{
	}
	EXTI_ClearITPendingBit(EXTI_Line0);
}

/*******************************************************************************
* 函数名          : RTCAlarm_IRQHandler
* 函数功能	   : RTC闹钟中断函数
* 输入      	   :无
* 输出			   : 无
*******************************************************************************/
void RTCAlarm_IRQHandler(void)
{
    EXTI_ClearITPendingBit(EXTI_Line17);   
}
/*******************************************************************************
* 函数名          : RTC_IRQHandler
* 函数功能	   : RTC中断函数
* 输入      	   :无
* 输出			   : 无
*******************************************************************************/
void RTC_IRQHandler(void)
{
    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)         
    {                            
//        RTC_GetTime(&SystemTime);                                 
        RTC_ClearITPendingBit(RTC_IT_SEC);    
        RTC_WaitForLastTask();
     }
    if(RTC_GetITStatus(RTC_IT_ALR) != RESET)              
    {
        RTC_ClearITPendingBit(RTC_IT_ALR);                  
        RTC_WaitForLastTask();
    }
}

你可能感兴趣的:(STM32)