前言
本人使用STM32F103VET6编写待机及双重唤醒功能,以防大家避雷踩坑,写此文章交流一下。
源代码
参考:
RTC闹钟中断和唤醒待机模式
STM32低功耗待机模式+ WKUP引脚的上升沿来唤醒
本人亲测好用源码
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//ÐèÒªÅäÖõçÔ´¿ØÖƼĴæÆ÷£¬ËùÒÔʹÄÜʱÖÓ£¬·ñÔò²»ÄÜÕý³£Ê¹ÓÃÃüÁî½øÈë´ý»ú״̬ºÍ»½ÐÑ
// RTC_EnterConfigMode(); //½øÈëRTCÅäÖÃģʽ
// RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter() + minTim - 3); //²¹³¥3sÆô¶¯Ê±¼ä
// RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR, ENABLE);
// RTC_ExitConfigMode(); //Í˳öRTCÅäÖÃģʽ
RTC_WaitForLastTask();
// uart3_printf("****½øÈë´ý»ú****");
RCC_APB2PeriphResetCmd(0x01fc, DISABLE); //×¼±¸½øÈë´ý»úģʽ£¬¸´Î»ËùÓÐIO£¬½µµÍ¹¦ºÄ(²ÎÕÕÊֲᣬ¸ù¾ÝÐèÒª¸´Î»¶ÔÓ¦IO)
PWR_WakeUpPinCmd(ENABLE); //ʹÄÜWKUPÒý½Å»½Ðѹ¦ÄÜ£¬·ñÔòWKUPÒý½ÅÉÏÉýÑز»ÄÜ»½ÐÑ
PWR_EnterSTANDBYMode(); //½øÈë´ý»úģʽ
RTC闹钟配置及中断开启前不能加“RTC_WaitForLastTask”函数,否则WEKUP不仅无法唤醒,还会导致进入待机马上就会重启的现象,具体什么原因导致不得而知,为了确保操作RTC寄存器成功,我将此函数放在了最后。