打印

怎么会是**肋?没有年月日的功能不是问题,可以方便地用

[复制链接]
21771|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a_bb|  楼主 | 2007-12-14 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本以为可以省去1片外置RTC芯片,但发现STM32内置RTC只能计时,却没有年月日的功能。
用户一直开机上电还可以用程序维护,但如果断电24小时以上,就无法确定现在的日期了。
建议ST公司在RTC中增加日期功能,至少能计日。
来自 2楼
leebai_001| | 2007-12-17 09:12 | 只看该作者

STM32年月日计算程序

如果将RTC计数器设置成1秒进位1次,RTC计数器溢出时间大概有136年,所以不必考虑时间会溢出的问题。

先设置好记时起点的年月日时分秒。
然后调用下面的计算程序即可。
我只是简单测试了一下该实时时钟,外接了一个32.768K的晶振。
但我感觉该实时时钟的时间精度不太高,如果要精确的话,恐怕不太适用。
这只是我的测试结论,不一定准确,大家可实验一下。
下面的源程序经过测试了,可参考一下。
/*源程序*/
const uchar MaxDayArray[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //
uchar IRTYear,IRTMonth,IRTDay,IRTHour,IRTMinute,IRTSecond;

计算时分秒:
void Time_GetValue(u32 TimeVar) 
{
  u32 THH = 0, TMM = 0, TSS = 0;
  /* Compute  hours */
  THH = TimeVar/3600;
  /* Compute minutes */
  TMM = (TimeVar % 3600)/60;
  /* Compute seconds */
  TSS = (TimeVar % 3600)% 60;
  RTHour=(uchar)THH;
  RTMinute=(uchar)TMM;
  RTSecond=(uchar)TSS;
}
调用方式:Time_GetValue(RTC_GetCounter());

计算年月日:
/*CaculateTime :Caculate new Time*/
void CaculateTime(void)
{
    uint IYear;
    IYear=2000+IRTYear;
    if(2==IRTMonth) { //
        IRTDay++;
        if((IYear%4==0&&IYear%100!=0)||(IYear%400==0)) { //leap year
            if ((IRTDay>MaxDayArray[IRTMonth-1]+1)) {
                //Day overflow
                IRTDay=1;
                IRTMonth++;
                if(IRTMonth>12) {
                    //Month overflow
                    IRTMonth=1;
                    IRTYear++;
                    if (IRTYear>99) {
                        //Year overflow
                        IRTYear=0;
                    }
                }
            }
        } else { //no leap year
            if ((IRTDay>MaxDayArray[IRTMonth-1])) {
                IRTDay=1;
                IRTMonth++;
                if(IRTMonth>12) {
                    //Month overflow
                    IRTMonth=1;
                    IRTYear++;
                    if (IRTYear>99) {
                        //Year overflow
                        IRTYear=0;
                    }
                }
            }
        }
    } else { //
        IRTDay++;
        if ((IRTDay>MaxDayArray[IRTMonth-1])) {
            IRTDay=1;
            IRTMonth++;
            if(IRTMonth>12) {
                //Month overflow
                IRTMonth=1;
                IRTYear++;
                if (IRTYear>99) {
                    //Year overflow
                    IRTYear=0;
                }
            }        
        }
    }
}
调用方式:
            TempValue=RTC_GetCounter();
            do while(TempValue > 0x00015180);
            {
                 //
                 CaculateTime();
                 TempValue -=0x00015180;
            } 新生成的年月日时分秒就是当前的年月日。

使用特权

评论回复
板凳
rogetxu| | 2007-12-14 09:53 | 只看该作者

备用

你可以预定0x0000是dd-mm-yy. 然后根据RTC换算出具体的时间日期。

使用特权

评论回复
地板
浪淘沙| | 2007-12-14 09:59 | 只看该作者

怎么会是**肋?没有年月日的功能不是问题,可以方便地用

不明白为什么断电24小时以上,就无法确定现在的日期了?

回忆一下在UNIX的世界,所有的时间都是以1970年1月1日0时0分0秒为基准,基于这个原理,你只要在第一次校准RTC时设置一个基准时间,以后每次开机根据这个基准时间就可以很方便地算出当前时间。比如将把基准时间设为2008年1月1日0时0分0秒。

这样不管CPU掉电多长时间,只要维持RTC的电池有电,时间就不会丢失。

使用特权

评论回复
5
浪淘沙| | 2007-12-14 11:37 | 只看该作者

根据2楼的提示,可以把0x00000000定义为2008年1月1日0时0分0秒

之后照此换算即可。。。。。

使用特权

评论回复
6
greatbin| | 2007-12-14 13:37 | 只看该作者

只要功耗做的好,用这种RTC还是很有用

用mktime()转换即可,标准C函数

使用特权

评论回复
7
浪淘沙| | 2007-12-14 13:40 | 只看该作者

1.4uA的功耗是否满足要求?

STM32在只维持RTC运行时的典型功耗为1.4uA。

使用特权

评论回复
8
gmetbj| | 2007-12-14 14:21 | 只看该作者

真的是1.4uA吗?

不止1.4uA吧,感觉比RTC芯片耗电多了。在板上挂一块CR2032的电池,一天降了0.015伏,照这样下去,电池不知道能用多久

使用特权

评论回复
9
浪淘沙| | 2007-12-14 14:40 | 只看该作者

你必须把除了RTC之外的所有电路关闭,1.4uA只是维持RTC运行

请参考STM32的数据手册,表14。

使用特权

评论回复
10
jessemok| | 2007-12-14 15:48 | 只看该作者

agree

同意楼上

使用特权

评论回复
11
jessemok| | 2007-12-14 15:49 | 只看该作者

签名

我的签名怎么不出来?

使用特权

评论回复
12
greatbin| | 2007-12-14 15:53 | 只看该作者

请浪淘沙推荐一下哪块板子可以用于评估低功耗,谢谢

使用特权

评论回复
13
a_bb|  楼主 | 2007-12-14 16:34 | 只看该作者

看来需要改变思维了

首先谢谢 浪淘沙 。

以前用51搭的系统都用硬件RTC芯片,读取日期和时间消息。
从不敢用C语言中的Time函数。

现在由于资源和速度的大大提升,终于可以使用了,以提高编程效率。

我认为RTC例程不是太好,尤其是
    /* Reset RTC Counter when Time is 23:59:59 */
    if(RTC_GetCounter() == 0x00015180)
    {
      RTC_SetCounter(0x0);
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
    }
容易误导counter超不过24时。

将用新方法编程的输出效果,给大家看看

使用特权

评论回复
14
浪淘沙| | 2007-12-14 21:42 | 只看该作者

回11楼:试试EK-STM32F

看见刘工在他的帖子中(64楼)回答了你的问题:https://bbs.21ic.com/club/bbs/list.asp?Page=1&boardid=49&t=2775568

使用特权

评论回复
15
yocheng| | 2007-12-14 21:44 | 只看该作者

我在keil 设置向导中找到如下图

https://bbs.21ic.com/upfiles/img/200712/20071214214132234.jpg

keil MDK 3.15B 中的带年月日值,不知如何操作?  浪淘沙请指教下

使用特权

评论回复
16
浪淘沙| | 2007-12-14 22:00 | 只看该作者

不好意思,我是光说不练,没有具体操作过

我只负责与STM32功能性相关部分的研究,具体如何使用某个具体的开发工具的问题,要有其他人来回答了。

看看坛里有谁用过这部分?

使用特权

评论回复
17
s99060| | 2007-12-15 00:55 | 只看该作者

14楼:那应该只是设置值而已

keil可以在程序里做这样的选择菜单,方便使用,不用直接改#Define什么的,参见startup.s

使用特权

评论回复
18
qihao| | 2007-12-16 11:04 | 只看该作者

有点价值,尿一个纪念

使用特权

评论回复
19
yocheng| | 2007-12-16 11:20 | 只看该作者

楼上的四处撒尿! 呵呵

使用特权

评论回复
20
hotpower| | 2007-12-16 13:11 | 只看该作者

关注之中~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

98

帖子

0

粉丝