OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2438|回复: 3

这个RTC设置函数有没有问题?

[复制链接]

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-2-12 16:56:39 | 显示全部楼层 |阅读模式
1金钱
  1. u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
  2. {
  3.         u16 t;
  4.         u32 seccount=0;
  5.         if(syear<1970||syear>2099)return 1;          
  6.         for(t=1970;t<syear;t++)        //°&Ntilde;&Euml;ù&Oacute;&ETH;&Auml;ê·&Yacute;&micro;&Auml;&Atilde;&euml;&Ouml;&Oacute;&Iuml;à&frac14;&Oacute;
  7.         {
  8.                 if(Is_Leap_Year(t))seccount+=31622400;//&Egrave;ò&Auml;ê&micro;&Auml;&Atilde;&euml;&Ouml;&Oacute;&Ecirc;&yacute;
  9.                 else seccount+=31536000;                          //&AElig;&frac12;&Auml;ê&micro;&Auml;&Atilde;&euml;&Ouml;&Oacute;&Ecirc;&yacute;
  10.         }
  11.         smon-=1;
  12.         for(t=0;t<smon;t++)           //°&Ntilde;&Ccedil;°&Atilde;&aelig;&Ocirc;&Acirc;·&Yacute;&micro;&Auml;&Atilde;&euml;&Ouml;&Oacute;&Ecirc;&yacute;&Iuml;à&frac14;&Oacute;
  13.         {
  14.                 seccount+=(u32)mon_table[t]*86400;//&Ocirc;&Acirc;·&Yacute;&Atilde;&euml;&Ouml;&Oacute;&Ecirc;&yacute;&Iuml;à&frac14;&Oacute;
  15.                 if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//&Egrave;ò&Auml;ê2&Ocirc;&Acirc;·&Yacute;&Ocirc;&ouml;&frac14;&Oacute;&Ograve;&raquo;&Igrave;ì&micro;&Auml;&Atilde;&euml;&Ouml;&Oacute;&Ecirc;&yacute;          
  16.         }
  17.         seccount+=(u32)(sday-1)*86400;//°&Ntilde;&Ccedil;°&Atilde;&aelig;&Egrave;&Otilde;&AElig;&Uacute;&micro;&Auml;&Atilde;&euml;&Ouml;&Oacute;&Ecirc;&yacute;&Iuml;à&frac14;&Oacute;
  18.         seccount+=(u32)hour*3600;//&ETH;&iexcl;&Ecirc;±&Atilde;&euml;&Ouml;&Oacute;&Ecirc;&yacute;
  19.     seccount+=(u32)min*60;         //·&Ouml;&Ouml;&Oacute;&Atilde;&euml;&Ouml;&Oacute;&Ecirc;&yacute;
  20.         seccount+=sec;//×&icirc;&ordm;ó&micro;&Auml;&Atilde;&euml;&Ouml;&Oacute;&frac14;&Oacute;&Eacute;&Iuml;&Egrave;&yen;
  21.                                                                                                             
  22.         //&Eacute;è&Ouml;&Atilde;&Ecirc;±&Ouml;&Oacute;
  23.     RCC->APB1ENR|=1<<28;//&Ecirc;&sup1;&Auml;&Uuml;&micro;&ccedil;&Ocirc;&acute;&Ecirc;±&Ouml;&Oacute;
  24.     RCC->APB1ENR|=1<<27;//&Ecirc;&sup1;&Auml;&Uuml;±&cedil;·&Yacute;&Ecirc;±&Ouml;&Oacute;
  25.         PWR->CR|=1<<8;    //&Egrave;&iexcl;&Iuml;&ucirc;±&cedil;·&Yacute;&Ccedil;&oslash;&ETH;&acute;±&pound;&raquo;¤
  26.         //&Eacute;&Iuml;&Atilde;&aelig;&Egrave;&yacute;&sup2;&frac12;&Ecirc;&Ccedil;±&Oslash;&ETH;&euml;&micro;&Auml;!
  27.         RTC->CRL|=1<<4;   //&Ocirc;&Ecirc;&ETH;í&Aring;&auml;&Ouml;&Atilde;
  28.         RTC->CNTL=seccount&0xffff;
  29.         RTC->CNTH=seccount>>16;
  30.         RTC->CRL&=~(1<<4);//&Aring;&auml;&Ouml;&Atilde;&cedil;ü&ETH;&Acirc;
  31.         while(!(RTC->CRL&(1<<5)));//&micro;&Egrave;&acute;&yacute;RTC&frac14;&Auml;&acute;&aelig;&AElig;÷&sup2;&Ugrave;×÷&Iacute;ê&sup3;&Eacute;
  32.         RTC_Get();//&Eacute;è&Ouml;&Atilde;&Iacute;ê&Ouml;&reg;&ordm;ó&cedil;ü&ETH;&Acirc;&Ograve;&raquo;&Iuml;&Acirc;&Ecirc;&yacute;&frac34;&Yacute;        
  33.         return 0;            
  34. }
复制代码

这个函数中,有一段:for(t=1970;t<syear;t++) 这个循环感觉有问题,前面设置syear不得小于1970,也就是说如果syear=1970的话,按照for的行为先设置t=1970然后进入循环加上一年的秒数,随后t++变为t=1971不满足t<syear退出。
如果syear=1971的话,还是循环一次,然后t=1971不满足t<syear退出。
所以1970和1971不都一样了吗?都加了一年秒数,这是Bug吧?
该函数摘录于正点原子示例代码:修改日期:2014/3/8;版本V1.0。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-2-12 22:09:40 | 显示全部楼层
1970都没进入for循坏啊。。。
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
 楼主| 发表于 2020-2-12 22:35:43 | 显示全部楼层
正点原子 发表于 2020-2-12 22:09
1970都没进入for循坏啊。。。

窗口比较语句是:if(syear<1970||syear>2099)
syear小于1970或者大于2099才异常返回,但是1970本身不会返回异常,又不是小于等于。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-2-14 22:47:33 | 显示全部楼层
0x00000000 发表于 2020-2-12 22:35
窗口比较语句是:if(syear2099)
syear小于1970或者大于2099才异常返回,但是1970本身不会返回异常,又不 ...

你仿真看下
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 19:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表