驱动开发-RTC时钟控制技术_第1页
驱动开发-RTC时钟控制技术_第2页
驱动开发-RTC时钟控制技术_第3页
驱动开发-RTC时钟控制技术_第4页
驱动开发-RTC时钟控制技术_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、RTC时钟控制技术一、 确定任务1、 掌握基本的字符设备的驱动程序设计。2、 掌握基本的文件操作。3、 掌握RTC的工作原理和使用方法。4、 掌握在操作系统下RTC驱动程序的原理。二、 学习内容 1、 阅读S5PV210数据手册,熟悉RTC的原理。2、 编写操作RTC的应用程序。3、 编写makefile文件。4、下载并调试操作RTC的应用程序。三、基础知识1、 硬件原理:a) 原理图:b) 系统框架图:由图可知:RTC控制器就是在外部时钟的作用下,通过将外部时钟频率分频为1HZ,送到各个秒、分、时、天、月、年计数器来计数。c) 寄存器简介RTCCON控制寄存器是一个32位低10位有效的控制寄

2、存器,其中RTCEN位控制CPU和RTC之间的交互。RTCRST用于使能时钟分频器。TICNT寄存器是时钟滴答计数器,当TICNT寄存器计数减到0时将产生一个滴答时钟中断。RTCALM寄存器主要用于控制时钟报警功能,若使能了报警功能,则到达设定时间时将产生ALARM_INT和ALARM_WK两个信号。BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDWEEK、BCDMON、BCEYEAR寄存器分别用于设置秒、分、时、日、星期、月、年的值。(注意这些寄存器是数据存储格式为BCD码)四、基本原理1、 RTC介绍:实时时钟RTC器件是一种能提供日历/时钟、数据存储等功能的集成电路,常用

3、作各种计算机系统的时钟信号源和参数设置存储电路。RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统中记录事件发生的时间和相关信息,尤其是在通信工程,电力自动化、工业控制等自动化程度较高领域的无人值守环境。RTC器件与微控制器之间的接口大都采用连线简单的串行接口,诸如I2C、SPI、MICROWIRE和CAN等串行总线接口。这些串口由23根线连接,分为同步和异步接口。S3C6410片上已经集成了RTC控制器,所以,不需要外接RTC芯片。S3C6410RTC的特点:BCD数据:秒、分、小时、星期、日期、月份和年份;闹钟(报警)功能:产生定时中断或激活系统;自动计算闰年;无2000

4、年问题;独立的电源输入。2、 驱动原理:将RTC抽象为一个字符设备,通过系统提供的标准接口,来获取或者设置RTC时间。五、代码设计 1、 驱动简析(详细代码请查看./arch/arm/mach-s5pv210/smdkc110-rtc.c):static int _devinit smdkc110_rtc_probe(struct platform_device *pdev)smdkc110_rtc_alarmno = platform_get_irq(pdev, 0); /rtc时钟定时中断res = platform_get_resource(pdev, IORESOURCE_MEM, 0

5、); /获取rtc平台资源smdkc110_rtc_base = ioremap(res-start, res-end - res-start + 1)/映射rtc寄存器地址readw(smdkc110_rtc_base + S3C2410_RTCCON); /读取RTCCONdevice_init_wakeup(&pdev-dev, 1); /使能唤醒smdkc110_rtc_gettime(&pdev-dev, &tm); /获取时间if (tm.tm_mon 12 | tm.tm_mday 31 | tm.tm_year 3840) /判断时间值是否超出范围 /* Set the def

6、ault time. 2012:1:1:12:0:0 */tm.tm_year = 112;tm.tm_mon = 0;tm.tm_mday = 1;tm.tm_hour = 12;tm.tm_min = 0;tm.tm_sec = 0;smdkc110_rtc_settime(&pdev-dev, &tm); /设置时间rtc = rtc_device_register(s3c, &pdev-dev, &smdkc110_rtcops, THIS_MODULE); /rtc设备注册platform_set_drvdata(pdev, rtc); /设置设备数据static int smdkc

7、110_rtc_settime(struct device *dev, struct rtc_time *tm)/* we get around y2k by simply not supporting it */if (year = 1000) dev_err(dev, rtc only supports 0999 yearsn);return -EINVAL;smdkc110_rtc_enable(dev, 1); /使能RTCEN位 ,改变rtc值writeb(bin2bcd(tm-tm_sec), base + S3C2410_RTCSEC); writeb(bin2bcd(tm-tm

8、_min), base + S3C2410_RTCMIN);writeb(bin2bcd(tm-tm_hour), base + S3C2410_RTCHOUR);writeb(bin2bcd(tm-tm_mday), base + S3C2410_RTCDATE);writeb(bin2bcd(tm-tm_mon + 1), base + S3C2410_RTCMON);/*获取年份0999*/year100 = year/100;year = year%100;year = bin2bcd(year) | (bin2bcd(year100) tm_sec = readb(base + S3

9、C2410_RTCSEC);rtc_tm-tm_min = readb(base + S3C2410_RTCMIN);rtc_tm-tm_hour = readb(base + S3C2410_RTCHOUR);rtc_tm-tm_mday = readb(base + S3C2410_RTCDATE);rtc_tm-tm_mon = readb(base + S3C2410_RTCMON);rtc_tm-tm_year = readl(base + S3C2410_RTCYEAR);/* the only way to work out wether the system was mid-u

10、pdate * when we read it is to check the second counter, and if it * is zero, then we re-try the entire read */if (rtc_tm-tm_sec = 0 & !have_retried) /防止千年虫问题have_retried = 1;goto retry_get_time;smdkc110_rtc_enable(dev, 0);rtc_tm-tm_sec = bcd2bin(rtc_tm-tm_sec);rtc_tm-tm_min = bcd2bin(rtc_tm-tm_min);

11、rtc_tm-tm_hour = bcd2bin(rtc_tm-tm_hour);rtc_tm-tm_mday = bcd2bin(rtc_tm-tm_mday);rtc_tm-tm_mon = bcd2bin(rtc_tm-tm_mon);rtc_tm-tm_year = bcd2bin(rtc_tm-tm_year & 0xff) + bcd2bin(rtc_tm-tm_year 8) * 100;rtc_tm-tm_mon -= 1;return 0;2、 测试代码编写(详细代码请查看附件):#include #include #include #include #include #in

12、clude #include #include #include #include struct rtc_time tm;void Usage(char *args)printf(Usage:%s n,args);return ;void help(void)printf(#n);printf(time format:n);printf( tYYYY.MM.DD-hh:mm:ssntYYYY-MM-DD hh:mm:ssn);printf(#n);return ;void str_to_time(char *time)if(time=NULL)printf(errorn);exit(EXIT_

13、FAILURE);size_t ret ;ret = strcspn(time,0123456789);sscanf(time+ret,%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d,&tm.tm_year,&tm.tm_mon,&tm.tm_mday,&tm.tm_hour,&tm.tm_min,&tm.tm_sec);tm.tm_year -=1900;tm.tm_mon -=1;int main(int argc,char *argv)if(argc !=2)Usage(argv0);exit(EXIT_FAILURE);char *t=NULL;size_t len

14、 =0;int tm_fd;int ret;tm_fd = open(/dev/rtc0,O_RDWR);if(tm_fd 0)perror(open device);exit(EXIT_FAILURE);if(!strncmp(argv1,settime,7) | !strncmp(argv1,set,3)help();getline(&t,&len,stdin);str_to_time(t);ret = ioctl(tm_fd , RTC_SET_TIME,&tm);if(ret 0)perror(set time );exit(EXIT_FAILURE);ioctl(tm_fd,RTC_

15、RD_TIME,&tm);printf(Current RTC date/time is %d-%d-%d, %02d:%02d:%02dn, tm.tm_mday, tm.tm_mon+1, tm.tm_year + 1900, tm.tm_hour, tm.tm_min, tm.tm_sec);else if(!strncmp(argv1,gettime ,7) |!strncmp(argv1,get,3)ioctl(tm_fd,RTC_RD_TIME,&tm);printf(Current RTC date/time is %d-%d-%d, %02d:%02d:%02dn, tm.tm_mday, tm.tm_mon+1, tm.tm_year + 1900, tm.tm_hour, tm.tm_min, tm.tm_sec);elseUsage(argv0);exit(EXIT_FAILURE);if(t)free(t);clos

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论