15.10、 Calendar实时时钟与农历年月日实验.pdf

上传人:紫竹语嫣 文档编号:5514372 上传时间:2020-05-27 格式:PDF 页数:14 大小:618.68KB
返回 下载 相关 举报
15.10、 Calendar实时时钟与农历年月日实验.pdf_第1页
第1页 / 共14页
15.10、 Calendar实时时钟与农历年月日实验.pdf_第2页
第2页 / 共14页
15.10、 Calendar实时时钟与农历年月日实验.pdf_第3页
第3页 / 共14页
15.10、 Calendar实时时钟与农历年月日实验.pdf_第4页
第4页 / 共14页
15.10、 Calendar实时时钟与农历年月日实验.pdf_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《15.10、 Calendar实时时钟与农历年月日实验.pdf》由会员分享,可在线阅读,更多相关《15.10、 Calendar实时时钟与农历年月日实验.pdf(14页珍藏版)》请在三一文库上搜索。

1、 Calendar实时时钟与农历年月日实验实时时钟与农历年月日实验 上一章节我们讲解了 STM32 的 RTC 原理并介绍了通过每秒显示当前实时时间的例程。 本章节我们在上一章节的继续上继续讲解 STM32 的 RTC 的高级应用, 不仅实现当前时分秒 的现实,而且实现实现 Calendar农历年月日与节气农历年月日与节气和公历日历年月日时分秒的计算和显示和公历日历年月日时分秒的计算和显示,在 乐趣中让大家更深入的掌握 RTC 实时时钟功能及用法。 ? 意义与作用意义与作用 RTC(Real-time clock)是实时时钟的意思。神舟 IV 号开发板的处理器 STM32F107 集 成了 R

2、TC(Real-time clock)实时时钟,在处理器复位或系统掉电但有实时时钟电池的情况 下,能维持系统当前的时间和日期的准确性。实时时钟是一个独立的定时器。RTC 实时时 钟模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数 器的值可以重新设置系统当前的时间和日期。 本次实验不仅实现当前时分秒的现实, 而且实 现 实 现 Calendar农历年月日与节气农历年月日与节气和公历日历年月日时分秒的计算和显示和公历日历年月日时分秒的计算和显示,在乐趣中让大家更 深入的掌握 RTC 实时时钟功能及用法。 STM32 的 RTC 主要特性为: 可编程的预分频系数:分频系

3、数最高为 220。 32 位的可编程计数器,可用于较长时间段的测量。 2 个分离的时钟:用于 APB1 接口的 PCLK1 和 RTC 时钟(RTC 时钟的频率必须小于 PCLK1 时钟频率的四分之一以上)。 可以选择以下三种 RTC 的时钟源: HSE 时钟除以 128; LSE 振荡器时钟; LSI 振荡器时钟。 2 个独立的复位类型: APB1 接口由系统复位; RTC 核心(预分频器、闹钟、计数器和分频器)只能由后备域复位。 3 个专门的可屏蔽中断: 闹钟中断,用来产生一个软件可编程的闹钟中断。 秒中断,用来产生一个可编程的周期性中断信号(最长可达 1 秒)。 溢出中断,指示内部可编程

4、计数器溢出并回转为 0 的状态 ? 实验原理实验原理 RTC由两个主要部分组成(参见下图)。第一部分(APB1接口)用来和APB1总线相连。此 单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作(参见16.4节)。APB1接口 由APB1总线时钟驱动,用来与APB1总线接口。 另一部分(RTC核心)由一组可编程计数器组 成,分成两个主要模块。第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC 时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。如 果在RTC_CR寄存器中设置了相应的允许位,则在每个TR_CLK周期中RTC产生一个中

5、断(秒 中断)。第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。系统时间 按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较, 如果RTC_CR控制 寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。 图表 1 简化的 RTC 框图 RTC 模块和时钟配置系统(RCC_BDCR 寄存器)处于后备区域,即在系统复位或从待机 模式唤醒后,RTC 的设置和时间维持不变。 系统复位后,对后备寄存器和 RTC 的访问被禁 止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和 RTC 的访问: 设置寄存器 RCC_APB1ENR

6、的 PWREN 和 BKPEN 位,使能电源和后备接口时钟 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。 ? 硬件设计硬件设计 神舟系列开发板的RTC的硬件设计非常简单,其主要硬件都集成在了处理器内部,外围 电路主需要一个32.768KH在的晶振和VBAT供电电池即可。 STM32F107内部已经包含了40kHz低速内部RC振荡电路LSE,但是其精准度不是很高,为 此我们在外部增加了32.768KHz的晶振电路驱动RTC实时时钟。 STM32的VBAT采用CR1220纽扣电池和VCC3.3混合供电的方式,在有外部电源(VCC3.3) 的时候, BT1不给处理器的VBAT供

7、电, 而在外部电源断开的时候, 则由BT1给VBAT供电。 这样, VBAT总是有电的,以保证RTC的持续运行以及后备寄存器的内容不丢失。 相关电路如下: 当安装了电池后,将 JP14 的 2,3 脚使用跳线帽短接。VBAT 管脚由电池供电,如没有 安装电池,将 JP14 的 1,2 脚使用跳线帽短接,VBAT 管脚由+3.3V 系统电源供电。 ? 软件设计软件设计 我们先从main函数讲起, 其中涉及的LED指示灯和串口等相关子程序如果之前的章节已 有介绍,则此处不再讲述。本示例涉及的程序都添加了较为详细的注释。 串口配置与串口输入输出章节的配置方法相同,不是本示例的重点,请参考相关章节。

8、上面的函数已经打印了复位的原因,此处RCC_ClearFlag()函数的目的是清除上次复位原 因的记录。 函数Time_Show()是一个while死循环,每秒打印一次系统时间。全局变量TimeDisplay 是否为1,如果为1则打印时间并将请TimeDisplay清0以便它在“stm32f10x_it.c“文件的“void RTC_IRQHandler(void)“函数中当发生秒中断时再次置为1,这样便实现了精准的每秒输出时 间一次,其实现如下: Time_Show()函数中又调用了两个子函数Time_Display()和RTC_GetCounter(),其中 RTC_GetCounter(

9、)函数只是简单的读取RTC的Counter寄存器的值,其实现如下: 注意:此实验的Time_Display()函数与上一个实验有所不同。此处的Time_Display()函数 使用静态局部变量FirstDisplay保证在第一次调用该函数时计算并打印当前时间对应的农历 年月日与农历节气 对应的农历 年月日与农历节气, 并且将RTC_GetCounter()读到RTC的Counter寄存器的值转换为年月日时 分秒的时间信息并打印,其实现如下: 此处的Time_Display()函数调用了计算农历日期与节气的三个函数,这三个函数位于 calendar.c中,所以在main函数开始的地方需要使用ex

10、tern来声明这几个函数,然后再使用, 如下图所示: 本例程与上一章节的例程在程序文件上多了以下四个文件: 其中“date.c”实现了时间信息与计数值之间的相互转换功能。 其中“calendar.c”实现了超强的日历功能,支持农历,24节气几乎所有日历的功能, 日历时间以1970年为元年,用32bit的时间寄存器可以运行到2100年左右。 - 其中的中断相关相关函数解释如下: “InterruptConfig()” 函数告诉处理器中断向量表存放的起始地址, STM32支持中断向量 表起始地址动态设置,这个特性在SRAM调试和DFU固件升级时很有用,以为这些情况下中 断向量表起始地址已经不是0x

11、0000处。此处将中断向量表起始地址设置为内部Flash的起始 地址0x08000000处。 NVIC_Configuration 函数实现配置嵌套向量中断中断优先级并使能中断。其中的 NVIC_PriorityGroupConfig 函数配置中断优先级的组织方式, STM32 的嵌套向量中断控制器 可以配置 16 个可编程的优先等级,使用了 4 位表示中断优先级(2 的 4 此方就是 16),16 个可编程的优先等级又可以分为主优先级和次优先级,例如参数 NVIC_PriorityGroup_1 表 示 1bit 主优先级(pre-emption priority)3 bits 次优先级(s

12、ubpriority )。 以下为中断处理函数,请看代码注释。注意其中的对全局变量以下为中断处理函数,请看代码注释。注意其中的对全局变量TimeDisplay的置一与的置一与 Time_Show()函数中的清零操作相呼应,是实现精确函数中的清零操作相呼应,是实现精确1秒延时的关键。秒延时的关键。 -RTC_Configuration- 其中的中断相关相关函数解释如下: 上述多个程序中都调用了以下等待的子函数调用: 为什么要不停的等待呢? RTC核完全独立于RTC APB1接口。 软件通过APB1接口访问RTC的预分频值、计数器值和 闹钟值。但是,相关的可读寄存器只在与RTC APB1时钟进行重

13、新同步的RTC时钟的上升沿被 更新。RTC标志也是如此的。 这意味着,如果APB1接口曾经被关闭,而读操作又是在刚刚重 新开启APB1之后,则在第一次的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能 被破坏了(通常读到0)。因此,若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态, 则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1。 ( 注: RTC的 APB1接口不受WFI和WFE等低功耗模式的影响。) - 时间调整相关 - Time_Adjust函数实现时间调整相关功能, 首先调用Time_Regulate(&systmtime)函数请求

14、 用户输入年月日时分秒等信息,然后使用mktimev函数将用户输入的年月日时分秒等信息转 换为计数器的计数值并对RTC计数器赋值保存: Time_Regulate函数多次调用用户输入函数,要求用户输入年月日时分秒等信息: ? 下载与验证下载与验证 神舟IV号光盘源码目录包含本实验的工程源码,在神舟IV号光盘源码 10、Calendar 实 时 时 钟RTC与 农 历 年 月 日.rarProject10、Calendar实 时 时 钟RTC与 农 历 年 月 日 EWARMv5STM32F107VC-ARMJISHUExe目录下的ARMJISHU_Calendar实时时钟与年月 日.hex文件

15、即为前面我们分析的Calendar实时时钟与年月日实验编译好的固件,我们可以直 接将固件下载到神舟IV号开发板中,观察运行效果。 如果使用JLINK下载固件,请按错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。下载固件 到神舟IV号开发板小节进行操作。 如果使用USB下载固件,请按错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。小节进行操 作。 如果使用串口下载固件,请按错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。错误!未找到引用源。小节进行 操作。 如果在IAR开发环境中, 下载编译好的固件或者在线调试, 请按错

16、误! 未找到引用源。错误! 未找到引用源。 错误!未找到引用源。错误!未找到引用源。小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误!未找到引用源。 错误!未找到引用源。错误!未找到引用源。小节进行操作。 ? 实验现象实验现象 下载后神舟IV号STM32开发板串口会有打样信息输出,如果是第一次运行该程序,则 串口会输出提示“RTC not yet configured”然后会要求用户输入公历的年月日和时分秒信 息如下图所示: 用户根据当前时间输入公历的年月日和时分秒信息然后,神舟IV号STM32开发板会保 存该信息,然后显示对应的农历年月日与农历节气显示对应的农历年月日与农历节气每秒刷新一次公历的年月日和时分秒信 息。如下图所示: 如果不是第一次运行该程序,上次运行时已经设置了系统时间,在复位重启或者有RTC 电池时断电重启后,串口会输出提示“No need to configure RTC”然后提示重启原因,之 后显示对应的农历年月日与农历节气显示对应的农历年月日与农历节气每秒刷新一次公历的年月日和时分秒信息。如下图所 示:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料


经营许可证编号:宁ICP备18001539号-1