[PIC®/AVR®/dsPIC®产品] 【ATSAMD51EVK测评报告】+RTC时钟测评

[复制链接]
1554|17
 楼主| stb988 发表于 2022-12-11 13:05 | 显示全部楼层 |阅读模式
搞好环境,现在就开始测试外设了,像之前一样,新建一个工程,在图形配置工具中,配置一下,真的很简单,我的配置如图,增加了一个串口配置,用于打印,



接下来就是写一下代码,这个也比较简单,主函数如下
  1. int main ( void )
  2. {
  3.     int old_second=0;
  4.     /* Initialize all modules */
  5.     SYS_Initialize ( NULL );
  6.     struct tm sys_time;



  7.     //15-01-2018 12:00:00 Monday
  8.     sys_time.tm_hour = 23;      /* hour [0,23] */
  9.     sys_time.tm_sec = 00;       /* seconds [0,61] */
  10.     sys_time.tm_min = 26;       /* minutes [0,59] */
  11.     sys_time.tm_mon = 11;        /* month of year [0,11] */
  12.     sys_time.tm_year = 2022;     /* years since 1900 */
  13.     sys_time.tm_mday = 10;      /* day of month [1,31] */
  14.     sys_time.tm_wday = 6;       /* day of week [0,6] (Sunday = 0) */
  15.                                 /* tm_yday - day of year [0,365] */
  16.                                 /* tm_isdst - daylight savings flag */


  17.     printf("\n\r---------------------------------------------------------");
  18.     printf("\n\r                    RTC Demo                 ");
  19.     printf("\n\r---------------------------------------------------------\n\r");



  20.     RTC_RTCCTimeSet(&sys_time);

  21.     while ( true )
  22.     {
  23.         RTC_RTCCTimeGet(&sys_time);
  24.         if(old_second!=sys_time.tm_sec)
  25.         {
  26.             printf("System time is:   %02d:%02d:%02d\r\n",sys_time.tm_hour, sys_time.tm_min, sys_time.tm_sec);
  27.             old_second=sys_time.tm_sec;
  28.         }
  29.         /* Maintain state machines of all polled MPLAB Harmony modules. */
  30.         SYS_Tasks ( );
  31.     }

  32.     /* Execution should not come here during normal operation */

  33.     return ( EXIT_FAILURE );
  34. }
值得注意的是我并没有用他自带的函数,RTC_RTCCTimeSet(&sys_time); RTC_RTCCTimeGet(&sys_time);,这两个都是我自已加的,在例程中可以找到
  1. bool RTC_RTCCTimeSet (struct tm * initialTime )
  2. {
  3.     /*
  4.      * Add 1900 to the tm_year member and the adjust for the RTC reference year
  5.      * Set YEAR(according to Reference Year), MONTH and DAY
  6.      *set Hour Minute and Second
  7.      */
  8.     RTC_REGS->MODE2.RTC_CLOCK = (uint32_t)(((TM_STRUCT_REFERENCE_YEAR + (uint32_t)initialTime->tm_year) - REFERENCE_YEAR) << RTC_MODE2_CLOCK_YEAR_Pos |
  9.                     ((ADJUST_MONTH((uint32_t)initialTime->tm_mon)) << RTC_MODE2_CLOCK_MONTH_Pos) |
  10.                     ((uint32_t)initialTime->tm_mday << RTC_MODE2_CLOCK_DAY_Pos) |
  11.                     ((uint32_t)initialTime->tm_hour << RTC_MODE2_CLOCK_HOUR_Pos) |
  12.                     ((uint32_t)initialTime->tm_min << RTC_MODE2_CLOCK_MINUTE_Pos) |
  13.                     ((uint32_t)initialTime->tm_sec << RTC_MODE2_CLOCK_SECOND_Pos));

  14.     while((RTC_REGS->MODE2.RTC_SYNCBUSY & RTC_MODE2_SYNCBUSY_CLOCK_Msk) == RTC_MODE2_SYNCBUSY_CLOCK_Msk)
  15.     {
  16.         /* Synchronization after writing value to CLOCK Register */
  17.     }
  18.     return true;
  19. }

  20. void RTC_RTCCTimeGet ( struct tm * currentTime )
  21. {
  22.     uint32_t dataClockCalendar = 0U;
  23.     uint32_t timeMask = 0U;

  24.     while((RTC_REGS->MODE2.RTC_SYNCBUSY & RTC_MODE2_SYNCBUSY_CLOCKSYNC_Msk) == RTC_MODE2_SYNCBUSY_CLOCKSYNC_Msk)
  25.     {
  26.         /* Synchronization before reading value from CLOCK Register */
  27.     }

  28.     dataClockCalendar = RTC_REGS->MODE2.RTC_CLOCK;

  29.     timeMask = (dataClockCalendar & RTC_MODE2_CLOCK_HOUR_Msk) >> RTC_MODE2_CLOCK_HOUR_Pos;
  30.     currentTime->tm_hour = (int)timeMask;
  31.     timeMask = (dataClockCalendar & RTC_MODE2_CLOCK_MINUTE_Msk) >> RTC_MODE2_CLOCK_MINUTE_Pos;
  32.     currentTime->tm_min = (int)timeMask;
  33.     timeMask = (dataClockCalendar & RTC_MODE2_CLOCK_SECOND_Msk) >> RTC_MODE2_CLOCK_SECOND_Pos;
  34.     currentTime->tm_sec = (int)timeMask;

  35.     timeMask = ADJUST_TM_STRUCT_MONTH(((dataClockCalendar & RTC_MODE2_CLOCK_MONTH_Msk) >> RTC_MODE2_CLOCK_MONTH_Pos));
  36.     currentTime->tm_mon  = (int)timeMask;
  37.     timeMask = (((dataClockCalendar & RTC_MODE2_CLOCK_YEAR_Msk)>> RTC_MODE2_CLOCK_YEAR_Pos) + REFERENCE_YEAR) - TM_STRUCT_REFERENCE_YEAR;
  38.     currentTime->tm_year = (int)timeMask;
  39.     timeMask = (dataClockCalendar & RTC_MODE2_CLOCK_DAY_Msk) >> RTC_MODE2_CLOCK_DAY_Pos;
  40.     currentTime->tm_mday = (int)timeMask;
  41. }
还有需要定义一个结构体
  1. struct tm {
  2.         int tm_sec;
  3.         int tm_min;
  4.         int tm_hour;
  5.         int tm_mday;
  6.         int tm_mon;
  7.         int tm_year;
  8.         int tm_wday;
  9.         int tm_yday;
  10.         int tm_isdst;
  11.         long __tm_gmtoff;
  12.         const char *__tm_zone;
  13. };
至此就可以编译下载了,
经过一个晚上到中午的测试,误差很大,相差有两分钟了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
qq1136029879 发表于 2022-12-11 13:29 | 显示全部楼层
搞个GPRS模块,搞一个gprs自动校时功能
 楼主| stb988 发表于 2022-12-11 14:04 | 显示全部楼层
GPS模块吧
gygp 发表于 2023-1-5 09:45 | 显示全部楼层
这个代码是哪里下载的?              
mollylawrence 发表于 2023-1-5 09:54 | 显示全部楼层
这个怎么更新内部的时间?              
 楼主| stb988 发表于 2023-1-5 11:21 | 显示全部楼层
  1. //15-01-2018 12:00:00 Monday

  2.     sys_time.tm_hour = 23;      /* hour [0,23] */

  3.     sys_time.tm_sec = 00;       /* seconds [0,61] */

  4.     sys_time.tm_min = 26;       /* minutes [0,59] */

  5.     sys_time.tm_mon = 11;        /* month of year [0,11] */

  6.     sys_time.tm_year = 2022;     /* years since 1900 */

  7.     sys_time.tm_mday = 10;      /* day of month [1,31] */

  8.     sys_time.tm_wday = 6;       /* day of week [0,6] (Sunday = 0) */

  9.                                 /* tm_yday - day of year [0,365] */

  10.                                 /* tm_isdst - daylight savings flag */

  11. ---------------------

  12. 作者:stb988

  13. 链接:https://bbs.21ic.com/forum.php?mod=viewthread&tid=3272080&page=1#pid13199030

  14. 来源:21ic.com

  15. 此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。


这里设置
febgxu 发表于 2023-1-5 12:39 | 显示全部楼层
图形化开发简单很多了。              
iyoum 发表于 2023-1-6 15:34 | 显示全部楼层
网上有教程可以参考的吗?              
pmp 发表于 2023-1-6 16:14 | 显示全部楼层
RTC_SET怎么设置要通信的格式呢?
chenci2013 发表于 2023-1-6 18:01 | 显示全部楼层
这个可以产生秒的中断吗?              
mmbs 发表于 2023-1-6 18:30 | 显示全部楼层
RTC的性能还是不错的。              
sanfuzi 发表于 2023-1-6 20:13 | 显示全部楼层
这个printf怎么使用的?              
xu@xupt 发表于 2023-1-6 23:42 | 显示全部楼层
很好的文章,感谢分享
mattlincoln 发表于 2023-1-9 09:53 | 显示全部楼层
RTC的精度是多少?              
olivem55arlowe 发表于 2023-1-10 20:30 | 显示全部楼层
图形化开发就是以后的发展趋势了。
nomomy 发表于 2023-1-10 22:08 | 显示全部楼层
vbat有什么要求的吗?              
macpherson 发表于 2023-1-11 20:49 | 显示全部楼层
这个网上有很多的代码可以参考的吗
hilahope 发表于 2023-1-12 11:36 | 显示全部楼层
如何移植串口到printf();
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

402

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部