你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32内部RTC的时钟程序

[复制链接]
xiaohan-343395 发布时间:2013-9-18 13:28
在网站上找了一些软件时钟程序,在秒时与日历转换时,大多是逐年计算,计算周期会随着年份增加,而增多。于是自己写了一个简化的秒时与日历转换程序,按闰年周期进行除法运算,计算周期固定,不随秒时与基础年时间差增长而增长,效率明显提高。
程序带有闰年计算与星期计算,基础年为2001年1月1日0时0分0秒,算法可支持到3200年2月28日23时59分59秒。但由于RTC计数器是32位,所以硬件只能支持到2137年2月7日6时28分15秒,也足够使用了。
以下为程序代码:
/****************************************************************************
* 函数名: GetRTCWeek
* 功  能: 计算Week
* 输  入: 秒时
* 输  出: 无.
* 返  回: 星期
*/
//u8 GetRTCWeek(RTC_T *_tRtc)
u8 GetRTCWeek(u32 lDay)
{
 //u32 lDay;
 //lDay = GetSecondFromDateTime(_tRtc)/SECOND_OF_DAY;
 lDay /= SECOND_OF_DAY;
 lDay += RTC_BASE_WEEK;
 lDay %= 7;
 return (u8)lDay;
}
/****************************************************************************
* 函数名: GetSecondFromDateTime
* 功  能: 基于2001/1/1/00:00:00的日期计算秒时
* 输  入: RTC_T 日期时间结构体
* 输  出: 无.
* 返  回: 秒时
*/
uint32_t GetSecondFromDateTime(RTC_T *_tRtc)
{
 u32 y,sec,fy;
 const u32 *ptr;
 y = (u32)((_tRtc->year - (u16)RTC_BASE_YEAR)&0x0000FFFF);
 fy = y / 4;
 sec = fy * DAY_OF_FOURYEAR;
 if(y/100){//百年不润
      sec -= y/100;
 }
 if(y/400){//四百年再润
      sec += y/400;
 }
 y %= 4;
 sec += y * DAY_OF_YEAR;
 ptr = DayOfCurrentMonthNormal;
 if(y == 3 && _tRtc->month > 2 && IsRTCLeapYear(_tRtc->year)){//当前年为润年,并且月份已过2月,天数加1
      ptr = DayOfCurrentMonthLeap;
   }
 sec += ptr[_tRtc->month]; 
 sec += _tRtc->day - 1;
 sec *= 24;
 sec += _tRtc->hour;
 sec *= 60;
 sec += _tRtc->minute;
 sec *= 60;
 sec += _tRtc->second;
 return sec;
}
/****************************************************************************
* 函数名: GetDateTimeFromSecond
* 功  能: 由秒时计算基?001/1/1/00:00:00的日期
* 输  入: RTC_T 日期时间结构体
* 输  出: 无.
* 返  回: 无
*/
void GetDateTimeFromSecond(u32 lSec, RTC_T *_tRtc)
{
   uint16_t y,m;
   u32 lDay;
 const u32 *ptr;
   
   lDay = lSec / SECOND_OF_DAY;        /* 转为基于天的时间 */
 _tRtc->year = RTC_BASE_YEAR;//基数年份
 y = lDay / DAY_OF_FOURYEAR;
 y *= 4;
 _tRtc->year += y;
 lDay %= DAY_OF_FOURYEAR;
 if(y/100){//百年不润
  lDay += y/100;
 }
 if(y/400){//四百年再润
  lDay -= y/400;
 }
 y = lDay / DAY_OF_YEAR;
 _tRtc->year += y;  /* 得到年份 */
 lDay %= DAY_OF_YEAR;
 ptr = DayOfCurrentMonthNormal;
 if(y == 3 && IsRTCLeapYear(_tRtc->year)){//当前年为润年,并且月份已过2月,天数加1
  ptr = DayOfCurrentMonthLeap;
 }
 for(m=12;m>1;m--){    /* 查询月份 */
  if(lDay >= ptr[m]) {
   lDay -= ptr[m];
   break;
  }
 }
 _tRtc->month = m;
 _tRtc->day  = lDay+1;
 _tRtc->week = GetRTCWeek(lSec);
 
 lSec = lSec % SECOND_OF_DAY;
 _tRtc->hour = lSec / SECOND_OF_HOUR;
 lSec %= SECOND_OF_HOUR;
 _tRtc->minute  = lSec / SECOND_OF_MINUTE;
 _tRtc->second  = lSec % SECOND_OF_MINUTE; 
}
RTC.rar (3.88 KB, 下载次数: 17)
收藏 评论0 发布时间:2013-9-18 13:28

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版