原创 [原创]STM32学习笔记之—RTC

2008-4-25 15:46 6981 6 14 分类: MCU/ 嵌入式

STM32学习笔记之—RTC<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


wormchenx@gmail.com


写这篇学习笔记的时候距上一篇笔记间隔的时间不短了,期间有网友关心询问为什么不更新文章,主要是这一段时间工作太忙了没有闲暇时间做下来学习,工作是重要的事情,不能把饭碗丢了啊o(_)o…,好了废话少说切入正题。


既然我们要使用RTC就要先对它有个大致的了解,知己知彼才能百战不殆嘛!STM32内部RTC功能非常实用,它的供电和时钟是独立于内核的,可以说是STM32内部独立的外设模块,有加上RTC内部寄存器不受系统复位掉电的影响,我们可以才用外部电池供电和32768表振晶体来实现真正RTC(实时时钟)功能。的这里引用手册里一段概述RTC由两个主要部分组成。第一部分(APB1接口)用来和 APB1总线相连。此单元还包含一组 16位寄存器,可通过 APB1总线对其进读写操作。APB1接口以 APB1总线时钟为时钟,用来与 APB1总线接口。


另一部分(RTC核)由一系可编程计数器组成,分成两个主要模块。第一个模块是 RTC的预分频模块,它可编程产生最长为 1秒的 RTC时间基准 TR_CLKRTC的预分频模块包含一个 20位的可编程分频器(RTC预分频器)。在每个TR_CLK周期中,如果在 RTC_CR 寄存器中设置相应允许位,则 RTC产生一个中断(秒中断)。第 2个模块是一个 32位的可编程的计数器,它可被初始化为当前的系统时间。系统时间以 TR_CLK增长并与存储在 RTC_ALR寄存器中的可编程的时间相比较,如果 RTC_CR控制寄存器中设置相应允许位,则比较匹配时将产生一个闹钟中断


对于第一次实用RTC的时候我们要对它进行配置一番,现在大致说一下(代码是通过调用RTC_Config函数来实现的):


1.      打开电源管理和备份寄存器时钟,提到备份寄存器这里要说一下,引用手册--备份寄存器是 10 16位的寄存器,可用来存储 20个字节的用户应用程序数据。他们处在备份域,当 VDD电源被断,他们仍然由 VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也会被复位”我们正式通过在备份寄存器写固定的数据来判断芯片是否第一次实用RTC,从而在系统运行RTC时提示配置时钟的。


2.      使能RTC和备份寄存器的访问(复位默认关闭)。引用手册--复位后,对备份寄存器和 RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。电源控制寄存器(PWR_CR) DBP位必须被置 1,以允许访问备份寄存器和RTC.”因为程序要对RTC和备份寄存器操作,所以必须使能。


3.      选择外部低速晶体为RTC时钟,并使能时钟;


4.      使能秒中断,程序里在秒中断里置位标志位来通知主程序显示时间数据,同时在32位计数器到235959时清零;


5.      设置RTC预分频器值产生1秒信号计算公式 fTR_CLK = fRTCCLK/(PRL+1),我们设置32767来产生秒信号;


在这里要注意一下,所有在对RTC寄存器操作之前都要判断读写操作是否完成,也就是说当前是否有读写操作。系统内核是通过RTCAPB1接口来访问RTC内部寄存器的,所以在上电复位,休眠唤醒的时候,我们要先对RTC时钟与 RTC APB1时钟进重新同步,在同步完成后再对器进行操作,因为RTCAP1接口使用的系统APB1的时钟。上述配置在初次使用RTC时进行配置,在以后使用过程中,只要RTC外部电池持续供电,无论系统掉电还复位我们都无需重复配置,使用使能秒中断就可以了这一点很是方便嘿嘿...


在使用过程中我们通过读取32位可编程计数器的值来获取时钟信息,程序是通过串口2来向PC机发送数据来显示时钟的,并且还可以通过像STM32发送字符“S”来重新设置时钟数据,下面是几张调试的图片:


点击看大图


点击看大图


点击看大图


 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />




结束语:本也是才开始学习STM32,知道的也是皮毛而已,如果说的不对的地方还请指出。下面是工程代码,参考了官方的例子,硬件环境还是英培的EMSTM32V1,特介于篇幅这里就不做详细介绍了,代码有注释,不清楚的地方再联系我。


点击下载代码:rar

PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

用户1379840 2009-11-6 21:17

用户213184 2009-7-27 16:06

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); 这里有个问题,为什么配置时钟的时候,要上面这两句话?3Q!

用户1079511 2008-4-30 08:50

可以做个USB键盘或鼠标来验证下位机啊!ST的有这方面的例子的。

用户1407470 2008-4-29 23:20

哈哈,弄不明白USB的PC端程序怎么办,就是对应IAR的LIB把下位机搞通,上位机没有,也不能验证啊,还是期待上位机高手来解决啊

用户1359586 2008-4-25 21:40

USB的确是需要较多的时间来学习其协议等,我看了几天了,还是有很多不懂,期待你早日动手!

用户1079511 2008-4-25 18:48

USB理论知识比较多,不太好理解。下一个试验时就是USB,到时候可以讨论一下!o(∩_∩)o...

用户1359586 2008-4-25 17:40

感觉STM32一般的外设都不难,看着手册,对照例子花些时间就搞定,就是USB,我看了n久都是迷茫啊

用户1407470 2008-4-25 16:15

我也初学这个,以后多多交流,我的EK-STM32F板子的串口好象不通
相关推荐阅读
用户1079511 2009-07-10 16:08
Mega16读取SD卡内的FAT16文件
最近一直在学习FAT文件系统,在网络上找了一些资料加上参考别人写的程序,现在已经可以读取SD/MMC卡指定的文件,有些东西自己也不是很懂,回头还得慢慢研究。程序比较简单,就是读取SD卡的基本信息和初始...
用户1079511 2009-04-14 08:38
[原创]AVR M16热敏电阻测温LCM12864显示
https://static.assets-stash.eet-china.com/album/old-resources/2009/4/14/d085d878-6d8f-4245-acdb-cf44...
用户1079511 2009-04-08 11:34
Mega16 Bootloader+PC端上位机
AVR的Bootloader功能很方便产品的在线升级,以前参考网上的资料写过下位机的程序,标准的XMODEM协议,用超级终端来升级程序。最近在学习C#,所以用C#写个简单的上位机软件,配合以前的boo...
用户1079511 2009-01-22 16:15
Mega16热敏电阻测温上位机曲线显示
最近在一直学习用C#做上位机,把以前的做的m16热敏电阻测温的程序翻出来,稍加修改通过串口发给PC;PC端用c#2008写程序,接收数据后通过ZedGraph绘图控件实时显示出曲线图。ZedGraph...
用户1079511 2009-01-09 09:25
[原创]c#的Hex转Bin小程序
最近在搞AVR的bootloader,程序已经写好了,参考网上的代码用的是XMODEM协议用XP自带的超级终端。问题是xmodem支持bin格式的文件,一般用编译器生成的是hex文件不用直接使用,需要...
用户1079511 2008-12-31 10:42
[学习]用595驱动LED实现灰度调节
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />前一段时间在ouravr论坛里闲逛的...
EE直播间
更多
我要评论
8
6
关闭 站长推荐上一条 /3 下一条