STM32F103ZET6 RTC实时时钟

【 1. RTC 】

  1. RTC (Real Time Clock):实时时钟
  2. RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。
  3. RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。
    在这里插入图片描述

【 2. 内部结构 】

在这里插入图片描述在这里插入图片描述

【 3. 组成部分 】

  1. APB1接口:用来和APB1总线相连。通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。
  2. RTC核心:由一组可编程计数器组成。分两个主要模块:
    第一个是RTC预分频模块,它可以编程产生最长1秒的RTC时间基TR_CLK。如果设置了秒中断允许位,可以产生秒中断。
    第二个是32位的可编程计数器,可被初始化为当前时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比,当匹配时候如果设置了闹钟中断允许位,可以产生闹钟中断。
    PS:
    RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRL的RSF位)被硬件置1才读。

【 4. BKP备份寄存器 】

  1. 备份寄存器是42个16位的寄存器。可用来存储84个字节数据。
  2. 它们处在备份区域,当VDD电源切断,仍然由VBAT(是指电池电压的意思,BAT是Battery(电池)的缩写,且VBAT连接的是电池正极。)维持供电。
  3. 当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。
  4. 执行以下操作将使能对后备寄存器和RTC访问:
    设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟。
    设置寄存器PWR_CR的DBP位,使能对RTC和后备寄存器的访问。
  5. 一共有42个16位备份寄存器。常用来保存一些系统配置信息和相关标志位。在这里插入图片描述

【 5. 相关寄存器 】

1. RTC控制寄存器(RTC_CRH, RTC_CRL)
RTC控制寄存器高位(RTC_CRH) //使能相关中断
在这里插入图片描述
RTC控制寄存器低位(RTC_CRL) //部分配置
在这里插入图片描述①修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步。
②修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式
③同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位。
2. RTC预分频装载寄存器 (RTC_PRLH, RTC_PRLL)
在这里插入图片描述
3. RTC预分频余数寄存器 (RTC_DIVH, RTC_DIVL)
在这里插入图片描述
4. RTC计数器寄存器 (RTC_CNTH, RTC_CNTL)
在这里插入图片描述
5. RTC闹钟寄存器 (RTC_ALRH ,RTC_ALRL)
在这里插入图片描述
寄存器配置过程
在这里插入图片描述在这里插入图片描述

【 6. 相关函数 】

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
void RTC_EnterConfigMode(void);
void RTC_ExitConfigMode(void);
uint32_t  RTC_GetCounter(void);
void RTC_SetCounter(uint32_t CounterValue);
void RTC_SetPrescaler(uint32_t PrescalerValue);
void RTC_SetAlarm(uint32_t AlarmValue);
uint32_t  RTC_GetDivider(void);
void RTC_WaitForLastTask(void);
void RTC_WaitForSynchro(void);
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);

RTC时钟源和时钟操作函数:

void RCC_RTCCLKConfig(uint32_t  CLKSource)//时钟源选择
void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能

RTC配置函数(预分频,计数值):

void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL
void RTC_SetCounter(uint32_t CounterValue)//设置计数器值:CNTH/CNTL
void RTC_SetAlarm(uint32_t AlarmValue)//闹钟设置:ALRH/ALRL

RTC中断设置函数:

 void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH

RTC允许配置和退出配置函数:

void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF
void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF

同步函数:

void RTC_WaitForLastTask(void)//等待上次操作完成:CRL位RTOFF
void RTC_WaitForSynchro(void)//等待时钟同步:CRL位RSF

相关状态位获取清除函数:

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);

其他相关函数(BKP等)

 PWR_BackupAccessCmd();//BKP后备区域访问使能
RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟
RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源	
PWR_BackupAccessCmd();//BKP后备区域访问使能
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP

【 7. 配置过程 】

  1. 使能PWR和BKP时钟:RCC_APB1PeriphClockCmd();
  2. 使能后备寄存器访问: PWR_BackupAccessCmd();
  3. 配置RTC时钟源,使能RTC时钟:
    RCC_RTCCLKConfig();
    RCC_RTCCLKCmd();
    如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
  4. 设置RTC预分频系数:RTC_SetPrescaler();
  5. 设置时间:RTC_SetCounter();
  6. 开启相关中断(如果需要):RTC_ITConfig();
  7. 编写中断服务函数:RTC_IRQHandler();
  8. 部分操作要等待写操作完成和同步。
    RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成
    RTC_WaitForSynchro(); //等待RTC寄存器同步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值