wormchen 发表于 2008-4-26 10:16:45

STM32学习笔记之—RTC

STM32学习笔记之—RTC

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_CLK。RTC的预分频模块包含了一个 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位计数器到23:59:59时清零;

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

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

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

http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_260584.jpg
(原文件名:2cee0597-fc57-4cba-ace7-91ff1347e4e4.jpg)

http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_260585.jpg
(原文件名:3d674677-b01d-4f05-8fea-e963d05faa2e.jpg)

http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_260586.jpg
(原文件名:f82fa9c8-74ae-44a4-9e90-bc671931e49f.jpg)


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

点击此处下载 ourdev_260587.rar(文件大小:793K) (原文件名:9feec771-8e45-4d95-835c-0cc8b9573f6c.rar)

ilymy 发表于 2008-4-26 10:44:01

ding

luxinsun 发表于 2008-4-26 13:03:17

lz,说说,如何把一个记数值秒,转化为HHMMSS格式。其他的不关心。

mengniu 发表于 2008-4-26 14:00:32

ding 一个

makesoft 发表于 2008-4-27 00:47:34

2楼,直接有现成函数可以使用的

struct tm * gmtime(const time_t *);
struct tm * localtime(const time_t *);
time_t mktime(struct tm *);

前两个函数是把秒数转换成格林威治或者本地时间,后面的一个是反过来,把时间转换为秒数。
基准时间都是1970年1月1日0点0分0秒

wormchen 发表于 2008-4-27 18:40:56

今天一看,穿“裤子”了,高兴之中继续努力!

benladn911 发表于 2008-4-27 22:26:28

呵呵,谢谢

dogcome 发表于 2008-6-14 12:26:41

make

abcdezh 发表于 2008-6-17 13:01:42

mark

sunke9 发表于 2008-7-10 10:23:56

楼主辛苦了!谢谢我学习一下

bluelucky 发表于 2008-8-10 22:01:12

以下蓝色文字由版主:bluelucky 于:2008-08-10,22:01:12 加入。<font color=black>请发贴人注意:本贴放在这分区不合适,即将移走
原来分区:ARM技术论坛
即将移去的分区:Cortex-M3技术讨论区
移动执行时间:自本贴发表0小时后
任何的疑问或咨询,请可随时联系站长。谢谢你的支持!</font>

daicheng 发表于 2008-8-12 17:19:59

我设置如下:void RTC_Configuration(void)
{
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);// 怀疑你漏了这句

/* Reset Backup Domain */
BKP_DeInit();

/* Enable LSE */
RCC_LSEConfig(RCC_LSE_ON);
/* Wait till LSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{}

/* Select LSE as RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE);

/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();

/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();

/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC, ENABLE);

/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();

/* Set RTC prescaler: set RTC period to 1sec */
RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
我判断:
if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
   PutString1("RTC 不曾配置....");
    //RTC_Configuration();
    PutString1("RTC 开始配置....");
    Time_Adjust( y, m, d, h, mm, s);
    BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
else
{
   if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
    {
   PutString1("\r\n电源复位....");
    }
else if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
    {
   PutString1("\r\n External Reset occurred....");
    }
可是重新上电还是不能保存时间不知道为什么请大家指点:

346675655 发表于 2008-8-12 18:09:59

同样问题
mark

daicheng 发表于 2008-8-14 13:44:44

哪里有没设置好的地方吗

friendljy 发表于 2008-8-14 15:56:21

mark

daicheng 发表于 2008-8-15 13:09:36

mark 是什么啊

daicheng 发表于 2008-9-1 09:58:46

我的跳线问题!呵呵!

manbkk 发表于 2008-9-6 12:20:33

mark 记号.

Small 发表于 2008-12-12 15:30:40

mark&nbsp;too

laotong 发表于 2008-12-21 09:10:30

mark.

3Q

sdmcu51 发表于 2009-1-15 13:29:48

3Q

dingdangCat 发表于 2009-6-21 23:13:01

mark

aozima 发表于 2009-8-9 00:31:24

今天参考上了顶一下写得非常好

wujiang0925 发表于 2009-8-13 10:24:17

支持一下

rlplc 发表于 2009-9-5 14:38:24

下载中,顶一下先,我的RTC老是初始货不成功.

yzlyear 发表于 2009-9-23 16:31:23

mark

wso75839840 发表于 2009-10-21 21:21:43

学习一下

bird07 发表于 2009-10-21 21:44:07

学习,

zwc58 发表于 2009-10-22 06:45:40

下了,谢谢!

gdmfq 发表于 2009-10-28 08:17:51

wangjiecdma 发表于 2009-12-25 18:22:01

mark

Yaksa 发表于 2010-9-15 21:07:27

mark

wengfeiyin 发表于 2011-8-23 10:20:03

谢谢程序很明了 给我帮助很大呢。

buxinshan 发表于 2011-9-18 15:26:54

标记一下项目中用到了rtc

jennfer83395 发表于 2011-9-23 16:32:51

回复【楼主位】wormchen
-----------------------------------------------------------------------

准备学习RTC,看了很有帮助

l09046162 发表于 2011-11-28 08:41:40

标记!!!!

unicornlucifer 发表于 2011-11-29 10:52:09

至今未用过RTC,不知准不准

Blueyas 发表于 2011-11-30 17:37:56

准备学习RTC,MARK

shappy 发表于 2011-12-2 00:36:54

STM32学习笔记之—RTC

sanbanzui2008 发表于 2011-12-22 04:58:51

mark

wenzj123 发表于 2011-12-23 10:48:52

先抄 后运行···3Q

qingdayrr 发表于 2011-12-29 11:45:12

马克

qzxy0927 发表于 2012-5-28 13:51:03

谢谢楼主分享

detail2012 发表于 2012-5-28 19:52:48

表示去过楼主博客{:lol:}

mon51 发表于 2012-6-2 10:13:39

daicheng 发表于 2008-8-12 17:19 static/image/common/back.gif
我设置如下:void RTC_Configuration(void)
{
/* Enable PWR and BKP clocks */


stm32的时钟只是一个软时钟,没有飞利浦的好用.

dingshidong214 发表于 2012-7-1 23:24:38

mark学习,最近也在做RTC

yo_yo 发表于 2012-7-8 22:08:29

yoyo mark

unifax001 发表于 2012-7-16 08:13:39

顶楼主 辛苦你了

jeep_jun 发表于 2012-8-6 18:02:43

收藏,慢慢看

波儿 发表于 2012-10-1 17:46:47

   mark   {:handshake:}{:handshake:}

leicai05 发表于 2012-10-1 19:35:47

学习总...
页: [1]
查看完整版本: STM32学习笔记之—RTC