基于STM32F103C8T6的RTC实现(可按键调整时间)

1. STM32的RTC寄存器介绍

1.1  控制寄存器 RTC_CR

1.1.1  RTC_CRH高位:启用或禁用指定的RTC中断

        RTC_ITConfig(parameter, ENABLE); parameter可以是 RTC_IT_OW 溢出中断; RTC_IT_ALR 闹钟中断;RTC_IT_SEC 秒中断。

1.1.2  RTC_CRL低位:

        RTOFF状态位 :对RTC任何寄存器的写操作前 判断RTC寄存器是否处于更新中,仅当RTOFF状态位是’1’ 时,才可以写入RTC寄存器;函数:RTC_WaitForLastTask() 可判断;

        CNF 配置标志位:必须由软件置’1’以进入配置模式,从而允许向RTC_CNT、RTC_ALR或RTC_PRL寄存器 写入数据;

0:退出配置模式(开始更新RTC寄存器);函数 RTC_ExitConfigMode()

1:进入配置模式; 函数 RTC_ExitConfigMode()

就比如要给RTC_PLR预分频器写入预分频值

void RTC_SetPrescaler(uint32_t PrescalerValue)
{
  /* Check the parameters */
  assert_param(IS_RTC_PRESCALER(PrescalerValue));
  
  RTC_EnterConfigMode();  // 进入配置模式
  /* Set RTC PRESCALER MSB word */
  RTC->PRLH = (PrescalerValue & PRLH_MSB_MASK) >> 16;
  /* Set RTC PRESCALER LSB word */
  RTC->PRLL = (PrescalerValue & RTC_LSB_MASK);
  RTC_ExitConfigMode();  // 退出配置模式
}

        RSF 寄存器同步标志位:要进行任何的读操作之前,用户程序必须等待 这位被硬件置’1’,以确保RTC_CNT、RTC_ALR或RTC_PRL已经被同步; 函数 RTC_WaitForSynchro() 可判断;

        OWF溢出标志位、ALRF闹钟标志位、SECF秒标志位,标志位置位时都是硬件置1,但是需要软件清0,并且写’1’是无效的。函数 RTC_ClearFlag() 或者RTC_ClearITPendingBit() 。

1.2  预分频装载寄存器 RTC_PRL

        LSE时钟:LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器

        LSI时钟:LSI时钟频率大约40kHz(在30kHz和60kHz之间)

如果要产生TR_CLK为1s的信号,使用LSE时钟时,RTC_PRL预分频器写入32767,RTC_SetPrescaler(32767),使用LSI时钟,RTC_PRL写入39999,RTC_SetPrescaler(39999)。(使用LSE外部时钟可使用BKP备用寄存器,掉电下依旧能走时,而使用LSI内部时钟时掉电的情况下不能走时)

1.3  预分频器余数寄存器 RTC_DIV

        用户可通过读取RTC_DIV寄存器,以获得预分频计数器的当前值,而不停止分频计数器的工作,从而获得精确的时间测量。(可用该值将秒细分到毫秒等更精确的时间)RTC_GetDivider()

1.4  计数器寄存器 RTC_CNT

        计数器以预分频器产生的 TR_CLK时间基准为参考进行计数,RTC_CNT寄存器用来存放计数器的计数值,RTC_SetCounter() 设置RTC_CNT的值

1.5  闹钟寄存器 RTC_ALR

        当可编程计数器的值(RTC_CNT)与RTC_ALR中的32位值相等时,即触发一个闹钟事件,并且产生RTC闹钟 中断。RTC_SetAlarm() 设置RTC_ALR的值。

RTC框图:

2. 实

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值