当前位置:   article > 正文

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

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();//进入待机模式
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

**进入停机模式:
**不用初始化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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/940756
推荐阅读
相关标签
  

闽ICP备14008679号