实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。

  RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。

  系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问:

  • 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
  • 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。

  下面直接通过代码来演示如何操作RTC。

static void RTC_NVIC_Config( void )
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init( &NVIC_InitStructure );
}//实时时钟配置
//初始化RTC时钟,同时检测时钟是否工作正常
//BKP->DR1用于保存是否第一次配置的设置
//返回0:正常
//其他:错误代码
u8 RTC_Init( void )
{u8 temp = 0;RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE );PWR_BackupAccessCmd( ENABLE );        //使能后备寄存器访问if( BKP_ReadBackupRegister( BKP_DR1 ) != 0x5055 )     //检查是不是第一次配置时钟{BKP_DeInit();            //复位备份区域RCC_LSEConfig( RCC_LSE_ON );      //设置外部低速晶振(LSE),使用外设低速晶振//检查指定的RCC标志位设置与否,等待低速晶振就绪while( RCC_GetFlagStatus( RCC_FLAG_LSERDY ) == RESET && temp < 250 ){temp++;delay_ms( 10 );}if( temp >= 250 )return 1;          //初始化时钟失败,晶振有问题RCC_RTCCLKConfig( RCC_RTCCLKSource_LSE );   //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟RCC_RTCCLKCmd( ENABLE );     //使能RTC时钟RTC_WaitForLastTask();      //等待最近一次对RTC寄存器的写操作完成RTC_WaitForSynchro();       //等待RTC寄存器同步RTC_ITConfig( RTC_IT_SEC, ENABLE );     //使能RTC秒中断RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成RTC_EnterConfigMode();        // 允许配置RTC_SetPrescaler( 32767 );    //设置RTC预分频的值RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成  RTC_ExitConfigMode();         //退出配置模式BKP_WriteBackupRegister( BKP_DR1, 0x5055 ); //向指定的后备寄存器中写入用户程序数据}else            //系统继续计时{RTC_WaitForSynchro();       //等待最近一次对RTC寄存器的写操作完成RTC_ITConfig( RTC_IT_SEC | RTC_IT_ALR, ENABLE );   //使能RTC秒中断、闹钟中断RTC_WaitForLastTask();       //等待最近一次对RTC寄存器的写操作完成}RTC_NVIC_Config();         //RCT中断分组设置  return 0;                  //OK
}//RTC时钟中断
//每秒钟触发一次
void RTC_IRQHandler( void )
{if( RTC_GetITStatus( RTC_IT_SEC ) != RESET )          //秒钟中断{                                         printf( "RTC INT!\r\n" ); }//RTC_ClearITPendingBit(RTC_IT_SEC | RTC_IT_OW);RTC_ClearITPendingBit( RTC_IT_SEC | RTC_IT_ALR );RTC_WaitForLastTask();
}

  在设置RTC时首先要判断一下RTC是否已经初始化过了,因为一般使用RTC时都会有电池供电,RTC的时候只需要设置一次就行。当系统关机后,只要电池有电,RTC就能正常工作,所以不需要每次开机都初始化一次时间,当没有初始化时初始化一次,初始化之后,以后开机就不需要再初始化了。为了标记当前设备是否已经初始化了,手动的给备份寄存器中写入特定的值。每次单片机启动后就会读取一次备份寄存器的值,当备份寄存器中的值不是写入的特定值,就说明当前设备还没有被初始化过,需要初始化一次。如果备份寄存器中的值是写入的特殊值,就说明当前设备已经被初始化过了,不需要再初始化了。

  在初始化的时候,开启RTC的秒中断,这样RTC每一秒就会中断一次,在中断函数中通过串口打印数据。当程序运行后在串口工具中就可以看到每隔1秒,就会打印一个字符串。

STM32F103单片机RTC实时时钟的使用相关推荐

  1. (实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 RTC初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  2. stm32零星笔记(一)——sysTick滴答计时器、RTC实时时钟

    目录 什么是sysTick.RTC 关于时钟树 功能 延时 阻塞延时 非阻塞延时的一种近似实现 秒中断 日历与时间 RTC(Real Time Clock,实时时钟) 日期掉电保持 什么是sysTic ...

  3. stm32f4 RTC实时时钟解析

    RTC是什么–简介 RTC,英文全称:Real-time clock,中文名称:实时时钟,是指可以像时钟一様输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片.实时时钟芯片是日常生活中应用最 ...

  4. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...

  5. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc

    基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...

  6. RTC实时时钟(学习笔记)

    RTC实时时钟特征与原理 RTC(Real Time Clock):实时时钟. RTC是个独立的定时器.RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能.修改计数器的值可 ...

  7. 十九、RTC实时时钟

    一..RTC实时时钟工作框图 RTC 由两个主要部分组成,第一部分(APB1 接口)用来和 APB1 总线相连.此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作.APB1 接口 ...

  8. STM32——RTC实时时钟原理+BKP寄存器原理

    一.RTC实时时钟特征与原理 1.RTC(Real Time Clock):实时时钟 2.RTC是个独立的BCD定时器/计数器.RTC提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性 ...

  9. STM32之RTC实时时钟

    RTC实时时钟简介: STM32的RTC外设,实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运 ...

最新文章

  1. keras 的 example 文件 imdb_fasttext.py 解析
  2. Vimium - 让Chrome高效工作的神器
  3. AtCoder AGC034F RNG and XOR (概率期望、FWT)
  4. php生成gz文件,如何使用PHP创建.gz文件?
  5. CodeForces 1058C C. Vasya and Golden Ticket
  6. 如何阻止YouTube在iOS,Android和Web上自动播放视频
  7. java单车吧_暑假一个月,撸个共享单车后台
  8. javascript中setInterval,setTimeout的区别跟用法
  9. 安装操作系统的过程图解
  10. 测试的第二重境界:站在Bug之上
  11. 2022-2028全球与中国质量管理体系软件市场现状及未来发展趋势
  12. 高级系统架构师 考试经验分享
  13. iOS小技能:iOS15适配导航条主题: 背景颜色、标题颜色
  14. 学习和使用Oracle的基本Sql语句
  15. Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.4.2.RELEASE:repackage (de
  16. Java——Collections
  17. 易安卓读取HTML,易安卓(E4A)怎么保存设置?
  18. HTML5 地理位置定位(HTML5 Geolocation)
  19. Android 使用MediaProjection+ImageReader捕捉屏幕画面
  20. HDU-5976 Detachment

热门文章

  1. 吃的苦中苦,方为人上人!
  2. pcre-7.9编译安装出错[pcrecpp.lo] Error 1
  3. 洛谷 p1197 [JSOI2008]星球大战(并查集)
  4. tensorflow 遇到的细节问题
  5. 圆周卷积(circular convolution)
  6. 【开源软件】windows环境下libcurl编译
  7. cUrl 强大的文件上传/下载工具
  8. 文件读写'r'和'rb'区别
  9. javascript下的数值型比较真的没有那么简单
  10. 【python】面向对象类的继承