STM32:RTC鬧鍾喚醒


想使用鬧鍾喚醒功能使系統從待機下喚醒,遇到一個問題:使用鬧鍾喚醒就不能使用wakeup pin喚醒。二者只能取其一。

此問題解決,畫了個板子wakeup pin 接下拉電阻解決。

 

寫新代碼時候遇到一個問題:設置鬧鍾中斷開啟之后不要關閉:PWR_BackupAccessCmd(DISABLE);

如果只有設置秒中斷的話可以有這句比較安全,可是后面還要設置鬧鍾步長,千萬不能有,不然會死掉,死掉。

 

1,首先屏蔽掉:// PWR_WakeUpPinCmd(ENABLE);  //使能喚醒管腳功能

     我的程序在wakeup_config.c中實現. 屏蔽后wakeup pin無法使機器喚醒

2,使能RTC鬧鍾中斷:  /* Enable the RTC Alarm interrupt */
                           RTC_ITConfig(RTC_IT_ALR, ENABLE);
                           /* Wait until last write operation on RTC registers has finished */
                           RTC_WaitForLastTask();

     這兩句在RTC初始化時候加入即可。

3,設置鬧鍾時長並進入待機   

    RTC_ClearFlag(RTC_FLAG_SEC);
    while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);
    RTC_SetAlarm(RTC_GetCounter() + 15);
    RTC_WaitForLastTask();

    Sys_Enter_Standby();

4,中斷服務函數:

 1 static void RTC_NVIC_Config(void)
 2 {    
 3     NVIC_InitTypeDef NVIC_InitStructure;
 4 
 5     NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;        //RTC全局中斷
 6     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    //先占優先級1位,從優先級3位
 7     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //先占優先級0位,從優先級4位
 8     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能該通道中斷
 9     NVIC_Init(&NVIC_InitStructure);        //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
10 }
RTC_NVIC_Config

 

 1 void RTC_IRQHandler(void)
 2 {
 3   //RTC時鍾中斷
 4 //每秒觸發一次  
 5    
 6  if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒鍾中斷
 7  {       
 8   RTC_Get();//更新時間   
 9   }
10  if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//鬧鍾中斷
11  {
12   RTC_ClearITPendingBit(RTC_IT_ALR);  //清鬧鍾中斷
13   printf("\n\rRTC Alarm \n\r"); 
14   printf("\n\r Now is %d年 %d月 %d日 %d點 %d分 %d秒 ,星期%d\n\r",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec,calendar.week);      
15        RTC_SetAlarm(RTC_GetCounter() + 8);
16         RTC_WaitForLastTask(); 
17  }                
18  RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);  //清鬧鍾中斷
19  RTC_WaitForLastTask();                     
20 
21 }
RTC_IRQHandler

其實中斷服務函數完全可以沒有,因為待機后直接就是相當於reset,中斷服務函數在運行時間可以對鬧鍾做出響應。

5,STOP模式需要設置EXTI17,standby模式並不需要。這里void RTCAlarm_IRQHandler(void) 根本不用。

折騰了一天,一直沒調通居然是因為wakeup pin與RTC alarm同時開啟造成的。難道ST只允許一種方式喚醒??

根據網友答復,需要wakeup pin 接下拉電阻可以解決。還沒有試驗。

    

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM