博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MSP430单片机之RTC-实时时钟
阅读量:6493 次
发布时间:2019-06-24

本文共 2554 字,大约阅读时间需要 8 分钟。

  RTC-Real Time Clock是430单片机的实时时钟模块,可以配置成实时时钟模式(万年历)或者一般目的的32位计数器模式,其中实时时钟模式提供了年月日、时分秒,可以选择BCD码或者二进制格式,并且具有可编程的闹钟。RTC模块支持中断。相关寄存器请参阅430系列单片机user's guide(我用的是5438A)。

  1.计数器模式

  实时时钟控制器寄存器1 RTCMODE位被重置时,计数器模式被选择,通过软件设置可以得到一个32位的计数器。从时钟模式切换到计数器模式是通过重置计数值:RTCNT1、RTCNT2、RTCNT3、RTCNT4 和 预换算计数器:RT0PS、RT1PS。

  计数器的增量计数器来自ACLK、SMCLK或者分频之后的ACLK、SMCLK。分频系数来自分频除法器RT0PS、RT1PS。RT0PS的输出可以和RT1PS的输出级联构成32位计数器的时钟源。4个独立的8位计数器级联成为32位的计数器。这能提供计数时钟的8位、16位、24位、32位溢出中断。RTCTEV位选择各自的触发,通过设置RTCTEVIE位,一个RTCTEV能够触发一个中断。计数器RTCNT1到RTCNT4都可以单独访问,并可能被写入数值。

  2.日历模式

  当RTCMODE被置位时,万年历模式被选中。值得一提的是,万年历模式有能够计算能否被4整除的闰年算法,这个算法范围是1901年到2099年。

  2.1预分频

  分频器自动将RT0PS和RT1PS配置成为实时时钟提供一秒间隔的时钟,RT0PS源于ACLK,一般来说ACLK为32768Hz,是为了实时时钟的运行。从日历模式切换到计数器模式时,会将年月日、时分秒全部被置位1,RT0PS和RT1PS也会被置位。当RTCBCD=1时,日历寄存器会被选为BCD码,必须在时间设置之前选择好格式,改变RTCBCD的状态和切换到计数器模式影响一样。

  2.2闹钟功能

  用户可编程闹钟只有在日历模式下有效。每一个闹钟寄存器都包括都包括一个闹钟使能位,AE用来修改每一个闹钟寄存器,通过设置闹钟寄存器的AE位,可以产生多种闹钟。无效的闹钟不会通过硬件的检测,所以用户有必要检查所设闹钟是否正确。

  2.3读写实时时钟寄存器

  系统时钟和实时时钟的时钟源异步,因而读写实时时钟寄存器的时候要注意。此时实时时钟寄存器每秒钟更新一次,为了防止在更新的时候读取实时时钟数据而造成错误数据的读取,应该设置一个禁止进入的窗口,在禁止进入窗口和窗口外期间,只有RTCRDY复位有效才可以读取。在RTCRDY复位的时候,读取操作是错误的并且读取的时间数据也无效被忽略。

  2.4时钟中断

  由于我做的部分只涉及实时时钟显示,中断部分没有过多涉及,就不在讨论了。

RTC实时时钟显示部分程序结构如下:

View Code
1 //只是部分代码,远未完整,只是说明一下框架 2 void Init_RTC(void)//初始化RTC 3 { 4   RTCCTL01 = RTCSSEL_0 + RTCMODE;          // 时钟模式,每分钟中断, BCD格式 5   unsigned int hour,min,sec; 6    7   hour=key[0]*10+key[1]; 8   min =key[2]*10+key[3]; 9   sec =key[4]*10+key[5];10   11   SetRTCYEAR(2012); 12   SetRTCMON(6);13   SetRTCDAY(1);14   SetRTCHOUR(hour);  //按键设定时间15   SetRTCMIN(min);16   SetRTCSEC(sec);17 }18 19   while(key_C)   //扫描按键20   {21     22     if(key_stime_ok)23     {24       char str[4];25       key_stime_ok=0;26       key_temp=Read_Key();//读取按键数值27       if(key_temp != No_key)28       {29         key[key_C-1]=key_temp;30         sprintf(str,"%d",key_temp);31         PutStringEN24(60,k,str);32         k-=16;33         key_C--;34       }35     }36   }37 38 void Show_Clock(void)39 {40   unsigned int Hour ,Minute,Second;41   char p1[10],p2[10],p3[10];42   for(;RTCCTL01&RTCRDY;)        _NOP(); // 等待RTC有效43   for(;RTCCTL01&RTCRDY;)        _NOP(); 44 45    Hour = GetRTCHOUR();46    Minute = GetRTCMIN();47    Second = GetRTCSEC();48    49    sprintf(p1,"%02d",Hour);50    sprintf(p2,"%02d",Minute);51    sprintf(p3,"%02d",Second);52    53    PutStringEN24(1,2,p1); //用的TFT屏显示时钟54    PutStringEN24(1,34,":");55    PutStringEN24(1,50,p2);56    PutStringEN24(1,82,":");57    PutStringEN24(1,98,p3);58 }

转载于:https://www.cnblogs.com/fanyabo/archive/2012/06/17/2552989.html

你可能感兴趣的文章
搭建SSH+proxool连接池开发环境
查看>>
【C/C++和指针】printf 的那些事
查看>>
VMware(Plus 1)
查看>>
DOS和DDOS你知道多少?
查看>>
2013计算机视觉代码合集
查看>>
在vue中如何实现购物车checkbox的三级联动
查看>>
数据库常用语句
查看>>
Python_爬虫1
查看>>
智能指针
查看>>
hibernate 检索策略
查看>>
shell小脚本--从laod博客更新hosts文件
查看>>
winform登录窗体加载等待图片
查看>>
eclipse配置
查看>>
转:Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
查看>>
NSArray block用法
查看>>
ios input框无法输入问题
查看>>
Owncloud-X安装配置
查看>>
OCA读书笔记(16) - 执行数据库恢复
查看>>
jmeter测试TCP服务器/模拟发送TCP请求 设置16进制发送(转)
查看>>
时代亿信 安全保密邮件产品
查看>>