亲测实验,stm32待机模式和停机模式唤醒程序的区别,以及唤醒后程序入口

这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32的待机模式和停机模式。让单片机进入的待机模式和停机模式比较容易,实验中经过设置中断口PA1来响应待机和停机模式。函数

void EXTI1_IRQHandler(void)
{
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
{
delay_ms(10);
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1));
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
{
EXTI_ClearITPendingBit(EXTI_Line1);spa

RTC_SetAlarm(RTC_GetCounter()+4);  //设置4S后闹钟唤醒
RTC_ITConfig(RTC_IT_ALR, ENABLE);//使能闹钟中断. 
RTC_WaitForLastTask();//等待上一次写RTC任务完成.net

Standby();             //进入待机(停机)状态
}
}调试

}blog


void Standby()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);//开电源管理时钟PWR_Regulator_LowPowerip

PWR_WakeUpPinCmd(ENABLE);//使能唤醒引脚,默认PA0it

         PWR_EnterSTANDBYMode();//进入待机
          //PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI|PWR_STOPEntry_WFE);//进入停机
}ast


进入的待机模式和停机模式很简单,基本同样。那么问题来了。变量

主要问题有:配置

1:如何对他们进行唤醒?

2:唤醒的闹钟中断可否执行?

2:唤醒后的程序入口在哪?

经过各类实验和查资料,获得了以下结论:(本实验经过设定RTC_SetAlarm(RTC_GetCounter()+4); 为设置4S后进行闹钟唤醒,并开启闹钟中断,手册中能够查到闹钟中断能产生唤醒,故用闹钟中断进行实验)

先研究待机模式下的唤醒,在闹钟中断函数以下:

void RTCAlarm_IRQHandler(void)
{
if(RTC_GetFlagStatus(RTC_IT_ALR))
{
  RTC_ClearITPendingBit(RTC_IT_ALR);
  RTC_WaitForLastTask(); 
EXTI_ClearITPendingBit(EXTI_Line17);


        if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
        {
PWR_ClearFlag(PWR_FLAG_WU);
        }
GPIO_WriteBit(GPIOA, GPIO_Pin_5, 0);//LED指示

}
}

实验结果:PA5的LED不指示,而且从其余LED灯的指示能够知道程序又从新开始运行。也就是被复位。

所以待机模式下的唤醒结论以下:

1:唤醒形式直接产生闹钟中断就能唤醒。

2:唤醒后不会进入闹钟中断函数

3:唤醒后程序复位,从新执行

 

再研究停机模式下的唤醒,停机模式唤醒和待机唤醒差异很大,开始还觉得二者相同,停机唤醒相对复杂些,中途调试了很长时间,才明白了停机唤醒的过程,贴上闹钟中断程序以下:

char Wakeflag=0;

void RTCAlarm_IRQHandler(void)
{
if(RTC_GetFlagStatus(RTC_IT_ALR))
{
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask(); 
EXTI_ClearITPendingBit(EXTI_Line7);
EXTI_ClearITPendingBit(EXTI_Line1);//对于程序可能产生的标志位必须的清除干净,不清除会出现唤醒失灵现象!!

      if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
        {
PWR_ClearFlag(PWR_FLAG_WU);//通常没用
        }
SystemInit();//重要,因为停机下对全部时钟关闭,因此唤醒须要从新配置时钟!!

       Wakeflag=!Wakeflag;
GPIO_WriteBit(GPIOA, GPIO_Pin_5, Wakeflag);//LED灯指示

}
}

相比待机的闹钟中断是不复杂了不少,停机模式下的唤醒的中断函数须要注意这两点(能获得这两点,耗费了大量时间,终于仍是搞定了,嗨皮!!):

1:重要,对于程序可能产生的标志位必须的清除干净,不清除会出现唤醒失灵现象!!

2:重要,因为停机下对全部时钟关闭,因此唤醒须要从新配置时钟!!

实验现象:LED能够产生开通与关断的效果。而且从其余LED的指示能够看到程序没有被复位,而是继续原来运行。

所以停机模式下的唤醒结论以下:

1:唤醒形式产生闹钟中断不必定就唤醒,须要对任何可能的标志位清楚,而且时钟要从新配置。

2:唤醒后进入闹钟中断函数

3:唤醒后程序进入闹钟中断函数,而后再进入原来停机的位置继续运行。没有复位,单片机寄存器里的各类变量值仍然保留!!
---------------------
做者:ludaoyi123
来源:CSDN
原文:https://blog.csdn.net/ludaoyi88/article/details/50834303

相关文章
相关标签/搜索