S3C2440-RTC

发布者:行者无疆1978最新更新时间:2015-04-09 来源: cechina关键字:S3C2440  RTC  实时时钟 手机看文章 扫描二维码
随时随地手机看文章
实时时钟(RTC)的主要功能是在系统掉电的情况下,利用后备电源使时钟继续运行,从而不会丢失时间信息。
 
s3c2440内部集成了RTC模块,而且用起来也十分简单。其内部的寄存器BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON和BCDYEAR分别存储了当前的秒,分,小时,星期,日,月和年,表示时间的数值都是BCD码。这些寄存器的内容可读可写,并且只有在寄存器RTCCON的第0位为1时才能进行读写操作。为了防止误操作,当不进行读写时,要把该位清零。当读取这些寄存器时,能够获知当前的时间;当写入这些寄存器时,能够改变当前的时间。另外需要注意的是,因为有所谓的“一秒误差”,因此当读取到的秒为0时,需要重新再读取一遍这些寄存器的内容,才能保证时间的正确。
 
下面是一个程序,可以在LCD上显示当前时间,如果按下按键,中断产生,会更新LCD上的时间。如果不通过按键,直接刷屏,会造成闪烁。
#include "Font_Libs.h"    
#include "2440addr.h"    
#define _ISR_STARTADDRESS 0x33ffff00      
#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))      
//垂直同步信号的脉宽、后肩和前肩        
#define VSPW       15        
#define VBPD       3        
#define VFPD       5         
//水平同步信号的脉宽、后肩和前肩        
#define HSPW       8        
#define HBPD       58        
#define HFPD      15        
#define CLKVAL 10        
#define HOZVAL 319        
#define LINEVAL 239        
#define PWREN 1        
#define MMODE 0        
#define PNRMODE 3        
#define BPPMODE 13        
#define INVVCLK 0        
#define INVVD 0        
#define INVVDEN 0         
#define U32 unsigned int         
#define M5D(n) ((n) & 0x1fffff)        
#define PAGEWIDTH 320        
#define OFFSIZE 0        
#define LCD_XSIZE 320        
#define LCD_YSIZE 240        
#define SCR_XSIZE 320        
#define SCR_YSIZE 240        
#define INVVLINE  1            
#define INVVFRAME 1             
#define BPP24BL 0        
#define BSWP 0        
#define HWSWP 0         
volatile U32 LCD_BUFFER[240][320];      
unsigned char data_buffer[7] = {5*16+1,1*16+7,1*16+9,2*16+6,7,1*16+2,1*16+0};       
unsigned char *temp;    
unsigned char str0[] = "当前时间为";    
unsigned char str1[] = "年";    
unsigned char str2[] = "月";    
unsigned char str3[] = "日";    
unsigned char str[][7] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};       
U32 flag;    
    
void Init_LCD(){        
rLCDCON1=(CLKVAL<<8)|(MMODE<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;   //设置CLKVAL,VCLK=HCLK/[(CLKVAL+1)*2],决定VM的触发方式,选择显示模式和BPP模式,暂时不要开启LCD,因为还没有设置好      
       rLCDCON2=(VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);    //rLCDCON2,rLCDCON3和rLCDCON4主要设置时序        
       rLCDCON3=(HBPD<<19)|(HOZVAL<<8)|(HFPD);        
       rLCDCON4=(HSPW);        
       rLCDCON5 = (BPP24BL<<12) | (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (0<<7) | (INVVDEN<<6) | (PWREN<<3)  |(BSWP<<1) | (HWSWP);                         //INVVLINE和INVVFRAME需要进行翻转,因为CPU发出的是正脉冲,LCD使用的是负脉冲,所以要改变极性,PWREN使能电源信号      
       rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);        
       rLCDSADDR2=M5D(((U32)LCD_BUFFER+(SCR_XSIZE*SCR_YSIZE*4))>>1 );        
       rLCDSADDR3=PAGEWIDTH*32/16;        
       rLCDINTMSK|=(3);              
       rTCONSEL = 0;                   
       rGPCUP = 0x0;        
       rGPDCON = 0xaaaaaaaa;        
       rGPCCON = 0xaaaa02a9;        
       rGPDUP = 0x0;        
       rGPGUP=rGPGUP&("(1<<4))|(1<<4);              
       rGPGCON=rGPGCON&("(3<<8))|(3<<8);         
       rLCDCON1 |= 1;   //使能数据输出和LCD控制信号      
}              
                   
void Paint_background(U32 c, U32 startx, U32 starty, U32 endx, U32 endy){          
    U32 i,j;             
    for(j = starty; j < endy; j++)             
        for(i = startx; i < endx; i++)             
            LCD_BUFFER[j][ i] = c;             
}         
    
void SetTime(){    
    rRTCCON |= 0x1;    
    rBCDSEC = data_buffer[0];    
    rBCDMIN = data_buffer[1];    
    rBCDHOUR = data_buffer[2];    
    rBCDDATE = data_buffer[3];    
    rBCDDAY = data_buffer[4];    
    rBCDMON = data_buffer[5];                     
    rBCDYEAR = data_buffer[6];    
    rRTCCON &= 0xfe;    
}    
[page]
void GetTime(){    
    rRTCCON |= 0x1;    
    data_buffer[0] = rBCDSEC;    
    data_buffer[1] = rBCDMIN;    
    data_buffer[2] = rBCDHOUR;    
    data_buffer[3] = rBCDDATE;    
    data_buffer[4] = rBCDDAY;    
    data_buffer[5] = rBCDMON;                
    data_buffer[6] = rBCDYEAR;    
    rRTCCON &= 0xfe;    
    if(data_buffer[0] == 0){    
        rRTCCON |= 0x1;    
        data_buffer[0] = rBCDSEC;    
        data_buffer[1] = rBCDMIN;    
        data_buffer[2] = rBCDHOUR;    
        data_buffer[3] = rBCDDATE;    
        data_buffer[4] = rBCDDAY;    
        data_buffer[5] = rBCDMON;                
        data_buffer[6] = rBCDYEAR;    
        rRTCCON &= 0xfe;    
    }    
}    
    
          
void Paint_text(U32 x, U32 y, U32 color, unsigned char ch[]){           
    int i, j, test,t = 0;           
    for(i = 0; i < 16; i++){           
        test = 0x80;           
        for(j = 0; j < 16; j++){           
            if(j == 8){           
                test = 0x80;           
                t++;           
            }           
            if(ch[t] & test)           
                LCD_BUFFER[x+i][y+j] = color;           
            test >>= 1;              
        }           
        t++;           
    }           
}     
    
void Paint_Ascii(U32 x, U32 y, U32 color, unsigned char ch[]){        
    int i, j, test;        
    for(i = 0; i < 16; i++){        
        test = 0x80;        
        for(j = 0; j < 8; j++){        
            if(test & ch[ i])        
                LCD_BUFFER[x+i][y+j] = color;        
            test >>= 1;        
        }        
    }        
}          
//2010年12月26日星期日19:17:51    
void ShowTime(){    
    U32 qh, wh;    
    unsigned char s0,s1;    
    int i, t, k;    
    char h, l;     
    GetTime();    
    //当前时间为    
    for(i = 0,t = 0, k = 0; i < 5; i++){    
        s0 = str0[t];    
        s1 = str0[t+1];    
        qh = s0-0xa0;    
        wh = s1-0xa0;    
        temp = & __HZK[((qh-1)*94+wh-1)*32];    
        Paint_text(100,k,0x0,temp);    
        t = t + 2;    
        k += 16;    
    }    
    //:    
    temp = &__ASCII[':'*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //20    
    temp = &__ASCII['2'*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    temp = &__ASCII['0'*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //10    
    h = (data_buffer[6]>>4)+48;    
    temp = &__ASCII[h*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    l = (data_buffer[6]&0x0f)+48;    
    temp = &__ASCII[l*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //年    
    qh = str1[0]-0xa0;    
    wh = str1[1]-0xa0;    
    temp = & __HZK[((qh-1)*94+wh-1)*32];    
    Paint_text(100,k,0x0,temp);    
    k+=16;    
    //12    
    h = (data_buffer[5]>>4)+48;    
    temp = &__ASCII[h*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    l = (data_buffer[5]&0xf)+48;    
    temp = &__ASCII[l*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //月    
    qh = str2[0]-0xa0;    
    wh = str2[1]-0xa0;    
    temp = & __HZK[((qh-1)*94+wh-1)*32];    
    Paint_text(100,k,0x0,temp);    
    k+=16;    
    //26    
    h = (data_buffer[3]>>4)+48;    
    temp = &__ASCII[h*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    l = (data_buffer[3]&0xf)+48;    
    temp = &__ASCII[l*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //日    
    qh = str3[0]-0xa0;    
    wh = str3[1]-0xa0;    
    temp = & __HZK[((qh-1)*94+wh-1)*32];    
    Paint_text(100,k,0x0,temp);    
    k+=16;    
    //星期日       
    for(i = 0,t = 0; i < 3; i++){    
        s0 = str[0][t];    
        s1 = str[0][t+1];    
        qh = s0-0xa0;    
        wh = s1-0xa0;    
        temp = & __HZK[((qh-1)*94+wh-1)*32];    
        Paint_text(100,k,0x0,temp);    
        t = t + 2;    
        k += 16;    
    }     
    //19:17:51    
    //19    
    h = (data_buffer[2]>>4)+48;    
    temp = &__ASCII[h*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    l = (data_buffer[2]&0xf)+48;    
    temp = &__ASCII[l*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //:    
    temp = &__ASCII[':'*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //17    
    h = (data_buffer[1]>>4)+48;    
    temp = &__ASCII[h*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    l = (data_buffer[1]&0xf)+48;    
    temp = &__ASCII[l*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //:    
    temp = &__ASCII[':'*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    //51  
    h = (data_buffer[0]>>4)+48;    
    temp = &__ASCII[h*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;    
    l = (data_buffer[0]&0xf)+48;    
    temp = &__ASCII[l*16];    
    Paint_Ascii(100,k,0x0,temp);    
    k+=8;       
}     
[page]
void __irq Key_ISR(void){    
    rSRCPND |= 1;                 //SRCPND 通过写入数据清零,如果不清零,会反复进行请求      
    rINTPND |= 1;                 //INDPND 通过置1清零      
    flag = 1;    
}    
        
int Main(){         
    flag = 0;    
    rGPFCON &= 0xfffc;    //0      
    rGPFCON |= 1<<1;       
    rGPFUP = 0xfe;      
    rSRCPND |= 1<<0;       
    rINTPND |= 1<<0;      
    rINTMSK &= "(0x1<<0);     //开中断      
    pISR_EINT0 = (U32)Key_ISR;      
    Init_LCD();    
    Paint_background(0xffffff,0,0,320,240);    
    SetTime();    
    ShowTime();    
    while(1){    
        if(flag){    
            Paint_background(0xffffff,0,0,320,240);    
            ShowTime();    
            flag = 0;    
        }    
    }    
}
关键字:S3C2440  RTC  实时时钟 引用地址:S3C2440-RTC

上一篇:S3C2440-LCD图片显示
下一篇:S3C2440-RTC中断

推荐阅读最新更新时间:2024-03-16 13:57

Uboot在S3C2440上的移植详解(二)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 4)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nor Flash的支持)。 通常,在嵌入式bootloader中,有两种方式来引导启动内核:从Nor Flash启动和从Nand Flash启动。u-boot中默认是从Nor Flash启动,再从上一节这个运行结果图中看,还发现几个问题:第一,我开发板的Nor Flash
[单片机]
Uboot在<font color='red'>S3C2440</font>上的移植详解(二)
s3c2440触摸屏测试
* 文件名:main.c * 功能:测试TFT屏的驱动函数 * 作者:jianqi * 版本:v1.0 #include 2440addr.h //包含2440相关寄存器的设置 #include TFT.h #include Touch.h #include MMU.h #include UART.h volatile int A,B,C,D,E,F,K; //校正参数 int flagTS=0; //触摸屏转换标志 int xdata,ydata; //触摸屏A/D转换数据 * 名称:Touch_Int * 功能:触摸屏中断程序,读取A/D转换的值 * 入口参数:无 * 出口参数:无 void __irq
[单片机]
mini2440裸机试炼之—RTC闹钟中断,节拍中断
环境搭建 硬件环境:J-link v8、mini2440、J-link转接板、串口转USB线 软件环境:windows7(32位)、开发板uboot(NandFlash)、J-link驱动(J-Link ARM V4.10i)、SecureCRT、ADS1.2 其中ADS里的AXD设置:加载JlinkRDI.dll+Options- Configure Interface...,在Session File一页中选择“Run Configuration Script”,将该name.txt文本文件作为一个脚本加进来,确定。 name.txt内容 Setmem 0x53000000 0x00000000 3
[单片机]
mini2440裸机试炼之—<font color='red'>RTC</font>闹钟中断,节拍中断
十二、S3C2440 裸机 — SDRAM
12.1 SDRAM 介绍 12.1.1 SDRAM 定义 SDRAM(Synchronous Dynamic Random Access Memory):同步动态随机存储器-内存条 同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准; 动态是指存储阵列需要不断的刷新来保证数据不丢失; 对比:SRAM(静态的-触发器) 随机是指数据不是线性依次存储,而是自由指定地址进行数据读写 对比:Flash(块) DDR:DDR就是DDR SDRAM,是SDRAM的升级版。(DDR:double data rate,双倍速度的SDRAM) SDRAM经历了几代:SDR DDR1 DDR2 DDR3 DDR
[单片机]
十二、<font color='red'>S3C2440</font> 裸机 — SDRAM
STM32 RTC(实时时钟) 32.768kHz晶振起振指南
STM32的RTC晶振经常出现不起振的问题,这已经是 业界共识 了。。。很多人在各种电子论坛上求助类似于 求高手指点!RTC晶振不起振怎么办 的问题,而其答案基本可以概括为 这次高手帮不了你了 更有阴谋论者提出让人啼笑皆非的解释 STM32的RTC晶振不起振是ST与晶振厂商串通后故意搞出来的,目的是提高某晶振厂商高端晶振的销量。。。 最近做的几块板子也用到了STM32的RTC,前后两版一共做了大概6片,幸运的是并未遇到晶振不起振的现象。而我采用的是3毛钱一个的普通晶振,并未选用传说中低负载高精度晶振。。。后来在另外一片实验性质的板子上首次遇到了晶振不起振的问题,而且做了2片都不起振,这才让我意识到这个问题的严重性。 从上述现
[单片机]
s3c2440 内存管理单元MMU学习笔记
学习了S3C2440内存管理单元MMU,主要参考了《嵌入式Linux应用开发完全手册》 (下载见 http://www.linuxidc.com/Linux/2011-01/31114.htm )。有两篇文章也说得很详细,分别是 http://www.linuxidc.com/Linux/2011-09/43526.htm 与 http://www.linuxidc.com/Linux/2011-09/43525.htm 感兴趣的可以参考一下,我就不重复内容了。但是它们在MMU地址变换过程这一块说得不太好理解。在此,我就按照我的理解将《嵌入式Linux应用开发完全手册》的相关内容解释一下,图片加点注释。如有错误,请大家不吝赐教,我
[单片机]
<font color='red'>s3c2440</font> 内存管理单元MMU学习笔记
s3c2440看门狗定时器的应用
看门狗定时器的主要作用是在程序因为干扰而跑飞后,能够使系统复位,不至于使系统永远的死下去。 它的原理与一般的定时器没有多大区别,就是先要设置好一段时间,当超过这段时间后,就从当前运行的程序中跳出进入中断处理程序中。但两者的主要差别是,一般的定时器中断是我们希望它发生的,因此我们不会在定时器中断发生前的那个时间段内干预它;而看门狗定时器中断是我们不希望它发生的,因此我们要想方设法地避免其发生。主要的方法就是在中断发生前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始计时。这种方法俗称喂狗,形象地比喻就是一条看门狗每隔一段时间(比如说一个小时)就会饿,所以就要叫唤,唯一使它不叫的方法就是给它喂食,那么下次叫唤的时间就是从当
[单片机]
s3c2440 三个时钟
s3c2410 有三个时钟FLCK 、HCLK 和PCLK (这3个时针都是核心时针) s3c2410 芯片有这么一段话: FCLK is used by ARM920T ,内核时钟,主频。 HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD controller, the DMA and USB host block. 也就是为AHB总线上的外设提供时钟信号,包括USB时钟。 AHB总线用于连接高速外设。 PCLK is used for APB bus,
[单片机]
<font color='red'>s3c2440</font> 三个时钟
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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