mini2440硬件篇之RTC

发布者:黑白之间最新更新时间:2016-12-01 来源: eefocus关键字:mini2440  硬件篇  RTC 手机看文章 扫描二维码
随时随地手机看文章


  1.  硬件原理

实时时钟(RTC)的主要功能是在系统掉电的情况下,利用后备电源使时钟继续运行,从而不会丢失时间信息。


1.1. 时间的设置和获取

s3c2440内部集成了RTC模块,而且用起来也十分简单。其内部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分别存储了当前的秒,分,小时,星期,日,月和年,表示时间的数值都是BCD码。这些寄存器的内容可读可写,并且只有在寄存器RTCCON的第0位为1时才能进行读写操作。为了防止误操作,当不进行读写时,要把该位清零。当读取这些寄存器时,能够获知当前的时间;当写入这些寄存器时,能够改变当前的时间。另外需要注意的是,因为有所谓的“一秒误差”,因此当读取到的秒为0时,需要重新再读取一遍这些寄存器的内容,才能保证时间的正确。


1.2. 报警和时间节拍

s3c2440实时时钟(RTC)中,定义了两个中断源:报警中断和时间节拍中断。

时间节拍中断,顾名思义,就像一个节拍器,可以等时性的控制节拍。因此它类似于定时器中断。但时间节拍中断是毫秒级的,而定时器中断可以达到微秒,甚至更小级别。时间节拍中断的周期公式为:(n+1)÷128,单位是秒,即每隔这么长时间,会中断一次。其中n的值为1~127,它存储在寄存器TICNT的低6位中,当寄存器TICNT的第7位被置1时,表示开启时间节拍中断,这时n递减,当减为0时,进入时间节拍中断。

报警中断可以实现当实时时间达到预置的时间后,引起报警。预置的时间是存储在报警时间数据寄存器中的,包括ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小时)、ALMMIN(分)和ALMSEC(秒)。而如何报警,是由报警控制寄存器RTCALM控制的。它的第6位置1表示全局报警,而第5位到第0位置1分别表示年、月、日、小时、分和秒报警。比如,我们想要在2010年4月5日22时30分0秒报警,那么把这个时间分别存储到相应的报警时间数据寄存器中,然后设置RTCALM为0x7F,这样当实时时钟到达这个时刻时,会引起报警中断;又比如我们想要系统具有闹钟的功能,让它每天早上6点提醒我们起床,那么我们可以设置ALMHOUR为6,RTCALM为0x44。如果我们只想让系统在4月份的时候提醒我们6点起床,那该怎么办呢?这个问题对于s3c2440来说就是小菜一碟,只要我们再在ALMMON里写入4,然后把RTCALM改为0x54即可。总之,就是系统根据RTCALM所置1的相应位来比较相对应的当前时间与报警时间数据寄存器中的值,如果相等就进入中断。

2. 芯片手册

3. mini2440电路图

4. S3C2440寄存器

RTCCON控制寄存器

选择时钟,使能RTC。BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分别存储了当前的秒,分,小时,星期,日,月和年,表示时间的数值都是BCD码。

TICNT 计数寄存器

[7]使能中断,[6:0]计数值

RTCALM报警控制

分别使能年月日时分秒和总报警开关。预置的时间是存储在报警时间数据寄存器中的,包括ALMYEAR(年)、ALMMON(月)、ALMDATE(日)、ALMHOUR(小时)、ALMMIN(分)和ALMSEC(秒)。

rtc.h


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: rtc.h  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:rtc驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #ifndef __RTC_H__  

  12. #define __RTC_H__  

  13.   

  14. #define  DBG_RTC_LEVEL 1  

  15.   

  16. /*函数声明*/  

  17. void RTCInit(void );  

  18. void RTCTest(void);  

  19.   

  20.   

  21. #endif  

rtc.c


  1. /******************************************************************* 

  2.  * Copyright (C),2011-2012, XXX. 

  3.  * FileName: rtc.c  

  4.  * Author:HuangYinqing 

  5.  * Version:1.0 

  6.  * Date::2012-04-22 

  7.  * Description:rtc驱动. 

  8.  * Function List: 

  9.  * History: 

  10.  ******************************************************************/  

  11. #include "common.h"  

  12. #include "core.h"  

  13. #include "rtc.h"  

  14.   

  15. unsigned char pucAlarmBuffer[6];    //==报警缓存数组  

  16. unsigned char pucDateBuffer[7];     //==时间缓冲数组    

  17.   

  18.   

  19. /******************************************************************** 

  20. 函数功能:RTC报警中断。 

  21. 入口参数:无。 

  22. 返    回:无。 

  23. 备    注:无。 

  24. ********************************************************************/  

  25. static void __irq RTCAlarmHandler(void)  

  26. {  

  27.     rSRCPND |= BIT_RTC;  

  28.     rINTPND |= BIT_RTC;  

  29.   

  30.     rTICNT = 0xbf;      //开启时间节拍中断,周期为500毫秒  

  31.       

  32.     rGPBDAT |= 0x01;    //==蜂鸣器响  

  33. }  

  34.   

  35. /******************************************************************** 

  36. 函数功能:时钟节拍中断。 

  37. 入口参数:无。 

  38. 返    回:无。 

  39. 备    注:无。 

  40. ********************************************************************/  

  41. static void __irq RTCTickHandler(void)  

  42. {  

  43.     static char count;  

  44.       

  45.     rSRCPND |= BIT_TICK;  

  46.     rINTPND |= BIT_TICK;  

  47.       

  48.     if( count == 10 )   //==响5秒不再响  

  49.     {  

  50.         rGPBDAT &= ~(0x01);  

  51.         rTICNT = 0;  

  52.         count = 0;  

  53.     }  

  54.       

  55.     count++;  

  56. }  

  57.   

  58.   

  59. /******************************************************************** 

  60. 函数功能:RTC初始化。 

  61. 入口参数:无。 

  62. 返    回:无。 

  63. 备    注:无。 

  64. ********************************************************************/  

  65. void RTCInit(void)  

  66. {  

  67.     rGPBCON &= ~(0x3<<0);  

  68.     rGPBCON |= 0x1<<0;  

  69.     rGPBDAT &= ~(0x01); //==蜂鸣器不响  

  70.   

  71.     rRTCCON = 1;  

  72.     rRTCALM = (1<<6) | (1<<0);   //==开全局闹钟和秒闹钟  

  73.   

  74.     pISR_RTC = ( unsigned int )RTCAlarmHandler;  

  75.     pISR_TICK = ( unsigned int )RTCTickHandler;  

  76.     rINTMSK &= ~(BIT_RTC);  

  77.     rINTMSK &= ~(BIT_TICK);  

  78. }  

  79.   

  80.   

  81. /******************************************************************** 

  82. 函数功能:设置报警时间。 

  83. 入口参数:无 

  84. 返    回:无。 

  85. 备    注:无。 

  86. ********************************************************************/  

  87. void RTCSetAlarm(void)  

  88. {  

  89.     rALMYEAR = pucAlarmBuffer[0];           //年  

  90.     rALMMON  = pucAlarmBuffer[1];           //月  

  91.     rALMDATE = pucAlarmBuffer[2];           //日  

  92.     rALMHOUR = pucAlarmBuffer[3];           //小时  

  93.     rALMMIN  = pucAlarmBuffer[4];           //分  

  94.     rALMSEC  = pucAlarmBuffer[5];           //秒  

  95. }  

  96.   

  97.   

  98. /******************************************************************** 

  99. 函数功能:设置时间。 

  100. 入口参数:无 

  101. 返    回:无。 

  102. 备    注:无。 

  103. ********************************************************************/  

  104. void RTCSetDate(void)  

  105. {  

  106.     rRTCCON |= 1 ;  

  107.       

  108.     rBCDYEAR = pucDateBuffer[0] ;           //年  

  109.     rBCDMON  = pucDateBuffer[1] ;           //月  

  110.     rBCDDATE = pucDateBuffer[2] ;           //日    

  111.     rBCDHOUR = pucDateBuffer[3] ;           //小时  

  112.     rBCDMIN  = pucDateBuffer[4] ;           //分  

  113.     rBCDSEC  = pucDateBuffer[5] ;           //秒  

  114.     rBCDDAY  = pucDateBuffer[6] ;           //星期  

  115.           

  116.     rRTCCON &= ~(0x1) ;  

  117. }  

  118.   

  119.   

  120. /******************************************************************** 

  121. 函数功能:获取时间。 

  122. 入口参数:无 

  123. 返    回:无。 

  124. 备    注:无。 

  125. ********************************************************************/  

  126. void RTCGetDate(void)  

  127. {  

  128.     rRTCCON |= 1;  

  129.       

  130.     pucDateBuffer[0] = rBCDYEAR;            //年  

  131.     pucDateBuffer[1] = rBCDMON;             //月  

  132.     pucDateBuffer[2] = rBCDDATE;            //日    

  133.     pucDateBuffer[3] = rBCDHOUR;            //小时  

  134.     pucDateBuffer[4] = rBCDMIN;             //分  

  135.     pucDateBuffer[5] = rBCDSEC;             //秒  

  136.     pucDateBuffer[6] = rBCDDAY;             //星期  

  137.       

  138.     //当秒为0时,重新读取  

  139.     if(pucDateBuffer[5]==0)  

  140.     {  

  141.        pucDateBuffer[0] = rBCDYEAR;         //年  

  142.        pucDateBuffer[1] = rBCDMON;          //月  

  143.        pucDateBuffer[2] = rBCDDATE;         //日    

  144.        pucDateBuffer[3] = rBCDHOUR;         //小时  

  145.        pucDateBuffer[4] = rBCDMIN;          //分  

  146.        pucDateBuffer[5] = rBCDSEC;          //秒  

  147.        pucDateBuffer[6] = rBCDDAY;          //星期  

  148.     }  

  149.       

  150.     rRTCCON &= ~(0x1) ;  

  151. }  

  152.   

  153.   

  154. /******************************************************************** 

  155. 函数功能:RTC测试。 

  156. 入口参数:无 

  157. 返    回:无。 

  158. 备    注:无。 

  159. ********************************************************************/  

  160. void RTCTest(void)   

  161. {  

  162. #if 0  

  163.     pucDateBuffer[0] = 0x12;        //==年  

  164.     pucDateBuffer[1] = 0x05;        //==月  

  165.     pucDateBuffer[2] = 0x03;        //==日  

  166.     pucDateBuffer[3] = 0x12;        //==时  

  167.     pucDateBuffer[4] = 0x28;        //==分  

  168.     pucDateBuffer[5] = 0x00;        //==秒  

  169.     pucDateBuffer[6] = 0x04;        //==星期  

  170.       

  171.     RTCSetDate() ;  

  172.     memset(pucDateBuffer, 0 ,7);  

  173. #endif  

  174.          

  175.     DbgPrintX( DBG_RTC_LEVEL, "RTC TIME Display\n" ) ;  

  176.   

  177. //  RTCGetDate();  

  178. //  memcpy(pucAlarmBuffer, pucDateBuffer, 6);  

  179.     pucAlarmBuffer[5] = 0x50;       //==每分钟的50秒报警  

  180.     RTCSetAlarm();  

  181.   

  182.     while(1)  

  183.     {  

  184.         RTCGetDate();  

  185.   

  186.         DbgPrintX( DBG_RTC_LEVEL,  "\rRTC time : %04x-%02x-%02x %02x:%02x:%02x",    

  187.             pucDateBuffer[0] + 0x2000,    

  188.             pucDateBuffer[1],    

  189.             pucDateBuffer[2],  

  190.             pucDateBuffer[4],   

  191.             pucDateBuffer[5],   

  192.             pucDateBuffer[6] );  

  193.   

  194.         mdelay(300) ;  

  195.     }  

  196. }  



关键字:mini2440  硬件篇  RTC 引用地址:mini2440硬件篇之RTC

上一篇:mini2440硬件篇之IIS
下一篇:mini2440硬件篇之ADC触摸屏

推荐阅读最新更新时间:2024-03-16 15:22

STM32F0xx_ RTC实时时钟配置详细过程
Ⅰ、概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下。 STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC的设置和时间维持不变。 STM32F0的RTC模块和F1的RTC模块最大区别在于F0模块中有“DATE”和“TIME”寄存器,也就是可以直接读取寄存器里面的值,而F1是秒计数寄存器的值,需要通过相关算法下才能得到时间的值。 本文提供的软件工程里面还包含一个BKP模块,主要是用于掉电保持RTC数值(第一次上电初始化RTC,后面就不用初始化)。例程是在第一次初始化RTC值为:2016年6月5日 周七 12
[单片机]
STM32F0xx_ <font color='red'>RTC</font>实时时钟配置详细过程
STM32-(27):RTC实时时钟
实时时钟的缩写是RTC(Real_Time Clock) 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期 RTC由两个主要部分组成。第一部分(APB1接口)用来和APB1总线相连。此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作。APB1接口以APB1总线时钟为时钟。 另一部分(RTC核)由一系列可编程计数器组成,分成两个主要模块: 第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK,RTC的预分频模块包含了一个20位的可编程分频器(RTC预芬频器)。在每个TR_CLK周期中,如果
[单片机]
STM32-(27):<font color='red'>RTC</font>实时时钟
mini2440按键驱动程序分析
先说明一下按键与S3C2440芯片的连接方式: KEY1 ---- EINT8 ---- GPG0 KEY2 ---- EINT11 ---- GPG3 KEY3 ---- EINT13 ---- GPG5 KEY4 ---- EINT14 ---- GPG6 KEY5 ---- EINT15 ---- GPG7 KEY6 ---- EINT19 ---- GPG11 驱动程序源码如下: (drivers/char/mini2440_buttons.c) #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux
[单片机]
友善之臂Mini2440之嵌入式Linux下Nand Flash驱动分析
一、Nand Flash驱动源码文件含义 在Linux内核中,MTD源代码放在/driver/mtd目录下,该目录中包含chips、devices、maps、nand、onenand和ubi六个子目录。其中只有nand和onenand目录中的代码才与Nand驱动有关,nand目录中的代码比较通用,而onenand目录中的代码相对于nand中的代码而言简化了许多,是三星公司开发的另类nand Flash。市场占有率不是很高。所以,开发基于MTD的nand驱动程序,基本上只需要关注nand目录了,包括Kconfig、Makefile以及如下重要文件: 1、nand_base.c 定义了Nand驱动中对nand芯片最基本的操
[单片机]
驱动开发之 DM9000 (for mini2440
内核版本:linux-2.6.32.2 实验平台:mini2440 1. 添加平台设备支持 首先需要在mach-mini2440.c中包含头文件 linux/dm9000.h ,dm9000平台设备定义如下: /* DM9000AEP 10/100 ethernet controller */ #define MACH_MINI2440_DM9000_BASE (S3C2410_CS4 + 0x300) static struct resource mini2440_dm9000_resource = { = { .start = MACH_MINI2440_DM9000_BASE, .end = MAC
[单片机]
驱动开发之 DM9000 (for <font color='red'>mini2440</font>)
MSP430单片机RTC操作-TimeA实现的实时时钟
//******************************************************************************* // D13x Demo - 利用Timer_A及中断实现RTC,观察LED灯的闪烁频率 // // 描述:利用Timer_A及中断实现RTC;通过 P1 异或 来取反 P1.5; // 系统处于休眠状态LPM3,中断时唤醒执行P1.5切换 // ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k // // MSP430F13x // ------------------- // /|| XIN|- // | | | 32kHz //
[单片机]
万物互联时代,大普通信RTC芯片乘风来了
集微网报道,在5G、大数据、云计算等技术带动下,万物互联时代正在加速到来,时间信息成为智能万物的必需品,精准的时间提供了基于时间信息的应用和服务。 大普通信RTC产品线总监刘炜表示,RTC芯片在整个时钟链路中是一个非常重要的环节,万物互联的时代催生了各行各业对时间精度和记录的需求,也让RTC芯片有了新的定义和海量需求。 需求与供给缺口较大,新晋品牌迎补位机遇 刘炜称,当前RTC芯片行业市场呈现出高速增长的趋势,一些原本不会用到RTC芯片的应用领域,正逐渐呈现出强劲的需求预期。例如,在热水器、壁挂炉、冰箱、抽油烟机等智能家电领域,增加时间信息可以满足消费者对于品质的深度体验要求,它们作为智能家电的终端,需要也必须更“Smart”。R
[手机便携]
万物互联时代,大普通信<font color='red'>RTC</font>芯片乘风来了
STM32L151C8周期性从待机模式唤醒(RTC Wakeup Timer)
#include stm32l1xx.h #include system_stm32l1xx.h #include OLED.h #include delay.h void RtcWakeUpConfig(void); u8 RtcInit(void); u8 RtcConfig(void); int main() { DelayInit(); //延时初始化 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR时钟 if(PWR_GetFlagStatus(PWR_FLAG_SB)) //从待机模式唤醒 { PWR_Cle
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved