搜索
bottom↓
回复: 50

STM32学习笔记之—RTC

[复制链接]

出0入0汤圆

发表于 2008-4-26 10:16:45 | 显示全部楼层 |阅读模式
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”来重新设置时钟数据,下面是几张调试的图片:


(原文件名:2cee0597-fc57-4cba-ace7-91ff1347e4e4.jpg)


(原文件名:3d674677-b01d-4f05-8fea-e963d05faa2e.jpg)


(原文件名:f82fa9c8-74ae-44a4-9e90-bc671931e49f.jpg)


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

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

出0入0汤圆

发表于 2008-4-26 10:44:01 | 显示全部楼层
ding

出0入0汤圆

发表于 2008-4-26 13:03:17 | 显示全部楼层
lz,说说,如何把一个记数值秒,转化为HHMMSS格式。其他的不关心。

出0入0汤圆

发表于 2008-4-26 14:00:32 | 显示全部楼层
ding 一个

出10入120汤圆

发表于 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秒

出0入0汤圆

 楼主| 发表于 2008-4-27 18:40:56 | 显示全部楼层
今天一看,穿“裤子”了,高兴之中继续努力!

出0入0汤圆

发表于 2008-4-27 22:26:28 | 显示全部楼层
呵呵,谢谢

出0入0汤圆

发表于 2008-6-14 12:26:41 | 显示全部楼层
make

出0入0汤圆

发表于 2008-6-17 13:01:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-7-10 10:23:56 | 显示全部楼层
楼主辛苦了!谢谢我学习一下

出0入0汤圆

发表于 2008-8-10 22:01:12 | 显示全部楼层
以下蓝色文字由版主:bluelucky 于:2008-08-10,22:01:12 加入。
<font color=black>请发贴人注意:
本贴放在这分区不合适,即将移走
原来分区:[1032]ARM技术论坛
即将移去的分区:[3011]Cortex-M3技术讨论区
移动执行时间:自本贴发表0小时后

任何的疑问或咨询,请可随时联系站长。谢谢你的支持!
</font>

出0入0汤圆

发表于 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....");
    }
可是重新上电还是不能保存时间不知道为什么请大家指点:

出0入0汤圆

发表于 2008-8-12 18:09:59 | 显示全部楼层
同样问题
mark

出0入0汤圆

发表于 2008-8-14 13:44:44 | 显示全部楼层
哪里有没设置好的地方吗

出0入93汤圆

发表于 2008-8-14 15:56:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-15 13:09:36 | 显示全部楼层
mark 是什么啊

出0入0汤圆

发表于 2008-9-1 09:58:46 | 显示全部楼层
我的跳线问题!呵呵!

出0入0汤圆

发表于 2008-9-6 12:20:33 | 显示全部楼层
mark 记号.

出0入0汤圆

发表于 2008-12-12 15:30:40 | 显示全部楼层
mark&nbsp;too

出0入0汤圆

发表于 2008-12-21 09:10:30 | 显示全部楼层
mark.

3Q

出0入0汤圆

发表于 2009-1-15 13:29:48 | 显示全部楼层
3Q

出0入0汤圆

发表于 2009-6-21 23:13:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-9 00:31:24 | 显示全部楼层
今天参考上了  顶一下  写得非常好

出0入0汤圆

发表于 2009-8-13 10:24:17 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2009-9-5 14:38:24 | 显示全部楼层
下载中,顶一下先,我的RTC老是初始货不成功.

出0入0汤圆

发表于 2009-9-23 16:31:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-21 21:21:43 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2009-10-21 21:44:07 | 显示全部楼层
学习,

出0入0汤圆

发表于 2009-10-22 06:45:40 | 显示全部楼层
下了,谢谢!

出0入0汤圆

发表于 2009-10-28 08:17:51 | 显示全部楼层

出0入0汤圆

发表于 2009-12-25 18:22:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-15 21:07:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-23 10:20:03 | 显示全部楼层
谢谢  程序很明了 给我帮助很大呢  。

出0入0汤圆

发表于 2011-9-18 15:26:54 | 显示全部楼层
标记一下  项目中用到了rtc

出0入0汤圆

发表于 2011-9-23 16:32:51 | 显示全部楼层
回复【楼主位】wormchen
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-11-28 08:41:40 | 显示全部楼层
标记!!!!

出0入0汤圆

发表于 2011-11-29 10:52:09 | 显示全部楼层
至今未用过RTC,不知准不准

出0入0汤圆

发表于 2011-11-30 17:37:56 | 显示全部楼层
准备学习RTC,MARK

出0入0汤圆

发表于 2011-12-2 00:36:54 | 显示全部楼层
STM32学习笔记之—RTC

出0入0汤圆

发表于 2011-12-22 04:58:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-23 10:48:52 | 显示全部楼层
先抄 后运行···3Q

出0入0汤圆

发表于 2011-12-29 11:45:12 | 显示全部楼层
马克

出0入0汤圆

发表于 2012-5-28 13:51:03 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2012-5-28 19:52:48 | 显示全部楼层
表示去过楼主博客

出0入20汤圆

发表于 2012-6-2 10:13:39 | 显示全部楼层
daicheng 发表于 2008-8-12 17:19
我设置如下:void RTC_Configuration(void)
{
/* Enable PWR and BKP clocks */

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

出0入0汤圆

发表于 2012-7-1 23:24:38 | 显示全部楼层
mark学习,最近也在做RTC

出0入0汤圆

发表于 2012-7-8 22:08:29 | 显示全部楼层
yoyo mark

出0入54汤圆

发表于 2012-7-16 08:13:39 | 显示全部楼层
顶楼主 辛苦你了

出0入0汤圆

发表于 2012-8-6 18:02:43 | 显示全部楼层
收藏,慢慢看

出0入0汤圆

发表于 2012-10-1 17:46:47 | 显示全部楼层
   mark     

出0入0汤圆

发表于 2012-10-1 19:35:47 | 显示全部楼层
学习总...
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 17:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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