这里用的是标准库,先说下流程,
1:选择外部低速时钟32.768khz作为RTC输入
2:RTC输入之后要确保这分频是这么多,才能产生1hz脉冲
3:然后选择这个1hz脉冲作为唤醒计数器的时钟输入
这种分频方式。唤醒中断有个有个计数器,该计数器递减方式运行,每隔x+1个脉冲就中断一次。
比如:要每隔2秒一次中断,计数器要设置成1
4:RTC的中断要和EXTI搭配用
但是中断服务函数中不用exti服务函数。
5:最奇怪的一点是开中断之前要调用 RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC WAKE UP的标志
通常用的配置代码
{
RTC_InitTypeDef RTC_InitStructure;
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//RTC异步分频系数(1~0X7F)
RTC_InitStructure.RTC_SynchPrediv = 0xFF;//RTC同步分频系数(0~7FFF)
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//RTC设置为,24小时格式
RTC_Init(&RTC_InitStructure);
}
配置唤醒中断:1秒一次的
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line22;//LINE22
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE22
EXTI_Init(&EXTI_InitStructure);//配置
NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置
RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);//1秒钟一个脉冲
RTC_SetWakeUpCounter(0);//每隔0+1秒脉冲
RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC WAKE UP的标志
RTC_ITConfig(RTC_IT_WUT,ENABLE);
RTC_WakeUpCmd(ENABLE);
}
void RTC_WKUP_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_WUT) == SET) //WK_UP中断?
{
RTC_ClearITPendingBit(RTC_IT_WUT); //清除中断标志
}
EXTI_ClearITPendingBit(EXTI_Line22);//清除中断线22的中断标志
}