物联网技术
直播中

jinglixixi

8年用户 1549经验值
擅长:嵌入式技术 光电显示 接口/总线/驱动 控制/MCU
私信 关注

【极海APM32F030R8 MINI开发板免费试用】之RTC电子时钟

`
在APM32F030R8芯片内部集成有RTC,该RTC 是一个独立的 BCD 定时器/计数器,不仅可以支持日历功能,还具有闹钟中断和阶段性中断功能, 日历功能除了亚秒、秒、分钟、小时(12 或 24 小时格式)、星期、日期、月、年,以BCD(二进制编码的十进制)格式存在的日历时钟外,还具有自动调整一个月为28、 29(闰年)天、 30 和 31 天的功能。
将RTC计时功能与前面介绍的OLED屏相结合,就可实现一个电子时钟,见下图所示。
RTC电子时钟

实现图示效果的主程序为:

  1. int main(void)
  2. {
  3. uint8_t Presec;
  4. uint32_t data;
  5. RTC_DATE_T DateStruct;
  6. RTC_tiME_T TimeStruct;
  7. APP_OLED_Init();
  8. OLED_Init();
  9. OLED_Clear();
  10. OLED_ShowString(0,0,"APM32F030 TEST",16);
  11. OLED_ShowString(16,2,"OLED & RTC",16);
  12. OLED_ShowString(4,4,"20  -  -",16);
  13. OLED_ShowString(20,6,"  :  :",16);
  14. /** RTC Reset */
  15. RTC_Init();
  16. RTC_Reset();
  17. RTC_Init();
  18. /** RTC Enable Init*/
  19. RTC_EnableInit();
  20. /** First time Init*/
  21. if((RTC_ReadBackup(RTC_BAKP_DATA4)&&0X01)==RESET)
  22. {
  23. /* Init Date 20/12/6/0*/
  24. DateStruct.year =  20;
  25. DateStruct.month = 12;
  26. DateStruct.date =  6;
  27. DateStruct.weekday = 0;
  28. RTC_ConfigDate(RTC_FORMAT_BIN,&DateStruct);
  29. Delay();
  30. RTC_WriteBackup(RTC_BAKP_DATA1,RTC->DATE);
  31. Delay();
  32. RTC_WriteBackup(RTC_BAKP_DATA4,0X01);
  33. }
  34. /** Read Date information from Backup*/
  35. else
  36. {
  37. data = RTC_ReadBackup(RTC_BAKP_DATA1);
  38. DateStruct.year =  data>>16;
  39. DateStruct.month = (data>>8)&0x0f;
  40. DateStruct.date =  data&0xff;
  41. DateStruct.weekday = (data>>13)&0x07;
  42. RTC_ConfigDate(RTC_FORMAT_BCD,&DateStruct);
  43. Delay();
  44. }
  45. /** First time Init*/
  46. if((RTC_ReadBackup(RTC_BAKP_DATA3)&&0X01)==RESET)
  47. {
  48. TimeStruct.H12 = 12;
  49. TimeStruct.hours = 23;
  50. TimeStruct.minutes = 59;
  51. TimeStruct.seconds = 50;
  52. RTC_ConfigTime(RTC_FORMAT_BIN,&TimeStruct);
  53. Delay();
  54. RTC_WriteBackup(RTC_BAKP_DATA0,RTC->TIME);
  55. Delay();
  56. RTC_WriteBackup(RTC_BAKP_DATA3,0X01);
  57. }
  58. /** Read Time information from Backup */
  59. else
  60. {
  61. data = RTC_ReadBackup(RTC_BAKP_DATA0);
  62. TimeStruct.hours = data>>16;
  63. TimeStruct.minutes = (data>>8)&0xff;
  64. TimeStruct.seconds = (data)&0xff;
  65. RTC_ConfigTime(RTC_FORMAT_BCD,&TimeStruct);
  66. Delay();
  67. }
  68. /* Wait is neccessary*/
  69. Delay();
  70. /** RTC Disable Init */
  71. RTC_DisableInit();
  72. for(;;)
  73. {
  74. /** Read last Time*/
  75. Presec = TimeStruct.seconds;
  76. /** Read time*/
  77. RTC_ReadTime(RTC_FORMAT_BIN,&TimeStruct);
  78. /** If pass 1 second */
  79. if(Presec!=TimeStruct.seconds)
  80. {
  81. /** Read Date */
  82. RTC_ReadDate(RTC_FORMAT_BIN,&DateStruct);
  83. /** Write DATE information to Backup*/
  84. RTC_WriteBackup(RTC_BAKP_DATA1,RTC->DATE);
  85. OLED_ShowNum(20,4,DateStruct.year,2,16);
  86. OLED_ShowNum(44,4,DateStruct.month,2,16);
  87. OLED_ShowNum(68,4,DateStruct.date,2,16);
  88. OLED_ShowNum(20,6,TimeStruct.hours,2,16);
  89. OLED_ShowNum(44,6,TimeStruct.minutes,2,16);
  90. OLED_ShowNum(68,6,TimeStruct.seconds,2,16);
  91. }
  92. }
  93. }


`
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

更多回帖

发帖
×
20
完善资料,
赚取积分