想使用鬧鍾喚醒功能使系統從待機下喚醒,遇到一個問題:使用鬧鍾喚醒就不能使用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 }

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 }
其實中斷服務函數完全可以沒有,因為待機后直接就是相當於reset,中斷服務函數在運行時間可以對鬧鍾做出響應。
5,STOP模式需要設置EXTI17,standby模式並不需要。這里void RTCAlarm_IRQHandler(void) 根本不用。
折騰了一天,一直沒調通居然是因為wakeup pin與RTC alarm同時開啟造成的。難道ST只允許一種方式喚醒??
根據網友答復,需要wakeup pin 接下拉電阻可以解決。還沒有試驗。