历史上的今天
返回首页

历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2018年10月08日 | STM32RTC实时时钟

2018-10-08 来源:eefocus

我用的是STM32库函数:两个知识点:
      一、RTC时钟框图分析(重要)
      二、时间是怎样显示出来的(简析)
一、RTC时钟框图分析(重要)
先熟悉一下几个知识点:
      1、STM32的实时时钟(RTC)是一个独立的定时器!
      2、RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位火从待机模式唤醒后RTC的设置和时间维持不变。

RTC这章中,对RTC相关的寄存器的操作特别重要,我在这里不解释了,请查阅手册。。

先上图!

STM32RTC实时时钟

RTC时钟框图分为完全独立的两个部分:1、APB1接口部分(用来RTC相关的寄存器);2、RTC核心;
      第一部分:APB1接口。注意:这里涉及到寄存器RTC_CRL中的RSF位,这位是寄存器的同步标志,具体内容去看STM32参考手册RTC这一章。
      第二部分:RTC核心。这里分为两个模块:1、RTC预分频器模块;2、一个32位的可编程计数器;
      下面开始分析第二部分:
       先给大家介绍下后备区域的几个特别重要的寄存器:
       1、RTC_DIV(重要):RTC预分频器余数寄存器。这个寄存器的作用是来获得比秒钟更加准确的时钟(0.1s,0.01s),该寄存器是自减的,用来保存还需要多少个时钟周期获得一个秒信号。这里加上一个公式(STM32参考手册里有):fTR_CLK=fRTCCLK/(PRL[19:0]+1)    到这里是书上的原话~!
       解释一下,RTC_DIV寄存器的值是由RTC_PRL(RTC预分频器装载寄存器)提供的,而RTC_DIV寄存器的时钟频率是由RTCCLK提供的(看图)。比如我们把RTC_PRL值设为32767,则RTC_DIV寄存器的值也为32767,他和RTCCLK的时钟频率是一样的(这里根据上面的公式,RTC_PRL加1,则RTC_DIV也加1)。RTCCLK的时钟周期是1/32768(s),也就是每一个RTCCLK的时钟周期,RTC_DIV自减1,直至到1s钟后,被硬件重新装载,也就是1s钟减32768次。那他到底是怎么提供0.1s,甚至是0.01s的呢?
       举个例子就明白了。比如我想要得到1.12秒的这个时间,就要求RTC_DIV自减0.12/(1/32768)次。RTC_DIV只得到0.12s的时间,还有1s时间从哪儿来?他是TR_CLK提供的。这个问题会在下文讲解。。→_→
       2、RTC_PRL:RTC预分频装载寄存器。这个寄存器有两个作用:1、提供给RTC_DIV的重新装载值;2、设置时钟分频系数。
       第一个作用不讲了。第二个作用:设置时钟分频系数。比如我们使用32.768KHz的晶振作为时钟输入,那么我们配置这个寄存器值位32767,就可以得到1s钟的计数频率(32768/(32767+1),单位(HZ))。
       3、RTC_CNT(重要):RTC计数器寄存器。这个寄存器较简单,用来记录秒钟值。如果之前对RTC_CR(控制寄存器),的相关中断允许位配置的话,RTC_CNT寄存器可以产生一个溢出中断。
       4、RTC_ALR:RTC闹钟寄存器。从图中就可以看出来,很简单。用来标记闹钟产生时间,如果RTC_CNT的值和RTC_ALR的值相等的话,并使能中断的话(在RTC_CR(控制寄存器)中配置),会产生一个闹钟中断。
       后备区域的寄存器就给大家介绍到这儿。相比大家通过上面的介绍结合框图,头脑里面应该有个大致流程了吧。没有~!?卧槽~那就给大家理一遍思路→_→
       首先外部加进来一个时钟信号RTCCLK(32.768K),然后设置RTC_PRL的分频系数为32767,得到一个秒时钟信号TR_CLK(1HZ)。当TR_CLK每过一个时钟周期,产生一个RTC_Second(秒钟中断),同时RTC_CNT计数器(记录秒值)加1。如果要求更精准的时间,还可以在RTC_CR寄存器的RSF位被置1时去读RTC_DIV的值。

二、时间是怎样显示出来的(简析)
      主函数中有这么两条语句:
      LCD_ShowString(60,130,200,16,16,"    -  -  ");       
      LCD_ShowString(60,162,200,16,16,"  :  :  ");          
      在看这三条语句(这里统称”中间三条语句“):
      LCD_ShowNum(60,130,calendar.w_year,4,16);                                     
      LCD_ShowNum(100,130,calendar.w_month,2,16);                                     
      LCD_ShowNum(124,130,calendar.w_date,2,16);
      和这三条语句(这里统称”最后三条语句“):
      LCD_ShowNum(60,162,calendar.hour,2,16);                                     
      LCD_ShowNum(84,162,calendar.min,2,16);                                     
      LCD_ShowNum(108,162,calendar.sec,2,16);
      很显然,中间三条语句是显示年月日的对应,最后三条语句是显示时分秒的对应。这些结构体成员都在初始化函数(RTC_Init();)中被赋值了,怎么赋值的,大家自己去研究吧。。。然后在硬件中,TR_CLK的每个时钟周期都会触发秒中断,在秒中断服务函数中又对时间进行了更新。
       想显示时间,是不是先得设置一个基础时间,然后让系统在基础时间上,进行自加。
       第一步:设置一个基础时间。在对时钟进行配置时(在初始化函数(RTC_Init();中配置),里面有个RTC_Set();函数,此函数会你设置的年月日时分秒进行计算,算出从1970年到你设置那个时刻总共是多少秒(这博主也不知道为什么是1970年),然后把算出来的这个秒值赋给RTC_CNT计数器作为初值。
       第二步:系统自己更新时间(自加)。时间是怎么更新的,这里给大家简单提一下。。在更新函数(RTC_Get();)中,首先会读取RTC_CNT计数器中的值,然后经过一番倒计算,计算出年月日时分秒和星期,分别赋值给那些时间的结构体变量。于是在主函数的while(1)中,会不断的被秒中断刷新时间,并显示在LCD上。
       这样,一个完整的时钟就显示在LCD屏幕上了。大功告成!
       博主不才,大牛不喜勿喷哦~


对于比较精确的时间等都是用中断的方式进行的


推荐阅读

史海拾趣

浙江凡华(FANHAR)公司的发展小趣事

对于计数型10键键盘编码译码显示电路,网友可能会有多个方面的问题,以下是一些常见问题及其回答:

一、设计基础与原理

问题1:计数型10键键盘编码译码显示电路的基本组成是什么?

回答:计数型10键键盘编码译码显示电路主要由三部分组成:键盘编码电路、译码电路和显示电路。键盘编码电路负责将按键的输入转换为对应的编码信号;译码电路则将该编码信号还原为可识别的信息或数据;最后,显示电路将译码后的信息以可视化的方式呈现出来。

问题2:编码和译码在数字电路中的作用是什么?

回答:编码是将信息或数据转换为二进制代码的过程,以便在数字系统中进行监测、控制、传输等操作。而译码则是编码的逆过程,即将二进制代码还原为原始的信息或数据,以便进行显示或进一步处理。在计数型10键键盘编码译码显示电路中,编码和译码是实现按键输入到显示输出的关键步骤。

二、技术实现细节

问题3:如何实现10键键盘的编码?

回答:实现10键键盘的编码通常可以采用优先编码器。优先编码器能够识别多个输入信号中的最高优先级信号,并将其转换为对应的编码输出。在10键键盘中,可以将10个按键的输入信号接入优先编码器的输入端,通过编码器的内部逻辑处理,得到按键对应的编码输出。

问题4:译码器如何选择以满足显示需求?

回答:译码器的选择应根据显示需求来确定。对于计数型10键键盘编码译码显示电路,如果显示的是十进制数字,则应选择能够处理十进制数的译码器,如74LS48等。此外,还需要考虑译码器的输入位数、输出类型(如共阳极或共阴极)以及驱动能力等因素,以确保译码器能够满足显示电路的要求。

问题5:显示电路如何设计以兼容不同显示器?

回答:显示电路的设计应兼顾译码器、驱动器和显示器三部分。首先,根据译码器的输出选择合适的驱动器来驱动显示器。驱动器的选择应考虑显示器的类型(如七段数码管、LED点阵等)、工作电压和电流等因素。其次,根据显示器的特性设计显示电路,包括确定显示方式(如静态显示或动态显示)、设置显示亮度等。最后,通过连接译码器、驱动器和显示器,实现按键输入到显示输出的完整电路。

三、常见问题与解决方案

问题6:如何解决按键冲突问题?

回答:按键冲突是指多个按键同时按下时,电路无法正确识别所有按键的状态。在计数型10键键盘编码译码显示电路中,可以通过采用优先编码器来避免按键冲突问题。因为优先编码器能够识别最高优先级的按键信号,并忽略其他低优先级的按键信号。此外,还可以通过软件算法来进一步处理按键冲突问题,如设置按键去抖动时间、检测按键按下和释放的时间差等。

问题7:如何提高电路的抗干扰能力?

回答:提高电路的抗干扰能力可以从多个方面入手。首先,选择具有良好抗干扰性能的元器件和电路布局方式;其次,在电路设计中加入滤波、去耦等电路来抑制干扰信号;最后,通过软件算法来识别和排除干扰信号的影响。此外,还可以采用屏蔽、接地等外部措施来进一步提高电路的抗干扰能力。

以上是对计数型10键键盘编码译码显示电路中网友可能提出的问题及其回答的总结。在实际应用中,还需要根据具体需求和条件进行灵活调整和优化。

Hifn Inc公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,它们不仅限于接收和转换电视信号,还具备丰富的网络交互功能。

机顶盒的核心功能在于接收并解码来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,将其转换成适合在电视机上播放的格式。这一过程包括接收、解码和显示三个主要步骤,确保了用户能够享受到高清乃至4K的超高清画质和震撼音效。此外,机顶盒还提供了诸如电子节目指南、因特网网页浏览等增值服务,极大地丰富了用户的观看体验。

随着技术的不断进步,机顶盒正朝着智能化、多功能化方向发展。例如,智能推荐算法能够根据用户的观看历史和偏好,提供个性化的节目推荐;语音识别技术则让用户能够通过语音指令控制机顶盒,实现更加便捷的操作体验。同时,机顶盒还支持家庭影院功能,让用户在家中就能享受到电影院般的视听效果。

总的来说,机顶盒作为连接电视与外部信号源的桥梁,不仅提升了电视节目的观看体验,还通过丰富的网络交互功能为用户提供了更加广泛的内容和娱乐选择。随着技术的不断发展和用户需求的日益多样化,机顶盒将继续在家庭娱乐领域发挥重要作用。

BNS Solutions公司的发展小趣事

在快速发展的过程中,BNS Solutions公司始终注重品质管理和品牌建设。公司建立了一套完善的质量管理体系,从原材料采购到产品生产、销售等各个环节都严格把控质量。同时,公司还注重品牌形象的塑造和维护,通过广告宣传、公关活动等方式不断提升品牌知名度和美誉度。这些举措使得BNS Solutions公司的产品在市场上具有更高的竞争力,赢得了消费者的信赖和喜爱。

Accuride公司的发展小趣事

Accuride公司在市场拓展方面也取得了显著成果。其产品不仅供应给北美地区的商用车制造商,还远销至其他国家。同时,Accuride与多家知名汽车品牌建立了紧密的合作关系,如Freightliner、Peterbilt、International、Great Dane和Mack等,为其提供高品质的零部件。这些合作伙伴关系的建立,不仅提升了Accuride的市场地位,也为其带来了稳定的订单和收入来源。

Electric Imp Inc.公司的发展小趣事

为了进一步提升品牌影响力和市场份额,Electric Imp Inc.公司开始实施国际化战略。公司先后在北美、欧洲、亚洲等地设立了研发中心和分支机构,以便更好地了解当地市场需求和技术趋势。同时,公司还积极参加国际展览、研讨会等活动,与全球同行交流经验、分享技术。这些努力使得公司的国际化水平不断提高。

GISMA Steckverbinder GmbH公司的发展小趣事

随着技术的不断进步,GISMA持续加大研发投入,不断推出新产品以满足市场需求。其产品线从最初的几个系列扩展到如今的16个系列,涵盖了超过15000种不同类型的连接器。这些连接器不仅具有高电气性能和出色的防水性能,还能够在恶劣的水下环境中保持稳定的工作状态。GISMA的技术创新能力和产品线拓展策略,为其在电子行业中的持续发展奠定了坚实基础。

问答坊 | AI 解惑

基于A/D和D/A转换的单片机语音录放设计

哪位高手能提供下怎么通过A/D和D/A转换将语音录放啊?很急,万分感谢,如有兴趣的可以Q聊,270329846…

查看全部问答>

使用scsi命令遇到了问题,请高手指点:

现在可以用DeviceIoctrl 发scsi命令给USB设备,但是只有发送DATA_IN的命令,底层USB设备有响应,发送DATA_OUT的命令,底层USB设备没有响应.底层USB设备是USB Mass Storage设备,工作正常.不知为什么? 高人可以给个向USB盘写数据的SCSI例子吗?谢谢…

查看全部问答>

求wince 下的串口程序 只要实现单向通信就行

只要2个按钮,一个发送,一个接受…

查看全部问答>

Freescale iMX27 iMX515硬件平台设计—兼职Allegro PCB Layout

Freescale iMX27 iMX515 Hardware Design—Allegro PCB Layout Freescale iMX27 iMX515硬件平台设计—兼职Allegro PCB Layout 本人现从事(嵌入式ARM)电子硬件设计开发工作。工作时间较为自由。现利用业余时间 兼职Allegro PCB Layout,或者代 ...…

查看全部问答>

大家用贴片电阻电容还是直插的?

大家用贴片电阻电容还是直插的?    …

查看全部问答>

STM32F有外部总线引出吗?

                                    请问STM32F10X是否有外部总线引出给用户用的?…

查看全部问答>

串口调试

我用串口调试助手发送数据比如12 56 89 收到数据只有第一个自己是对的后面的就不正确了 不知道什么原因程序是用TimerA比较捕获做的 在就是串口调试助手时怎么来发送数据的…

查看全部问答>

开工做四轴飞行器,立贴

开工做四轴飞行器,立贴为证 先做一个微型的,有人想一起做的话,跟帖…

查看全部问答>

SMT焊接

本帖最后由 dontium 于 2015-1-23 11:11 编辑 在焊接mos管接地焊盘有气泡,比例约50%,x射线去解决? …

查看全部问答>

各位前辈,请教做机器人用什么开发板学习比较好?

本人完全新人一枚,一直做PC应用软件开发,对嵌入式毫无经验,只是因为喜欢,想学习一下, 主要是想通过具体目标来进行学习,比如做个智能车,但是ARM开发板真的是乱花渐欲迷人眼, 让我不知所措,所以希望前辈指点,少走弯路,比如,开发环境搭 ...…

查看全部问答>