Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 55
1

Можно ли узнать количество дней в месяце с RTC на STM32 HAL

31.07.2020, 14:31. Просмотров 176. Ответов 2

Доброго времени суток.
Необходимо сделать функцию реализующею изменение даты и времени на микроконтроллере. С временем все понятно, можно просто его перезаписывать, ведь в сутках всегда 24 часа, минуты и секунды по тому же принципу, просто ограничить диапазон. Но вот а с датой как? Как узнать сколько дней в определенном месяце какого-то года, ведь у нас есть високосные годы, месяцы с 31 днем и с 30. На устройстве нет ввода чисел, и все реализуется по принципу вверх, вниз. И поэтому необходимо например в текущий високосный 2020 год понять то что в феврале 29 дней, и ограничить на этом.
Нашел реализацию, того как это работает в кубе, вот:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
static void RTC_DateUpdate(RTC_HandleTypeDef *hrtc, uint32_t DayElapsed)
{
  uint32_t year = 0U, month = 0U, day = 0U;
  uint32_t loop = 0U;
 
  /* Get the current year*/
  year = hrtc->DateToUpdate.Year;
 
  /* Get the current month and day */
  month = hrtc->DateToUpdate.Month;
  day = hrtc->DateToUpdate.Date;
 
  for (loop = 0U; loop < DayElapsed; loop++)
  {
    if ((month == 1U) || (month == 3U) || (month == 5U) || (month == 7U) || \
        (month == 8U) || (month == 10U) || (month == 12U))
    {
      if (day < 31U)
      {
        day++;
      }
      /* Date structure member: day = 31 */
      else
      {
        if (month != 12U)
        {
          month++;
          day = 1U;
        }
        /* Date structure member: day = 31 & month =12 */
        else
        {
          month = 1U;
          day = 1U;
          year++;
        }
      }
    }
    else if ((month == 4U) || (month == 6U) || (month == 9U) || (month == 11U))
    {
      if (day < 30U)
      {
        day++;
      }
      /* Date structure member: day = 30 */
      else
      {
        month++;
        day = 1U;
      }
    }
    else if (month == 2U)
    {
      if (day < 28U)
      {
        day++;
      }
      else if (day == 28U)
      {
        /* Leap year */
        if (RTC_IsLeapYear(year))
        {
          day++;
        }
        else
        {
          month++;
          day = 1U;
        }
      }
      else if (day == 29U)
      {
        month++;
        day = 1U;
      }
    }
  }
 
  /* Update year */
  hrtc->DateToUpdate.Year = year;
 
  /* Update day and month */
  hrtc->DateToUpdate.Month = month;
  hrtc->DateToUpdate.Date = day;
 
  /* Update day of the week */
  hrtc->DateToUpdate.WeekDay = RTC_WeekDayNum(year, month, day);
}
Зачем мне писать примерно тоже если это есть внутри. Но проблема того что это статическая функция, а так как программа совсем еще не готова, это будет 1000 раз перекомпилироваться в кубе, и вообще не очень понятно как это использовать.
Вообщем вопрос тот же, как узнать количество дней в месяце? Желательно не меняя кубовских библиотек.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2020, 14:31
Ответы с готовыми решениями:

Множества.Месяц 1..30 Описать функцию число дней (m), определяющую количество дней в месяце (n) не високосного года.
Месяц 1..30 Описать функцию число дней (m), определяющую количество дней в месяце (n) не...

Количество дней в месяце
Есть программа, но работает она не очень точно, суть в том, что она должна отсчитать ровно год...

Количество дней в месяце
Таск 1 Пользователь вводит номер месяца . Надо вывести количество дней в этом месяце ...

Количество дней в месяце
Вывести количество дней в текущем месяце можно так: perl -MTime::Piece -E '$t=localtime;say...

2
Эксперт .NET
6844 / 4452 / 1067
Регистрация: 25.05.2015
Сообщений: 13,613
Записей в блоге: 13
31.07.2020, 15:12 2
Цитата Сообщение от Rustam98 Посмотреть сообщение
ведь в сутках всегда 24 часа, минуты и секунды по тому же принципу, просто ограничить диапазон
Аналогично.
Цитата Сообщение от Rustam98 Посмотреть сообщение
Как узнать сколько дней в определенном месяце какого-то года, ведь у нас есть високосные годы, месяцы с 31 днем и с 30.
Все месяцы, кроме февраля, фиксированы. Просто научитесь определять високосный год.
0
Почетный модератор
11086 / 4058 / 388
Регистрация: 12.06.2008
Сообщений: 11,775
31.07.2020, 22:59 3
Цитата Сообщение от Rius Посмотреть сообщение
Просто научитесь определять високосный год.
Если год кратен 4, то високосный. Исключения - года, кратные 100, но не кратные 400. Кстати, в том же HAL есть функция RTC_IsLeapYear(), которая определяет, високосный ли год. Но эта функция статическая и доступна только внутри stm32f1xx_hal_rtc.c.

Цитата Сообщение от Rustam98 Посмотреть сообщение
Зачем мне писать примерно тоже если это есть внутри.
Там есть только увеличение. Кроме того, функция объявлена как статическая, а значит использовать её из другого файла не получится.
В общем, функционал в HAL недостаточен для ваших задач (если вам нужно увеличивать и уменьшать дату). И даже тот, который есть, не доступен без редактирования библиотеки.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2020, 22:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Количество дней в месяце
Как узнать сколько дней в текущем месяце ? Такой расчет используется в выражении: Количество...

Количество дней в месяце
Здравствуйте. Подскажите, есть ли метод чтобы найти количество дней в месяце?

Определить количество строк в компоненте ListBox и количество дней в выбранном месяце
Вынесите на форму компонент ListBox и занесите туда названия 12 месяцев года. Напишите программу:...

Вычислить количество дней в месяце
Продолжая мучиться, пытаюсь вычислить количество дней(в которых были отравлены сообщения) в каждом...

Вывести количество дней в месяце
Напишите программу,которая по введенному номеру месяца високосного или невисокосного года, выводит...

Найти количество дней в месяце
Как найти количество дней в месяце? Предположим я ввожу месяц через input, а программа показывает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.