发表于 2010-10-15 22:06:26

STM32学习(五)——RTC在MDK中的配置

1、RTC简介
        实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。
系统复位后,禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和RTC的访问:
●设置寄存器RCC_APB1ENR的PWREN和BKPEN位来使能电源和后备接口时钟
●设置寄存器PWR_CR的DBP位使能对后备寄存器和RTC的访问。
2、主要特性
●可编程的预分频系数:分频系数最高为220。
●32位的可编程计数器,可用于较长时间段的测量。
●2个单独的时钟:用于APB1接口的PCLK1和RTC时钟(此时的RTC时钟必须小于PCLK1时钟的四分之一以上)
●可以选择以下三种RTC的时钟源:
─HSE时钟除以128
─LSE振荡器时钟
─LSI振荡器时钟(详见6.2.8节RTC时钟)
●2种独立的复位类型:
─APB1接口由系统复位
─RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位(详见6.1.3节)。
●3个专门的可屏蔽中断:
─闹钟中断,用来产生一个软件可编程的闹钟中断。
─秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。
●溢出中断,检测内部可编程计数器溢出并回转为0的状态。
3、RTC初始化配置
/*******************************************************************************
* Function Name  : RTC_Configuration
* Description    : RTC配置
* Input          :
* Output         :
* Return         : None
*******************************************************************************/
void RTC_Configuration(void)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  PWR_BackupAccessCmd(ENABLE);
  BKP_DeInit();
     
  RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);//时钟配置,选择分频方式
  RCC_RTCCLKCmd(ENABLE);
  RTC_WaitForSynchro();
  RTC_WaitForLastTask();
  RTC_ITConfig(RTC_IT_SEC, ENABLE);
  RTC_WaitForLastTask();
  RTC_SetPrescaler(93750); /* RTC period = RTCCLK/RTC_PR = (93.750 KHz)/(RTC+1) */  
  RTC_WaitForLastTask();
}
4、RTC时钟配置
/*******************************************************************************
* Function Name  : RTC_TimeSet
* Description    : RTC时间设置
* Input          : HH:输入小时,MM:输入分钟,SS:输入秒
* Output         :
* Return         : None
*******************************************************************************/
void RTC_TimeSet(u8 HH,u8 MM,u8 SS)
{
   u32 TimeCount;
   TimeCount=HH*3600+MM*60+SS;
           
   RTC_WaitForLastTask();   //等待上一次的RTC操作完成
   RTC_SetCounter(TimeCount);  //时间的存储方式是以秒的方式来存储的
   RTC_WaitForLastTask();
}
5、RTC中断的开启
/*******************************************************************************
* Function Name  : RTC_It
* Description    :
* Input          :
* Output         :
* Return         : None
*******************************************************************************/
void RTC_It(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;//选择中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =6;//中断优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;开启中断
    NVIC_Init(&NVIC_InitStructure);
 }
        我们在日常使用RTC的时候需要用到很多的寄存器,这里就不一一说明了。大家可以参考手册来使用寄存器。因为ST提供了成熟的库文件,我们只需要明白每个库里面程序的意思就可以了。这样省去了我们开发底层驱动的时间,如果大家认为不太好用,也可以自己编写程序,这样就需要明白寄存器的内容了。
       很多方案使用RTC的方式是不一样的,有使用时间戳的、也有自定义时间的。这个根据我们的需求来定。程序编写的过程中,一定要明白寄存器、程序代码的意思,才能更好的使用。

wdshuang09 发表于 2016-11-11 22:07:22

学习了
页: [1]
查看完整版本: STM32学习(五)——RTC在MDK中的配置