STM32之RTC的学习笔记

本文详细介绍了在STM32微控制器中配置RTC实时时钟的步骤,包括使能时钟、设置时钟源、初始化RTC、设定时间和日期等。此外,还涵盖了如何配置RTC中断唤醒功能,涉及中断服务函数的编写和NVIC中断配置,为低功耗应用提供了实用指导。

RTC时钟配置的一般步骤:

1:使能PWR时钟:RCC_APB1PeriphClockCmd();
2:使能后备寄存器访问: PWR_BackupAccessCmd();
3:配置RTC时钟源,使能RTC时钟:
        RCC_RTCCLKConfig();
        RCC_RTCCLKCmd();
        如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
4:初始化RTC(同步/异步分频系数和时钟格式):RTC_Init ();

5:设置时间:RTC_SetTime ();
6:设置日期:RTC_SetDate();

7:开启相关中断(可选)

8:编写中断函数(可选,如果第7开启中断的话)


相应的库函数代码:

  RTC_InitTypeDef RTC_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
  PWR_BackupAccessCmd(ENABLE);    //使能后备寄存器访问   
  if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5152)        //是否第一次配置?
    {   
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);        //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
        RCC_RTCCLKCmd(ENABLE);    //使能RTC时钟 

        RCC_LSEConfig(RCC_LSE_ON);//LSE 开启

    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);
 
        RTC_Set_Time(12,0,0,RTC_H12_AM);    //设置时间
        RTC_Set_Date(17,11,1,3);        //设置日期
        RTC_WriteBackupRegister(RTC_BKP_DR0,0x5152);    //标记已经初始化过了
    } 

如果有中断 唤醒,7,8的中断配置步骤如下;

1:如上,配置好RTC初始化相关参数。
2:关闭WakeUp:RTC_WakeUpCmd(DISABLE);
3:配置WakeUp时钟分频系数/来源: RTC_WakeUpClockConfig();
4:设置WakeUp自动装载寄存器:RTC_SetWakeUpCounter();
5:使能WakeUp : RTC_WakeUpCmd( ENABLE);
6:开启配置闹钟中断:
        RTC_ITConfig();
        EXTI_Init();
        NVIC_Init();
7:编写中断服务函数: RTC_WKUP_IRQHandler();

相应库函数代码如下:

 EXTI_InitTypeDef   EXTI_InitStructure; 
  NVIC_InitTypeDef   NVIC_InitStructure;
      
  RTC_WakeUpCmd(DISABLE);//关闭WAKE UP  
  RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);//唤醒时钟选择  
  RTC_SetWakeUpCounter(0);//设置WAKE UP自动重装载寄存器  
         
  RTC_ITConfig(RTC_IT_WUT,ENABLE);//开启WAKE UP 定时器中断  
  RTC_WakeUpCmd( ENABLE);//开启WAKE UP 定时器   
      
  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 = RTCWKUP_PRIORITY;//抢占优先级1  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = RTCWKUP_SUBPRIORITY;//子优先级2  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道  
    NVIC_Init(&NVIC_InitStructure);//配置 

void RTC_WKUP_IRQHandler(void)
{
    if(RTC_GetITStatus(RTC_IT_WUT)){
        RTC_ClearITPendingBit(RTC_IT_WUT);
        RTC_GetTime(RTC_Format_BCD, (RTC_TimeTypeDef*)&systemtime.time);
        RTC_GetDate(RTC_Format_BCD, (RTC_DateTypeDef*)&systemtime.date);
    }
    
    EXTI_ClearITPendingBit(EXTI_Line22);
}

部分使用寄存器代码配置如下:

1:使能PWR时钟:RCC_APB1PeriphClockCmd();//RCC->APB1ENR |= 1<<28;
2:使能后备寄存器访问: PWR_BackupAccessCmd();//PWR->CR |= 1<<8;
3:配置RTC时钟源,使能RTC时钟:
        RCC_RTCCLKConfig();  //RCC->BDCR |= 1<<8;
        RCC_RTCCLKCmd();   //RCC->BDCR |= 1<<15;
        如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);//RCC->BDCR |= 1<<0;
4:初始化RTC(同步/异步分频系数和时钟格式):RTC_Init ();

5:设置时间:RTC_SetTime ();
6:设置日期:RTC_SetDate();

7:开启相关中断(可选)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值