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

RTC на STM32F103c8t6

30.07.2020, 10:45. Просмотров 960. Ответов 10

Здравствуйте, столкнулся с проблемой учета даты на stm32f103.
Время выводит более менее нормально но с датой что-то не то, а именно как только дата (месяц) становится двухзначным он виснет, точнее при ноябре, и декабре, 11 и 12. Вместо 11 он пишет 17 а вместо 12 - 18, 10 вроде нормально работает. Как только приходят эти месяцы то он или не переводит дату дня или просто зависает.
Вот код:
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
char RTCstr[15] = {0};
 
void RTC_Disp(void)
{
    TFT_DrawLine(TFT_BLUE,0,219,TFT_WIDTH,219);
    TFT_DrawLine(TFT_BLUE,0,220,TFT_WIDTH,220);
    TFT_DrawLine(TFT_BLUE,0,221,TFT_WIDTH,221);
    TFT_SetFont(&Font20);
    HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    if (sTime.Hours < 10)
    {
        if (sTime.Minutes < 10)
        {
            if (sTime.Seconds < 10) snprintf(RTCstr, 16,"0%d:0%d:0%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
            else snprintf(RTCstr, 16,"0%d:0%d:%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
        }
        else 
        {
            if (sTime.Seconds < 10) snprintf(RTCstr, 16,"0%d:%d:0%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
            else snprintf(RTCstr, 16,"0%d:%d:%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
        }
    }
    else
    {
        if (sTime.Minutes < 10)
        {
            if (sTime.Seconds < 10) snprintf(RTCstr, 16,"%d:0%d:0%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
            else snprintf(RTCstr, 16,"%d:0%d:%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
        }
        else 
        {
            if (sTime.Seconds < 10) snprintf(RTCstr, 16,"%d:%d:0%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
            else snprintf(RTCstr, 16,"%d:%d:%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
        }
    }
    TFT_String(10,223,RTCstr);
//=================================================================================================================
    HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN);
    if (DateToUpdate.Date < 10)
    {
        if (DateToUpdate.Month < 10)
        {
            if (DateToUpdate.Year < 10) snprintf(RTCstr, 16,"0%d-0%d-200%d", DateToUpdate.Date, DateToUpdate.Month, DateToUpdate.Year);
            else snprintf(RTCstr, 16,"0%d-0%d-20%d", DateToUpdate.Date, DateToUpdate.Month, DateToUpdate.Year);
        }
        else 
        {
            if (DateToUpdate.Year < 10) snprintf(RTCstr, 16,"0%d-%d-200%d", DateToUpdate.Date, DateToUpdate.Month, DateToUpdate.Year);
            else snprintf(RTCstr, 16,"0%d-%d-20%d", DateToUpdate.Date, DateToUpdate.Month, DateToUpdate.Year);
        }
    }
    else
    {
        if (DateToUpdate.Month < 10)
        {
            if (DateToUpdate.Year < 10) snprintf(RTCstr, 16,"%d-0%d-200%d", DateToUpdate.Date, DateToUpdate.Month, DateToUpdate.Year);
            else snprintf(RTCstr, 16,"%d-0%d-20%d", DateToUpdate.Date, DateToUpdate.Month, DateToUpdate.Year);
        }
        else 
        {
            if (DateToUpdate.Year < 10) snprintf(RTCstr, 16,"%d-%d-200%d", DateToUpdate.Date, DateToUpdate.Month, DateToUpdate.Year);
            else snprintf(RTCstr, 16,"%d-%d-20%d", DateToUpdate.Date, DateToUpdate.Month, DateToUpdate.Year);
        }
    }
    TFT_String(170,223,RTCstr);
    TFT_SetFont(&Font24);
}
Посмотрел дефайны дат в халовском rtc, все нормально, ноябрь и декабрь 11, 12. Почему 17, 18, не понятно.

C
1
2
3
4
5
6
7
8
9
10
11
12
#define RTC_MONTH_JANUARY              ((uint8_t)0x01)
#define RTC_MONTH_FEBRUARY             ((uint8_t)0x02)
#define RTC_MONTH_MARCH                ((uint8_t)0x03)
#define RTC_MONTH_APRIL                ((uint8_t)0x04)
#define RTC_MONTH_MAY                  ((uint8_t)0x05)
#define RTC_MONTH_JUNE                 ((uint8_t)0x06)
#define RTC_MONTH_JULY                 ((uint8_t)0x07)
#define RTC_MONTH_AUGUST               ((uint8_t)0x08)
#define RTC_MONTH_SEPTEMBER            ((uint8_t)0x09)
#define RTC_MONTH_OCTOBER              ((uint8_t)0x10)
#define RTC_MONTH_NOVEMBER             ((uint8_t)0x11)
#define RTC_MONTH_DECEMBER             ((uint8_t)0x12)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2020, 10:45
Ответы с готовыми решениями:

STM32F103C8T6 RTC
Всем привет. RTC запустилось все без проблем от LSE. Но после тестов счета, оказалось, что часы, то...

CAN и STM32F103C8T6
Здравствуйте уважаемые форумчане! Хочу создать небольшой проект с подключением к CAN шине...

STM32F103C8T6
Доброго времени суток. Процессор STM32F103C8T6 один из самых дешевых и достаточно мощных АРМов....

STM32F103C8T6 на алиэкспрес
дожили :) готовая плата с кварцами разъемами......

10
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
30.07.2020, 11:29 2
Лучший ответ Сообщение было отмечено Rustam98 как решение

Решение

Цитата Сообщение от Rustam98 Посмотреть сообщение
11 и 12. Вместо 11 он пишет 17 а вместо 12 - 18,
11 в шеснадцетиричном это 17 в десятичном
12 соответственно 18
Цитата Сообщение от Rustam98 Посмотреть сообщение
#define RTC_MONTH_OCTOBER              ((uint8_t)0x10)
#define RTC_MONTH_NOVEMBER             ((uint8_t)0x11)
#define RTC_MONTH_DECEMBER             ((uint8_t)0x12)
ты учел что эти макросы представляют числа в двоично десятичном коде(BCD)
https://ru.wikipedia.org/wiki/... 012%20(910).

Добавлено через 1 минуту
Цитата Сообщение от Rustam98 Посмотреть сообщение
HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN););
по моему, нет

Добавлено через 7 минут
Цитата Сообщение от Rustam98 Посмотреть сообщение
if (sTime.Seconds < 10) snprintf(RTCstr, 16,"0%d:0%d:0%d", sTime.Hours, sTime.Minutes, sTime.Seconds);
зачем такие сложности?
есть модификатор ширины
https://ru.wikipedia.org/wiki/Printf
если написать вот так
C
1
snprintf(RTCstr, 16,"%2d:%2d:%2d", sTime.Hours, sTime.Minutes, sTime.Seconds);
то будет выводится число из двух знаков, вместо незначащего 0 будет пробел
а если вот так
C
1
snprintf(RTCstr, 16,"%.2d:%.2d:%.2d", sTime.Hours, sTime.Minutes, sTime.Seconds);
то 0 будет выводится примерно так 01, 02 .....
2
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 55
30.07.2020, 14:55  [ТС] 3
Спасибо))
Цитата Сообщение от ValeryS Посмотреть сообщение
snprintf(RTCstr, 16,"%2d:%2d:%2d", sTime.Hours, sTime.Minutes, sTime.Seconds);
И правда, я забыл чет))
0
1778 / 1108 / 109
Регистрация: 04.01.2010
Сообщений: 3,885
30.07.2020, 15:17 4
Цитата Сообщение от Rustam98 Посмотреть сообщение
#define RTC_MONTH_OCTOBER              ((uint8_t)0x10)
это подстава, конечно . Но, если выводить месяцы с помощью этих дефайнов, то можно использовать формат "%02X", который выведет значения в HEX, чему они и соответствуют.
1
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
30.07.2020, 17:10 5
у 103 другая беда
по сути RTC там просто счетчик секунд
и когда проходит смена даты при выключенном камне,типа выключили при 23:59:59, а через пару секунд включили то модификации даты не происходит
я когда то сам переводил секунды в часы и в дату
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,113
Записей в блоге: 6
30.07.2020, 23:43 6
Цитата Сообщение от ValeryS Посмотреть сообщение
по сути RTC там просто счетчик секунд
и когда проходит смена даты при выключенном камне,типа выключили при 23:59:59, а через пару секунд включили то модификации даты не происходит
Тогда это проблема софта, потому что в МК только счетчик секунд.
1
1778 / 1108 / 109
Регистрация: 04.01.2010
Сообщений: 3,885
31.07.2020, 10:38 7
Цитата Сообщение от locm Посмотреть сообщение
Тогда это проблема софта, потому что в МК только счетчик секунд.
соглашусь.

Не по теме:

И, кстати, самостоятельно еще ни разу не задумывался о выводе даты в МК... ) возможно, это не так и просто как кажется, потому что придется прикручивать библиотеку календаря.

0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
31.07.2020, 15:16 8
Цитата Сообщение от locm Посмотреть сообщение
потому что в МК только счетчик секунд.
не во всех, в некоторых уже полноценный RTC
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,113
Записей в блоге: 6
31.07.2020, 15:26 9
ValeryS, Вы написали
Цитата Сообщение от ValeryS Посмотреть сообщение
у 103 другая беда
по сути RTC там просто счетчик секунд
и когда проходит смена даты при выключенном камне,типа выключили при 23:59:59, а через пару секунд включили то модификации даты не происходит
Если речь не про F103 почему он упомянут и написали про особенности его RTC?
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
31.07.2020, 16:21 10
Цитата Сообщение от locm Посмотреть сообщение
Если речь не про F103 почему он упомянут и написали про особенности его RTC?
для развития кругозора
вдруг ТС выберет другой камень и все проблемы уйдут
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 55
Сегодня, 13:09  [ТС] 11
Цитата Сообщение от ValeryS Посмотреть сообщение
11 и 12. Вместо 11 он пишет 17 а вместо 12 - 18,
11 в шеснадцетиричном это 17 в десятичном
12 соответственно 18
Сообщение от Rustam98
#define RTC_MONTH_OCTOBER              ((uint8_t)0x10)
#define RTC_MONTH_NOVEMBER             ((uint8_t)0x11)
#define RTC_MONTH_DECEMBER             ((uint8_t)0x12)
ты учел что эти макросы представляют числа в двоично десятичном коде(BCD)
https://ru.wikipedia.org/wiki/... 012%20(910).
Добавлено через 1 минуту
Сообщение от Rustam98
HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN);
по моему, нет
Почему эта конструкция не работает? она стоит в бесконечном цикле M123 uint8_t

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN);
    
    if (DateToUpdate.Month == RTC_MONTH_JANUARY)                M123 = 1;
    else if (DateToUpdate.Month == RTC_MONTH_FEBRUARY)  M123 = 2;
    else if (DateToUpdate.Month == RTC_MONTH_MARCH)         M123 = 3;
    else if (DateToUpdate.Month == RTC_MONTH_APRIL)         M123 = 4;
    else if (DateToUpdate.Month == RTC_MONTH_MAY)               M123 = 5;
    else if (DateToUpdate.Month == RTC_MONTH_JUNE)          M123 = 6;
    else if (DateToUpdate.Month == RTC_MONTH_JULY)          M123 = 7;
    else if (DateToUpdate.Month == RTC_MONTH_AUGUST)        M123 = 8;
    else if (DateToUpdate.Month == RTC_MONTH_SEPTEMBER) M123 = 9;
    else if (DateToUpdate.Month == RTC_MONTH_OCTOBER)       M123 = 10;
    else if (DateToUpdate.Month == RTC_MONTH_NOVEMBER)  M123 = 11;
    else if (DateToUpdate.Month == RTC_MONTH_DECEMBER)  M123 = 12;
    
    
    snprintf(RTCstr2, 12,"%.2d-%.2d-20%.2d", DateToUpdate.Date, M123, DateToUpdate.Year);//X
    TFT_String(170,223,RTCstr2);
Он не меняет дату, но теперь правильно ее выводит, то есть если я изначально задам ноябрь или декабрь то он покажет что это 11 или 12 месяц но при смене даты он меняет число на 1 а дата не меняется.
Я не очень понимаю почему.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Сегодня, 13:09

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

Stm32f103c8t6 периферия
Народ , кто может рассказать про периферию stm32f103c8t6, не могу нигде найти описание, в мануале...

STM32F103C8T6 и USB3.0 ?
Столкнулся с неожиданной проблемой - тестовая платка с STM32F103C8T6 нормально определялась как...

enc28j60 и stm32f103c8t6
Всем привет. Есть модуль enc28j60 и stm32f103c8t6 Работает на freeRTOS Включен модуль webserver....

Прерывание stm32f103c8t6
Добрый день форумчане!Может кто то сталкивался с подобной проблеммой? Суть.Настраиваю пин для...

Чудеса CAN с STM32F103c8t6
Всем доброго дня! Второй день бьюсь в попытках разобраться с CAN протоколом на STM32F103 и...

Опознать STM32f103c8t6
Такая история, есть камни STM32F103C8T6 - по даташиту 64Kb Ftosh Memory, 20kb - SROM,...


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

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

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