一、RTC日历配置一般步骤
1、使能PWR时钟:RCC_APB1PeriphClockCmd();
2、使能后备寄存器访问:PWR_BackupAccessCmd();
3、配置RTC时钟源,使能RTC时钟:RCC_RTCCLKConfig(); RCC_RTCCLKCmd();如果要使用LSE,要打开LSE:RTC_LSEConfig(RCC_LSE_ON);
4、初始化RTC(同步/异步分系数和时钟格式):RTC_Init();
5、设置时间:RTC_SetTime();
6、设置日期:RTC_SetDate();
二、RTC闹钟配置一般步骤
1、初始化RTC相关参数。
2、关闭闹钟:RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//避免配置的时候还在“闹”
3、配置闹钟参数:RTC_SetAlarm();//掩码
4、开启闹钟:RTC_AlarmCmd(RTC_Alarm_A,ENABLE);
5、开启配置闹钟中断:RTC_ITConfig(); EXTI_Init(); NVIC_Init();
6、编写中断服务函数:RTC_Alarm_IRQHandler();
三、RTC周期性自动唤醒配置一般步骤
1、RTC已经初始化好相关参数。
2、关闭WakeUp:RTC_WakeUpCmd(DISABLE);
3、配置WakeUp时钟分频系数来源:RTC_WakeUpClockConfig();
4、设置WakeUp自动装载寄存器:RTC_SetWakeUpCounter();
1)使能WakeUp:RTC_WakeUpCmd(ENABLE);
2)开启配置闹钟中断:RTC_ITConfig(); EXTI_Init(); NVIC_Init();
5、编写中断服务函数:RTC_WKUP_IRQHandler();
四、部分代码解读
1、RTC日历配置
RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050 //是否第一次配置?
//第一次配置后备寄存器的时候设置寄存器RTC_BKP_DR0的值,之后就不用再配置,该寄存器
//会在后备自己计时
RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050) //标记已经初始化过了
//之后RTC_BKP_DR0的值就是0x5050
RCC_LSEConfig(RCC_LSE_ON) //打开LSE,然后等待稳定,获取稳定后的标志位
RCC_GetFlagStatus(RCC_FLAG_LSERD1)==RESET) //获取标志位
RTC_RTCCLKConfig(RCC_RTCCLKSource_LSE) //设置RTC时钟,选择LSE作为RTC时钟。(可以选择2~31)
RTC_RTCCLKCmd() //使能时钟
RTC_Init() //调用RTC_Init()函数,初始化异步同步分频系数
RTC_Set_Time(23,59,56,RTC_H12_AM) //设置当前时间,里面的参数是举例(小时,分,秒,格式)
RTC_Set_Date(22,8,9,2) //设置日期(年,月,日,周几)
RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050) //标记已经初始化过了
//配置完之后时钟就开始运行了
2、RTC闹钟配置
//首先关闭闹钟
RTC_AlarmCmd(RTC_Alarm_A,DISABLE) //关闭闹钟A
RTC_SetAlarm(格式,闹钟A/B,闹钟A/B什么时候闹) //调用
//闹钟什么时候闹,是个结构体。可以是星期“闹”(掩码),然后具体到星期几,再设定精确匹配的参数
RTC_TimeTypeDef //设置闹钟的格式,具体到什么时候闹
//因为闹钟中断是线上面的,外部的,需要清除。
RTC_ClearITPendingBit(RTC_IY_ALRA) //清除RTC闹钟A的标志
EXIT_ClearITPendingBit(EXTI_Line17) //清除Line17上的中断标志位
RTC_ITConfig(RTC_IT_ALRA,ENABLE) //开启闹钟A中断
RTC_AlarmCmd(RTC_Alarm_A,ENABLE) //开启闹钟A
//然后配置中断线
//配置好闹钟闹的时间后,闹钟闹的时候会产生中断
void RTC_Alarm_IQRHandler(void)
{
if(RTC_GetFlagStatus(RTC_FLAG_ALRAF)==SET) //判断闹钟闹了没有
{
RTC_ClearFlag(RTC_FLAG_ALRAF);//清除中断标志位
printf("ALARM A\r\n");
}
EXTI_ClearITPendingBit(EXTI_Line17);//清除Line17中断标志位
}
3、RTC周期性自动唤醒配置
//首先关闭闹钟,然后唤醒时钟
RTC_WakeUpCmd(DISABLE); //关闭闹钟
RTC_WakeUpClockConfig(wksel); //唤醒时钟选择
RTC_SetWakeUpCounter(cnt); //设置WAKE UP自动重装载寄存器
//在已唤醒的时钟控制下从上往下计数到0
RTC_ClearITPendingBit(RTC_IT_WUT); //清除RTC WAKE UP的标志
EXTI_ClearITPendingBit(EXTI_Line22); //清除Line22的中断线标志
RTC_ITConfig(RTC_IT_WUT,ENABLE); //开启WAKE UP定时器中断
RTC_WakeUpCmd(EABLE); //开启WAKE UP定时器
//配置中断线和NVIC
//当计数到0时就会唤醒中断服务函数
void RTC_WKUP_IRQHandler(void)
{
if(RTC_GetFlagStatua(RTC_FLAG_WUTF)==SET)//WK_UP中断
{
RTC_ClearFlag(RTC_FLAG_WUTF);//清除中断标志
LED1=!LED1;
}
EXTI_ClearPending(EXTI_Line22);//清除中断线22的中断标志
}
如果要调试后备寄存器代码,需要将参数0x5050改一下,使其不符合参数要求从而完成对后备寄存器参数的改变。因为当后备寄存器代码运行一次之后,它的参数就已经不会再改变了,要想改变参数就将代码运行的条件(如:0x5050)改一下(如:0x5051)。