[MM32硬件] 【灵动微电子MM32F0121测评】4.打印时间戳

[复制链接]
 楼主| 阿源玩电子 发表于 2025-6-25 20:50 | 显示全部楼层 |阅读模式
本帖最后由 阿源玩电子 于 2025-6-25 20:54 编辑

打印时间戳

1.rtc外设初始化

  1. <div class="blockcode"><blockquote>void RTC_Configure(void)
  2. {
  3.    
  4.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_RTC | RCC_APB1Periph_BKP, ENABLE);
  5.     PWR_BackupAccessCmd(ENABLE);  
  6.     BKP_DeInit();                 


  7.     if (BKP_ReadBackupRegister(BKP_DR1) != 0x5D5D)
  8.     {

  9.         RCC_LSEConfig(RCC_LSE_ON);
  10.         while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

  11.         RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  12.         RCC_RTCCLKCmd(ENABLE);

  13.         RTC_WaitForSynchro();
  14.         RTC_WaitForLastTask();
  15.         RTC_SetPrescaler(32767);
  16.         RTC_WaitForLastTask();

  17.         uint32_t init_seconds = DateToSeconds(RTC_BASE_YEAR, RTC_BASE_MONTH,
  18.                                             RTC_BASE_DATE, 0, 0, 0);
  19.         RTC_SetCounter(init_seconds);
  20.         RTC_WaitForLastTask();

  21.         RTC_ITConfig(RTC_IT_SEC, ENABLE);
  22.         RTC_WaitForLastTask();

  23.         BKP_WriteBackupRegister(BKP_DR1, 0x5D5D);
  24.     }
  25.     else
  26.     {
  27.         RTC_WaitForSynchro();
  28.         RTC_ITConfig(RTC_IT_SEC, ENABLE);
  29.         RTC_WaitForLastTask();
  30.     }

  31.     NVIC_InitTypeDef NVIC_InitStruct;
  32.     NVIC_InitStruct.NVIC_IRQChannel = RTC_BKP_IRQn;
  33.     NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
  34.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  35.     NVIC_Init(&NVIC_InitStruct);
  36. }

2.获取日期函数
  1. void RTC_GetDate(RTC_DateTypeDef* date)
  2. {
  3.     uint32_t counter = RTC_GetCounter();

  4.     uint32_t days = counter / 86400;

  5.     date->RTC_WeekDay = (days + RTC_BASE_WEEKDAY) % 7;

  6.     date->RTC_Year = RTC_BASE_YEAR;

  7.     static const uint8_t month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  8.     uint8_t month;
  9.     for (month = 0; month < 12; month++) {
  10.         uint8_t days_in_month = month_days[month];
  11.         
  12.         if (month == 1 && IsLeapYear(RTC_BASE_YEAR)) {
  13.             days_in_month = 29;
  14.         }
  15.         
  16.         if (days >= days_in_month) {
  17.             days -= days_in_month;
  18.         } else {
  19.             break;
  20.         }
  21.     }
  22.     date->RTC_Month = month + 1;
  23.     date->RTC_Date = days + 1;
  24. }
4.获取时间函数

  1. void RTC_GetTime(RTC_TimeTypeDef* time)
  2. {
  3.     uint32_t counter = RTC_GetCounter();
  4.    
  5.     time->RTC_Seconds = counter % 60;
  6.     counter /= 60;
  7.     time->RTC_Minutes = counter % 60;
  8.     counter /= 60;
  9.     time->RTC_Hours = counter % 24;
  10. }


5.打印函数
  1. void Get_RTC_Time()
  2. {
  3.     RTC_DateTypeDef date;
  4.     RTC_TimeTypeDef time;
  5.     uint32_t counter = RTC_GetCounter();
  6.     RTC_GetDate(&date);
  7.     RTC_GetTime(&time);
  8.    
  9.     printf("RTC Counter: %lu\r\n", counter);
  10.     printf("Days: %lu\r\n", counter / 86400);
  11.     printf("Current: %04d-%02d-%02d %02d:%02d:%02d Week:%d\r\n",
  12.            date.RTC_Year, date.RTC_Month, date.RTC_Date,
  13.            time.RTC_Hours, time.RTC_Minutes, time.RTC_Seconds,
  14.            date.RTC_WeekDay);
  15. }
6.试验现象
时间戳.jpg




AdaMaYun 发表于 2025-7-31 17:46 | 显示全部楼层
打印时间戳
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

33

帖子

0

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