这两天研究了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