天南地北客
发表于: 2016-5-18 10:14:45 | 显示全部楼层

实时时钟(RTC)是一个专用于保持时间的计时元素。在许多的应用中,特别是在需要执行精确定时操作的应用,RTC是非常有用的工具。除了钟表这类应用的例子外还包括洗衣机、医药柜、数据记录仪等。RTC基本上是一个定时计数器,但和MCU的其他定时器不同的是,它更精确一些。在此之前文章中,我们探讨了STM32定时器,但他们对PWM生成、时基和其它波形相关任务的应用程序是有用的。那些都不适合于精确的计时功能。在大多数的8位MCU中,像普通的PIC和AVR,并有没有内置RTC模块,所以当我们需要一个板载的精确计时器件时,只能使用类似常见的DS1302或PCF8563的专用RTC芯片。这些芯片还需要一些额外的电路、布线以及电路板空间。但是,目前大多数先进的微控制器都集成了设计人员可以想到的每一个可能的硬件。这仅取决于设计者决定使用现代微控制器的哪个资源,来满足特定的设计目标。制造用于满足应用特定需求的MCU的时代已经过去了,在设计中使用并涉及多个元件的时代也已经过去了。因此,成本、时间和空间都会大大减少,从而导致出现更聪明、更时尚和更微小的价格适中的设备。幸运的是,STM32s属于这些新时代的微控制器。 STM32微控制器内置RTC模块,不需要额外的硬件支持。本教程介绍STM32内部RTC的基本功能,以及如何使用它进行计时应用。

Block_Diagram.bmp


STM32 RTC模块的特点

STM32微控制器内嵌的RTC是一个独立的二进制编码的十进制(BCD)定时器计数器。 RTC内核由计数器、预分频器、时钟分频器、报警数据寄存器等组成。与任何一款标准的RTC芯片一样,内嵌的RTC可以用于提供一个全功能的基于软件的日历,并带有报警功能。但是,在软件方面需要做的更多,而硬件方面不需要。当使用RTC芯片时,仅需要读取或写入个别的日期时间寄存器。在STM32微控制器中,我们需要做的还不止这些,因为不存在独立的日期时间寄存器。

一旦时间设置后,复位或从休眠/待机模式唤醒单片机不会重新初始化时间。如果备用电池(VBAT)引脚有备用电池它会变得更好。STM32的所有VDDS可以被关断,或者换句话说整个MCU内核可以完全关闭,但备用电池保持RTC和备份域的运行。因此,在掉电和休眠模式的过程中,时间不会改变或者丢失。STM32内嵌的RTC的主要特点如下:

■    分频器:分频系数最大可达220。

■    用于长期测量的32位可编程计数器

■    两个独立的时钟:APB1接口的PCLK1和RTC时钟。

■    RTC时钟源可以是以下的任何一个:

      ■    HSE时钟除以128。

      ■    LSE振荡器时钟。

      ■    LSI振荡器时钟。

RTC-Clock-Sources.bmp

■    两个独立的复位类型:

      ■    APB1接口由系统复位进行复位。

      ■    RTC的内核仅可以通过备份域复位进行复位。

■    三个专用的可屏蔽的中断方式:

      ■    报警中断,用于生成软件可编程的报警中断。

      ■    秒中断,用于生成周期长度可编程的周期性的中断信号(最高可达1秒)。

      ■    溢出中断,检测内部可编程计数器何时回零。

功能说明

下面显示的是一个典型STM32F10x微控制器的内嵌RTC的框图。

Block_Diagram44.bmp

RTC由两大部分组成。第一个是APB1总线接口。APB1总线接口由时钟分频器组成,用于连接APB1总线。该接口还包括一组16位寄存器,可以通过APB1总线操作进行读取/写入。

另一部分是RTC内核。它由一组可编程计数器组成,并分为两个模块。第一模块是RTC分频器模块。这个模块通过使用一个20位的可编程分频器生成一个可编程时基的一秒钟(TR_CLK)。另一个模块是用来保持秒计数的一个32位宽的可编程计数器。既然是32位宽,一秒的时间TR_CLK,可记录长达4,294,967,296秒或者是大约一个世纪 - 对于任何机器或人的寿命来说都是一个相当大的时间。

有几个报警相关的寄存器,其工作方式与定时器中的比较匹配中断方式类似。与计数器寄存器中的值进行比较时,无论存储在报警寄存器的是何值,当两个寄存器组具有相同的值时,就会产生报警事件。

RTC内核完全独立于RTC APB1接口,就像独立的看门狗定时器(IWDG)。 RTC寄存器、计数器、报警和标志是通过APB1接口进行访问,但计数器寄存器是由一个单独的RTC时钟更新。如框图所示,即使APB1总线没有供电,RTC内核会一直工作。使用电池或超级电容作为备份电源时才会有可能这样。


原文章STM32’s internal RTC

跳转到指定楼层
天南地北客
发表于: 2016-5-19 10:16:34 | 显示全部楼层

RTC寄存器

大多数的RTC寄存器是16位宽的,而余下的寄存器都是不足一个字节的宽度。有两个RTC控制寄存器来设置RTC的属性。其余的寄存器是计数器和时钟分频器。可以参看下面的RTC寄存器映射表:

RTC-Registers.bmp

RTC_CRH寄存器是第一个控制寄存器,负责设置与RTC模块相关的中断。有三种类型的中断,分别是报警、溢出和秒中断。

另一个控制寄存器是RTC_CRL。该寄存器包含了触发像计数器溢出、报警、RTC状态等事件的多个标志位。

然后,我们看到了RTC预分频装载寄存器RTC_PRLLRTC_PRLH。他们一起是20位宽。这两个寄存器用于分割RTC时钟源的频率。这些寄存器被写保护,需要特殊的步骤才能禁止这种保护。在例子中我用了一个外部32.768 kHz晶振,所以这些寄存器需要装载32,767来获得一秒钟。因此,获得TR时钟(TR_CLK)的频率公式可以为:

Formula.bmp

接下来是RTC除数寄存器 - RTC_DIVLRTC_DIVH。这些寄存器的目的是为了获得一个比秒计数分辨率更高的时钟,例如100毫秒。这些寄存器通常不使用。

RTC计数器寄存器 - RTC_CNTLRTC_CNTH是最重要的寄存器,因为它们保持秒或换句话说时间的计数值。这些寄存器每个都是16位宽。一旦设置完成后,这些寄存器就会返回当前时间。只有进入配置模式时才可以写这些寄存器。

最后有两个专用于报警的16位寄存器RTC_ALRLRTC_ALRH,他们保存有报警的时间数据。这组寄存器就像一个典型的数据寄存器或者是RAM位置。当报警设置,报警寄存器值与RTC计数器寄存器值进行比较。这些寄存器中的值匹配时会触发报警。只能在配置模式再次修改这些寄存器。

除了RTC模块内的寄存器,我们还需要处理备份模块的寄存器。STM32微控制器的备份域有点像EEPROM内存,但是本质上讲它不是真正的EEPROM存储器,因为在VBAT引脚它需要备用电池来保存数据。备份域总共由42个数据寄存器组成,每个16位宽。这些通常用于在STM32微控制器断电或者处于待机模式时保留用户数据。因此,备份数据寄存器可以认为是电池供电的RAM存储器。

Hardware-Setup.bmp

Backup-Registers.bmp

除了这些备份域寄存器,我们也需要备份和RTC模块的附加功能的其它寄存器。这些寄存器现在不需要并且在这里不讨论。我们需要电源控制(PWR)寄存器来禁用备份域的写保护方案。电源控制寄存器将在另一篇文章中详细介绍。

Power-Control-Register.bmp

和配置HSE/ HSI / PLL主时钟一样,我们也要配置LSE/ LSI的时钟。我们将配置复位和时钟控制(RCC)模块的一些寄存器。 使用RCC_BDCRRCC_CSR寄存器来选择RTC时钟源,使能低速(LSI和LSE)的时钟源。

RCC-Registers.bmp

回复

使用道具 举报

天南地北客
发表于: 2016-5-19 15:31:08 | 显示全部楼层

硬件设置

这个例子的硬件设置很简单。在这个演示中,我使用的是STM32F103C8T6微控制器、一个2×16字符点阵LCD连接到GPIOB端口引脚以及连接到GPIOA端口引脚的四个按钮。这些按钮用于设置时间。因为我用到了LSE时钟,将32.768 kHz时钟晶体连接到PC14和PC15引脚。我也用了8MHz的外部晶振用于RCC,采用PLL,时钟速度倍频来产生72 MHz的系统时钟。 3.6V、250mAH的备用锂离子电池连接到VBAT引脚。这样就可以向备份域和RTC内核供电。

Hardware-Setup.bmp

RCC的内部设置如下:

RCC-Setup.bmp

除了选择RTC时钟源外,RCC的其余设置由MIKROC编译器的时钟配置工具来完成。写代码前需要注意的一点是RTC时钟应比PCLK1慢至少4倍。


到现在为止通过了解基础认识,我们可以明白备用电源的必要性。该备份可以以各种方式来实现。两种常见的备用电源是:

■     电池 - 镍氢小,镍镉,锂离子或锂聚合物电池。

■     超级电容器 - 0.22F到1F。

我用的是前一种方法。后者方法适合于短时电源中断。我用一个小时测试了这种形式的备份,可以正常工作。前者的工作的会更好一些。由于RTC和备份模块消耗功率非常低,备用电源会缓慢释放。超级电容器比电池将会更快放电以及电压电平快速下降,因此它们并不旨在作为长期备份。但是超级电容器比电池具有寿命长,需要更换的次数更少。

ST建议VBAT引脚连接到一个备份电源或VDD。 但是VBAT引脚不会向备用电源充电。因此,我们需要一种机制,当VDD是可用时可以向备用电源充电。这里有两种方法:

Backup-Schemes.png

在两种方法中,二极管D1是一个低压降二极管,优先选择类似1N5819肖特基二极管的开关二极管。当VDD时可用时,该二极管向备份电源充电,同时向VBAT引脚供电。VBAT允许的电压范围为1.8V - 3.6V。有了这个二极管,VBAT引脚上的电压不会超过最大允许值。 VBAT通常会是3V。电容C1稳定备份电源,并减少微小的电压纹波(如有)。


当使用超级电容器代替电池时,我们需要非常小心,因为完全放电的超级电容器就像一个临时短路。当连接到电源时,它会拉高电流向自身快速充电,形成一个暂时的电源浪涌和电压跌落。如果没有注意到这点,该电源浪涌可能会损坏向MCU供电的板载稳压器。因此,为了防止这种情况发生,使用了电阻R1。该电阻会缓慢向超级电容充电。采用这种结构超级电容充电大约需要一分钟。在这段时间内的任何电源中断都会造成备份寄存器的数据损失以及影响RTC的功能。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 33 | 回复: 100



手机版|

GMT+8, 2024-4-26 12:48 , Processed in 0.069127 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表