SYM32——RTC实时时钟程序讲解

一、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)。

你可能感兴趣的:(STM32,stm32,单片机)