第七章 金龙107——RTC
7.1 RTC简介: RTC是“Real Time Clock”的简称,意为实时时钟,想必各位读者都非常熟悉这一模块(例如DS1302),事实上,RTC模块在电子产品上的应用非常广泛,从大型的工业机器到个人电脑、家用电器甚至是廉价的电子手表,都不乏RTC的身影。 STM32微控制器向用户提供了一个简易的RTC单元,之所以说其简易,因为其本质上是一个独立的32位定时器,没有类似DS1302的日历功能(相应的软件配置也可实现)。 RTC使用的时钟源有三种,分别为高速外部时钟的 128 分频:HSE/128;低速内部时钟 LSI;使 用HSE 分频时钟或 LSI 的话,在主电源 VDD 掉电的情况下,这两个时钟来源都会受到影响,因此没法保证 RTC 正常工作。因此 RTC 一般使用 低速外部时钟 LSE,频率为实时时钟模块中常用的 32.768KHz,这是因为 32768 = file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wps254.tmp.png,分频容易实现,所以它被广泛应用到 RTC 模块。在主电源 VDD 有效的情况下(待机),RTC 还可以配置闹钟事件使 STM32 退出待机模式。 7.2实验说明:金龙107开发板V1.0一块,J-linkV8,keil4.23,STM3.2库文件V3.5.0,USB数据线一根 3.2寸彩屏一块(SSD1298),串口线一根在本实验中,主要使用STM32F107的RTC来实现数字时钟设计,通过串口打印输出到上位机 主要跳线帽:JP4和JP7都接在2-3上,JP10和JP11接在2-3上 7.3硬件说明:本实验主要涉及的硬件是3.2寸彩屏的显示和USART1的使用, 7.4程序说明:本程序设计要点如下: ①配置RCC寄存器组,打开APB1总线上的PWR、BKP设备时钟,开启LSE(外部低速晶振,典型值为32.768khz)并选择其为RTC计时时钟。 ②配置GPIO、USART寄存器组。 ③配置RTC寄存器组,使能秒中断,设置 RTC时钟分频值为32767。 ④配置NVIC,开启RTC秒事件中断。 本实验配置主要是对于RTC的配置,如果你是第一次启动的话,根据串口提示,他会首先让你设置时间,在你不断电,复位的时候不需要从新设置时间,一旦断电,则时间就需要重新通过串口设置,RTC的配置如下: 注意: 我们要区分RTC的两个时钟,一是来自APB1总线的PCLK1时钟(36MHz),另一个是来自外部低速晶振LSE所提供的32.768kHz时钟。其中PCLK1时钟是供给STM32打开以及存取备份电源控制区的写保护用的,而写保护开关包含在BKP以及PWR寄存器组中,来自LSE的时钟则仅给RTC提供给32位定时器计数使用。 本例中也使能了RTC的秒中断,每秒中断一次,置标志位为1,主函数检测到该标志位,则把实时时间打印输出。进入中断之后,判断中断源,清除中断标志位。我们从这里不难看出,RTC进行一次计时的时间T=(32767+1)/32.768kHz=1s。这样就可以得到时间间隔为秒的中断事件,同时读者也应该认识到为什么会有32.768kHz这样频率的晶振存在_____当某个分频寄存器的位数达到15位以上时,就可以提供至少为file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ksohtml\wps257.tmp.png=32768的分频值,配合32.768kHz的晶振就可以得到1Hz的频率,即1s时间周期,因此,32.768kHz的晶振经常用于带有实时时钟的系统中。 如果内核要对 RTC 寄存器进行任何的写操作,在内核发出写指令后,RTC模块在 3 个 RTCCLK 时钟之后,才开始正式的写 RTC 寄存器操作。我们知道RTCCLK 的频率比内核主频低得多,所以必须要检查 RTC 关闭操作标志位RTOFF,当这个标志被置 1 时,写操作才正式完成。这里调用了库函数RTC_WaitForLastTask();来确保写操作的完成。 同时本例中使用到了USART1的收发功能,断电之后首次启动,设置实时时间,和程序运行时,打印输出实时时间。 7.5实验现象:连接串口线,设置好串口调试助手,注意端口要对应,彩屏蓝色字体显示“Gold Dragon ”, 红色字体显示:"RTC example:",其实彩屏在本例中,作用并不大,可忽略,我们在输入框里输入1,连续回车6次,程序就开始计时并通过RS232把时间发送到串口调试助手,设置和实验现象如下图
|