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

如何实现STM32F4 RTC日历和Count转换

[复制链接]
攻城狮Melo 发布时间:2023-3-14 14:15
虽然F4硬件自带了日历功能,可以直接读年月日,但有些场合使用计数值存储还是更方便。

这里根据正点原子F1中RTC例程的年月日转换,写了适用于F4的RTC日历转计数值。

两个函数的声明:
  1. uint32_t RTC_DataToCnt(RTC_TimeTypeDef RTC_TimeStruct,RTC_DateTypeDef RTC_DateStruct);
  2. void RTC_CntToData(uint32_t RTC_Count,RTC_TimeTypeDef* RTC_TimeStruct,RTC_DateTypeDef* RTC_DateStruct);
复制代码

函数实现内容:
  1. const u8 mon_table[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
  2. //判断是否是闰年函数
  3. //月份   1  2  3  4  5  6  7  8  9  10 11 12
  4. //闰年   31 29 31 30 31 30 31 31 30 31 30 31
  5. //非闰年 31 28 31 30 31 30 31 31 30 31 30 31
  6. //输入:年份
  7. //输出:该年份是不是闰年.1,是.0,不是
  8. u8 Is_Leap_Year(u16 year)
  9. {
  10.     if(year%4==0) //必须能被4整除
  11.     {
  12.         if(year%100==0)
  13.         {
  14.             if(year%400==0)return 1;//如果以00结尾,还要能被400整除
  15.             else return 0;
  16.         } else return 1;
  17.     } else return 0;
  18. }

  19. //
  20. uint32_t RTC_DataToCnt(RTC_TimeTypeDef RTC_TimeStruct,RTC_DateTypeDef RTC_DateStruct)
  21. {
  22.     u16 t;
  23.     u32 seccount=0;
  24.     for(t=0; t<RTC_DateStruct.RTC_Year; t++)        //把所有年份的秒钟相加
  25.     {
  26.         if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数
  27.         else seccount+=31536000;                          //平年的秒钟数
  28.     }
  29.     RTC_DateStruct.RTC_Month-=1;
  30.     for(t=0; t<RTC_DateStruct.RTC_Month; t++)         //把前面月份的秒钟数相加
  31.     {
  32.         seccount+=(u32)mon_table[t]*86400;//月份秒钟数相加
  33.         if(Is_Leap_Year(RTC_DateStruct.RTC_Year)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数
  34.     }
  35.     seccount+=(u32)(RTC_DateStruct.RTC_Date-1)*86400;//把前面日期的秒钟数相加
  36.     seccount+=(u32)RTC_TimeStruct.RTC_Hours*3600;//小时秒钟数
  37.     seccount+=(u32)RTC_TimeStruct.RTC_Minutes*60;         //分钟秒钟数
  38.     seccount+=RTC_TimeStruct.RTC_Seconds;//最后的秒钟加上去

  39.     return seccount;
  40. }



  41. //
  42. void RTC_CntToData(uint32_t RTC_Count,RTC_TimeTypeDef* RTC_TimeStruct,RTC_DateTypeDef* RTC_DateStruct)
  43. {
  44.     static u16 daycnt=0;
  45.     u32 timecount=0;
  46.     u32 temp=0;
  47.     u16 temp1=0;
  48.     timecount=RTC_Count;
  49.     temp=timecount/86400;   //得到天数(秒钟数对应的)
  50.     if(daycnt!=temp)//超过一天了
  51.     {
  52.         daycnt=temp;
  53.         temp1=0;        //从1970年开始        //从0年开始
  54.         while(temp>=365)
  55.         {
  56.             if(Is_Leap_Year(temp1))//是闰年
  57.             {
  58.                 if(temp>=366)temp-=366;//闰年的秒钟数
  59.                 else {
  60.                     temp1++;
  61.                     break;
  62.                 }
  63.             }
  64.             else temp-=365;          //平年
  65.             temp1++;
  66.         }
  67.         RTC_DateStruct->RTC_Year=temp1;//得到年份
  68.         temp1=0;
  69.         while(temp>=28)//超过了一个月
  70.         {
  71.             if(Is_Leap_Year(RTC_DateStruct->RTC_Year)&&temp1==1)//当年是不是闰年/2月份
  72.             {
  73.                 if(temp>=29)temp-=29;//闰年的秒钟数
  74.                 else break;
  75.             }
  76.             else
  77.             {
  78.                 if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
  79.                 else break;
  80.             }
  81.             temp1++;
  82.         }
  83.         RTC_DateStruct->RTC_Month=temp1+1;        //得到月份
  84.         RTC_DateStruct->RTC_Date=temp+1;          //得到日期
  85.     }
  86.     temp=timecount%86400;                     //得到秒钟数
  87.     RTC_TimeStruct->RTC_Hours=temp/3600;             //小时
  88.     RTC_TimeStruct->RTC_Minutes=(temp%3600)/60;         //分钟
  89.     RTC_TimeStruct->RTC_Seconds=(temp%3600)%60;         //秒钟
  90.     return ;
  91. }

复制代码

简单的测试程序,其中rtc_update_flag在RTC中断中赋值的,用于更新后打印。
  1. while(1)
  2.     {
  3.         if(rtc_update_flag==1)
  4.         {
  5.             rtc_update_flag=0;
  6.             RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
  7.             RTC_GetDate(RTC_Format_BIN,&RTC_DateStruct);

  8.             sprintf((char*)tbuf,"read  :%02d:%02d:%02d-%02d:%02d:%02d\r\n",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date,
  9.                     RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);
  10.             printf("%s",tbuf);
  11.             rtc_cnt=RTC_DataToCnt(RTC_TimeStruct,RTC_DateStruct);
  12.             RTC_CntToData(rtc_cnt,&RTC_TimeStruct1,&RTC_DateStruct1);

  13.             sprintf((char*)tbuf,"update:%02d:%02d:%02d-%02d:%02d:%02d\r\n",RTC_DateStruct1.RTC_Year,RTC_DateStruct1.RTC_Month,RTC_DateStruct1.RTC_Date,
  14.                     RTC_TimeStruct1.RTC_Hours,RTC_TimeStruct1.RTC_Minutes,RTC_TimeStruct1.RTC_Seconds);
  15.             printf("%s",tbuf);

  16.         }
  17.     }
复制代码

打印结果如下:

20190703184506903.png

————————————————
版权声明:小盼你最萌哒
如有侵权请联系删除


收藏 评论0 发布时间:2023-3-14 14:15

举报

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