IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Stm32之RTC时钟(2021-07-26) -> 正文阅读

[嵌入式]Stm32之RTC时钟(2021-07-26)

Stm32之RTC时钟

1.时钟框图:

  • 先将之前没做笔记的时候的时间框架图补上:

    同样源自正点原子的PPT,图中红框的部分为RTC的时钟源,有三种:

    • HSE的128分频;

    • LSI(大概40kHz)

    • LSE(原子精英板上外接32.768kHz)

    在这里插入图片描述

  • RTC内部的时钟图:

    内部共有三个中断:

    • RTC_Second秒中断,即每个TR_CLK脉冲 (通常设置为1hz,即脉冲时间周期1s) 均会中断一次;

      图中的预分频器主要目的也是为了将RTC_CLK分频产生TR_CLK为1s的脉冲

    • RTC_OverfloW溢出中断,即32位RTC_CNT计数器满值后溢出产生的中断;

    • RTC_Alarm闹钟中断,即我们先设定在ALR寄存器中的值,当CNT向上计数到于ALR的值相等时,产生的中断,该中断即是外部中断线17,EXTI17的中断,可由其来配置是中断/事件。

    • 一点补充:

      RTC_PRL(19位)是将RTC_CLK分频,即将RTC_CLK的时钟脉冲周期倍数增大 (见下面公式)

      f T R _ C L K = f R T C _ C L K R T C _ P R L + 1 T T R _ C L K = T R T C _ C L K ? ( R T C _ P R L + 1 ) f_{TR\_CLK}=\frac{f_{RTC\_CLK}}{RTC\_PRL+1}\\ T_{TR\_CLK}=T_{RTC\_CLK}*{(RTC\_PRL+1)} fTR_CLK?=RTC_PRL+1fRTC_CLK??TTR_CLK?=TRTC_CLK??(RTC_PRL+1)
      而RTC_DIV是余数寄存器,记录的是原时钟源脉冲的时钟周期数,余数可以理解为倍数后的TR_CLK的小数部分的意思。其在RTC_CLK脉冲下由PRL的值递减到0,再重装载。

    在这里插入图片描述

2.寄存器介绍

1)RTC内部寄存器:

  • RTC_CRH(Control Register High):只有低三位有效[2:0],分别是[2]OWIE*(溢出中断使能位)*;[1]ALRIE (闹钟中断使能位);[0]SECIE (秒中断使能位)【均是1开启使能】

  • RTC_CRL(Control Register Low):低六位有效:(以下按顺序位6到位0)

    • RTOFF (RTC operation OFF): 指示对其寄存器进行的最后一次操作的状态(1上次操作已完成,0上次操作未完成),只能读;常在程序中,等待其为1时来检测操作是否完成。
    • CNF (Configuration flag):由软件置1和清0;只有其置1后才可以操作(写)CNT,ALR, PRL.
    • RSF (Registers synchronized flag):寄存器同步标志位,其置1后即表示CNT,ALR,PRL的值已被同步到APB1接口上;只有等待其置1后才可以读CNT,ALR,PRL的值
    • OWF (溢出中断标志位),ALRF (闹钟中断标志位),SECF (秒中断标志位)
  • RTC_PRLL和RTC_PRLH:装载PRL*(Prescaler ReLoad Low/High )*的值,共19位

  • RTC_DIVH 和RTC_DIVL (RTC clock Divider )装载着余数的值,只能读,可以获得精确的时间测量,因为其时钟周期为RTC_CLK(即为分频前,时钟周期更短)。共19位,递减溢出后重装载为PRL的值。

  • RTC_CNTH和RTC_CNTL (32位的计数器) 用来存放递增的计数器;

  • RTC_ALRH和RTC_ALRL (32位闹钟值设置寄存器) ,用于设置闹钟值,即于CNT比较的值,注意其受RTOFF位保护,当且RTOFF为1时才可操作;

2)RTC相关寄存器:

  • BKP*(BacK Prepare Rrgister)*备份寄存器,42 * 16位寄存器组成(可存84Bytes数据);断电时可由Vbat供电保证数据数据不丢失,待机唤醒,不随系统复位;

  • RCC_APB1ENR的PWREN和BKPEN相关时钟使能位,来打开电源和后备接口的时钟

    电源控制寄存器(PWR_CR)的 DBP 位来使能对后备寄存器和 RTC 的访问。

3.库函数使用:

这里原子的PPT给的非常详细了:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于RTC的配置步骤:

在这里插入图片描述

4.原子代码的使用

只需要将原子内的rtc.c和让rtc.h加入文件即可;

  • 在初始化前建议将RTC_Init()中的标志位即当前时间更改;如下:

    (因为代码内无法高亮,用四个!!!!标出)

    u8 RTC_Init(void)
    {
    	//检查是不是第一次配置时钟
    	u8 temp=0;
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//使能PWR和BKP外设时钟   
    	PWR_BackupAccessCmd(ENABLE);	//使能后备寄存器访问  
    	if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051)		//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
            
    	//!!!!此处的标志与下面的标志位对应更改才可以初始化,第一次时有效0x5051改成0x任意16位数(与下文对应即可)
    		
        {	 			 
    		BKP_DeInit();	//复位备份区域 	
    		RCC_LSEConfig(RCC_LSE_ON);	//设置外部低速晶振(LSE),使用外设低速晶振
    		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)	//检查指定的RCC标志位设置与否,等待低速晶振就绪
    			{
    			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_Set(2021,7,25,15,30,30);  //设置时间
            
            //!!!!将时间设置为所需的当前时间
    		
            RTC_ExitConfigMode(); //退出配置模式  
    		BKP_WriteBackupRegister(BKP_DR1, 0X5051);	//向指定的后备寄存器中写入用户程序数据
    		
            //!!!!此处标志位做同样的修改
    		
        }
    	else//系统继续计时
    		{
    		RTC_WaitForSynchro();	//等待最近一次对RTC寄存器的写操作完成
    		RTC_ITConfig(RTC_IT_SEC, ENABLE);	//使能RTC秒中断
    		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
    		}
    	RTC_NVIC_Config();//RCT中断分组设置		    				     
    	RTC_Get();//更新时间	
    	return 0; //ok
    
    }		 		
    
  • 只需要在主函数中包含对应的头文件让rtc.h,即可使用结构体 calendar.w_year*(w_month/w_date/hour/min/sec)*查询时间;

    因为原子在秒中断函数中实时更新这个结构体。

最后,用RTC和3.5寸的lcd屏做了个能走时的时钟 (难度不大,就是在时钟的时分秒针的走动处理上会比较烦些) ,代码已经开源在gitee上,连接如下:

有兴趣的同学可以下载来看看:[码云仓库连接](ZET6小项目: 是学习stm32zet6时做的一些小项目练习。 (gitee.com))

👇👇这是效果gif*(用的是原子的精英板和3.5寸的TFTLCD屏)*
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:23:50  更:2021-07-27 16:25:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:23:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码