基于STM32F103C8T6的寄存器写法(RTC实时时钟的配置)

本文详细介绍了RTC(实时时钟)的工作原理和主要特性,包括其可编程的预分频系数、32位计数器、不同的时钟源选择以及中断功能。在RTC配置过程中,重点讲解了如何获取写入权限、复位后备域、选择时钟源、使能RTC时钟以及具体的RTC寄存器配置步骤。示例代码展示了RTC初始化的实现过程,确保RTC时钟的稳定运行。
摘要由CSDN通过智能技术生成

RTC时钟简介:

        实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可 提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
        RTC模块和时钟配置系统 (RCC_BDCR 寄存器 ) 处于后备区域,即在系统复位或从待机模式唤醒后,RTC 的设置和时间维持不变。
        系统复位后,对后备寄存器和RTC 的访问被禁止,这是为了防止对后备区域 (BKP) 的意外写操
作。执行以下操作将使能对后备寄存器和 RTC 的访问:
● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。

RTC时钟的主要特性:

● 可编程的预分频系数:分频系数最高为 2 20
32 位的可编程计数器,可用于较长时间段的测量。
2 个分离的时钟:用于 APB1 接口的 PCLK1 RTC 时钟 (RTC 时钟的频率必须小于 PCLK1 时钟
频率的四分之一以上 )
可以选择以下三种RTC的时钟源:
─ HSE时钟除以128;(HSE时钟为8MHZ)----除与128为62.5KHZ
─ LSE振荡器时钟;(LSE时钟为32.768KHZ)
─ LSI振荡器时钟(波动太大,有选择的情况下基本不会选)
2 个独立的复位类型:
APB1 接口由系统复位;
RTC 核心 ( 预分频器、闹钟、计数器和分频器 ) 只能由后备域复位
3 个专门的可屏蔽中断:
闹钟中断,用来产生一个软件可编程的闹钟中断。
秒中断,用来产生一个可编程的周期性中断信号 ( 最长可达 1 )
溢出中断,指示内部可编程计数器溢出并回转为 0 的状态。 (因为内部计数器太大,需要好久才能产生溢出信号,所以很少用到溢出中断)

RTC配置过程:

1、配置思路:

        (1)获得后备寄存器和RTC的写入权限;

 

        (2)复位整个备份域

         (3)选择时钟源(HSE,LSE),若选择LSE时钟则要先使能LSE时钟。保险起见,若选择了LSE而LSE损坏,RTC时钟将无用,所以我们要先判断外部低俗时钟LSE是否就绪,且设定一段时间,若超时也选择HSE。

        

        (4)使能RTC时钟

         (5)RTC的具体配置核心寄存器(计数器,分频器,设置中断等),具体步骤:

                1. 查询RTOFF 位,直到 RTOFF 的值变为 ’1’
                2. 置CNF 值为 1 ,进入配置模式
                3. 对一个或多个RTC 寄存器进行写操作
                4. 清除CNF 标志位,退出配置模式
                5. 查询RTOFF ,直至 RTOFF 位变为 ’1’ 以确认写操作已经完成。

 


 2、配置代码:

/******************************************************
函数功能:RTC时钟初始化
形参含义:无
返回值:无
*******************************************************/
void RTC_Init(void)
{
    u16 BeyondTime = 0;//超时时间
    
    //开启写入后备域的权限
    RCC->APB1ENR |= 1<<27;
    RCC->APB1ENR |= 1<<28;
    
    PWR->CR |= 1<<8;
    //复位整个后备域
    RCC->BDCR |= 1<<16;
    RCC->BDCR &= ~(1<<16);
    
    //选择时钟
    RCC->BDCR |= 1<<0;//外部低速时钟使能(LSE)
    do
    {
        SysTick_Delay_ms(1);
        BeyondTime++;
    }while(!(RCC->BDCR & 1<<1) && BeyondTime != 0xfe);
    
    if(BeyondTime != 0xfe)   RCC->BDCR |= 1<<8;
    else    RCC->BDCR |= 3<<8;

    //使能时钟
    RCC->BDCR |= 1<<15;
    
    //RTC基础配置
    while(!(RTC->CRL & 1<<5)){}
    RTC->CRL |= 1<<4;//进入配置模式
    
    RTC->CNTH = 0;
    RTC->CNTL = 0;//计数器清零
    RTC->ALRH = 0;
    RTC->ALRL = 15;//闹钟设为15秒进一次
    RTC->PRLH = 0;
    if(BeyondTime != 0xfe) RTC->PRLL = 0x7fff;  //外部低速时钟---产生一秒需要的分频
        else    RTC->PRLL = 0xF423;             //外部高速时钟---产生一秒需要的分频
    
    //设置中断
    RTC->CRH |= 1<<0;//开启秒中断
    RTC->CRH |= 1<<1;//开启闹钟中断
    SET_NVIC_SetPriority(RTC_IRQn,1,1); //设置中断优先级

    RTC->CRL |= ~(1<<4);//退出配置模式
    while(!(RTC->CRL & 1<<5)){}//完成这个步骤才能把这些配置写入RTC的寄存器中
}

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值