STM32 RTC与RCC相关

RTC与RCC相关

1.1 RTC驱动程序

  1. RTC电路图
    在这里插入图片描述

  2. 实验目的:设置奇数秒点亮LED1,奇数分钟点亮LED2

  3. 初始化时钟,LED

  4. 初始化RTC

    1. 非初次启动(含判断调用初次启动)
      RTC_Config
      void RTC_Config(void){
              //实时时钟初始化
         //在BKP的后备寄存器1中,存了一个特殊字符0xA5A5
         //第一次上电或后备电源掉电后,该寄存器数据丢失,表明RTC数据丢失,需要重新配置
         if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5){
             //判断寄存数据是否丢失       
            RTC_First_Config();//重新配置RTC        
            BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//配置完成后,向后备寄存器中写特殊字符0xA5A5
         }else{
             
         //若后备寄存器没有掉电,则无需重新配置RTC
            //这里我们可以利用RCC_GetFlagStatus()函数查看本次复位类型
            if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET){
             
               //这是上电复位
            }
            else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET){
             
               //这是外部RST管脚复位
            }       
            RCC_ClearFlag();//清除RCC中复位标志
      
            //虽然RTC模块不需要重新配置,且掉电后依靠后备电池依然运行
            //但是每次上电后,还是要使能RTCCLK
            RCC_RTCCLKCmd(ENABLE);//使能RTCCLK        
            RTC_WaitForSynchro();//等待RTC时钟与APB1时钟同步
      
            //当不使用RTC秒中断,可以屏蔽下面2条
         //        RTC_ITConfig(RTC_IT_SEC, ENABLE);//使能秒中断        
         //        RTC_WaitForLastTask();//等待操作完成
            }
            #ifdef RTCClockOutput_Enable   
               RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
               PWR_BackupAccessCmd(ENABLE);   
               BKP_TamperPinCmd(DISABLE);   
               BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
            #endif
         }
      
    2. 初次启动
      RTC_First_Config
      void RTC_First_Config(void){
              //首次启用RTC的设置
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//启用PWR和BKP的时钟(from APB1)
         PWR_BackupAccessCmd<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,RTC(实时时钟)是一个独立的模块,用于提供精确的时间和日期信息。下面是STM32 RTC初始化的示例代码[^1]: ```c #include "stm32f10x.h" #include "stm32f10x_rtc.h" #include "stm32f10x_pwr.h" #include "stm32f10x_bkp.h" void RTC_Init(void) { // 使能PWR和BKP外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); // 允许访问RTC和后备寄存器 PWR_BackupAccessCmd(ENABLE); // 检查RTC和后备寄存器是否已经初始化 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5A5A) { // RTC配置 RCC_LSEConfig(RCC_LSE_ON); // 使能外部低速晶振 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { // 等待外部低速晶振稳定 } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // 选择RTC时钟源 RCC_RTCCLKCmd(ENABLE); // 使能RTC时钟 RTC_WaitForLastTask(); // 等待RTC寄存器操作完成 RTC_WaitForSynchro(); // 等待RTC寄存器同步 RTC_ITConfig(RTC_IT_SEC, ENABLE); // 使能RTC秒中断 RTC_WaitForLastTask(); // 等待RTC寄存器操作完成 RTC_SetPrescaler(32767); // 设置RTC预分频器,使RTC时钟为1Hz RTC_WaitForLastTask(); // 等待RTC寄存器操作完成 BKP_WriteBackupRegister(BKP_DR1, 0x5A5A); // 标记RTC已经初始化 } else { RTC_WaitForSynchro(); // 等待RTC寄存器同步 } RTC_ITConfig(RTC_IT_SEC, ENABLE); // 使能RTC秒中断 RTC_WaitForLastTask(); // 等待RTC寄存器操作完成 } ``` 这段代码的作用是初始化STM32的RTC模块。首先,使能PWR和BKP外设时钟,并允许访问RTC和后备寄存器。然后,检查RTC和后备寄存器是否已经初始化,如果没有初始化,则进行RTC的配置,包括使能外部低速晶振、选择RTC时钟源、使能RTC时钟、设置RTC预分频器等。最后,标记RTC已经初始化,并使能RTC秒中断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值