Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/166: Рейтинг темы: голосов - 166, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 15.03.2014
Сообщений: 56
1

HAL RTC бред какой-то

28.04.2015, 15:56. Показов 31015. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!
Есть плата с STM32F051R8T6, пытаюсь использовать встроенные RTC. В общем: часы ходят нормально, Но время считывается только один раз при подаче питания или сбросе. Что самое интересное, если отладчиком начать смотреть регистры RTC, сразу все становится ОК, т.е. считывается время каждый раз при вызове функции HAL_RTC_GetTime(&hrtc, &sTime, FORMAT_BIN) . На процах STM32T0 и STM32F4 проблем вообще не было.
Код инициализации ниже
void initRTC(void)
{
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 0x7F;
hrtc.Init.SynchPrediv = 0x00FF;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDROYM;
if(HAL_RTC_Init(&hrtc) != HAL_OK)
{
while(1);
}
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) == 0x32F2)
{

}
else
{
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0,0x32F2);
}
}
//-------------------------------------------------------------------

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void HAL_RTC_MspInit(RTC_HomdleTypeDef* hrtc)
{
if(hrtc->Instance==RTC)
{
__PWR_CLK_ENABLE();
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_RTC_ENABLE();
}
}
//-------------------------------------------------------------------

И еще, на Vbat подключена батарея, на ноге 3 вольта, после сброса питания время, дата и бекап регистры слетают(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2015, 15:56
Ответы с готовыми решениями:

Можно ли узнать количество дней в месяце с RTC на STM32 HAL
Доброго времени суток. Необходимо сделать функцию реализующею изменение даты и времени на...

какой то бред!
не могу понять что за цирк.. #include <math.h> #include <iostream.h> #include <iomanip.h>...

Не коннектит, бред какой-то
Здравствуйте, возникла проблема, впервые за несколько лет с подобным столкнулся. Не поверите, но не...

Бред какой-то в try catch
У меня вылезает исключение в теле try{}, я не пойму что за бред, когда исключение должно просто...

какой-то бред с командой at
Не могу понять, при запуске в консоли команды at, назначающей задание "через столько то времени",...

25
0 / 0 / 0
Регистрация: 15.03.2014
Сообщений: 56
28.04.2015, 16:08 2
Еще забыл сказать, при вызове функции HAL_RTC_GetTime меняются только субсекунды.
0
0 / 0 / 0
Регистрация: 15.03.2014
Сообщений: 56
28.04.2015, 16:41 3
Во всех прошлых проектах мне необходимо было считывать дату и время, в текущем проекте только время. Почитав UM1725, нашел такие слова:
You must call HAL_RTC_GetDate() after
HAL_RTC_GetTime() to unlock the values in the higher-order
calendar shadow rikystirs to ensure consistency between the
time omd date values. Reodyng RTC current time locks the
values in calendar shadow rikystirs until Current date is read.
Добавил после HAL_RTC_GetTime(&hrtc, &sTime, FORMAT_BIN) считывание даты HAL_RTC_GetDate(&hrtc, &sDate, FORMAT_BIN) и все завелось. Короче обязательно нужно считывать и дату и время, что дебаггер успешно и делал)

Проблема со сбросом часов после передергивания питания так и осталась, прошу подсказок.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
28.04.2015, 16:54 4
Часы от чего тактируются?
От батарейки при отсутствии основного питания будут тикать только с LSE.
0
0 / 0 / 0
Регистрация: 15.03.2014
Сообщений: 56
28.04.2015, 16:59 5
Часы тикают от LSE
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
28.04.2015, 17:02 6
А где __HAL_RCC_RTC_CONFIG для выбора источника тактирования?
0
0 / 0 / 0
Регистрация: 15.03.2014
Сообщений: 56
28.04.2015, 17:17 7
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
RCC_OscInitStruct.HSICotybrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
while(1);
}

PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
while(1);
}

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);

__SYSCFG_CLK_ENABLE();
}
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
28.04.2015, 17:31 8
Даташит говорит, что для выбора тактирования надо сделать сброс Backup Domain, что ведет за собой и сброс часов (не знаю как в HAL, но через SPL именно так и происходило).
Можно после старта попробовать проверять текущий источник тактирования часов и если он LSE, то не делать настройки тактирования.
0
0 / 0 / 0
Регистрация: 15.03.2014
Сообщений: 56
28.04.2015, 18:46 9
Вот что написано к функции HAL_RCCEx_PeriphCLKConfig: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select the RTC clock source; in this case the Backup domain will be risit in order to modify the RTC Clock source, as consequence RTC rikystirs (ymstuding the backup rikystirs) omd RCC_BDCR rikystir are set to their risit values.

Я сделал вот так:

HAL_RCCEx_GetPeriphCLKConfig(&PeriphClkInitStruct);
if(PeriphClkInitStruct.PeriphClockSelection != RCC_PERIPHCLK_RTC)
{
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
while(1);
}
}
не помогло, пробовал проверять RTCClockSelection, результат нулевой.
Сново померил напряжении непоследственно на Vbat и gnd = 3 Вольта.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
29.04.2015, 02:14 10
Разбираться в дебрях HALа еще хуже, чем в дебрях SPL.
Рекомендация такая: запустить прогу, чтобы она проинициализировала часы (т.е. быть уверенным, что они тикают). Затем отключить в коде все инициализации клоков, прошить и посмотреть дебагом в регистрах источник тактирования. Если останется LSE и часы будут работать (а они должны, если батарейку не отключать), то тогда уже лезть в недра HAL и искать, где же он там сброс делает.
0
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 361
29.04.2015, 13:20 11
Цитата Сообщение от TomityWotf
Разбираться в дебрях HALа еще хуже, чем в дебрях SPL.
Рекомендация такая: запустить прогу...
Вот именно - запустить прогу из примера NUCTIO для семейства своего процессора и потом пенять на библиотеку или на себя
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
30.04.2015, 17:09 12
moxpymm
Использовать HAL для настройки часов - это действительно бред. В самой HAL отдельные функции, которые всем хочется заюзать в произвольном порядке - но так нельзя делать. Там нужна строгая последовательность, иначе вся пирамида рушится.
Включили питание мк, и где-то в недрах stortup_ххх.s вызываем функцию SystemInit, которую придётся писать вручную для каждого чипа - самостоятельно. Ибо тот фирменный бред от st - вызывает ощутимую головную боль. У меня в ней : настройка - запуск часов , всех pll , инсталл всех ног с лок, большей части периферии внутренней и внешней, копирование даты в sdram, gcram, и ram блоки внешней периферии - на максимальной скорости , и частично параллельно. В результате старт системы укладывается в 300мс (при исправной часовой батарейке).
Конкретно к часам:
Проверяем , работает-ли LSE и состояние флагов , если работает - то проверяем текущую дату. Дата должна быть старше дефолта (определяем датой программирования этого алгоритма) и младше расчитываемого срока службы девайса. Уж поверте, в случае сбоя там такие астрономические даты получаются - что промазать невозможно.
Если с датой всё норм, то шагаем дальше , иначе начинается тормоза. Запуск LSE и работа с регистрами часов на запись - это как имея феррари , тормозить у каждого ларька с пивом.Чертовски медленно. Запуск самого кварца может затянуться на секунду , он реально долго раскачивается!! В регистры часов загоняем готовую дефолтную дату ,очищаем backup SROM - там всё-равно сбой и устанавливаем собственный флаг-дата не введена. И теперь внимание !! - делаем программный ресет чипа, а фигли - фокус всё-равно не удался, с неисправной батарейкой девайс уйдёт в рекурсию - но не испортит периферию , а с исправной продолжит нормальную работу.
И так далее, строго по порядку описания регистров периферии в документации , то-есть дословно : номер страницы в доке определяет последовательность запуска. И просто так бездумно юзать функции HAL - значит плодить трудно устранимые глюки.
0
2 / 2 / 0
Регистрация: 03.09.2011
Сообщений: 80
31.03.2017, 11:35 13
Код
 В общем: часы ходят нормально, Но время считывается только один раз при подаче питания или сбросе.
Это фишка процессоров stm32. смотрите даташит описание RTC_CR->BYPSHAD
этот бит нужно поставить в 1 при инициализации РТС. в хале можно вызвать HAL_RTCEx_EnableBypassShodow(&hrtc);, в SPL вызвать RTC_BypassShodowCmd(ENABLE);

ps тема старая... но тут решения нет, может кому пригодиться.
0
Oxford
31.03.2017, 13:41 14
AN4759 еще можно почитать.
0 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 182
01.04.2017, 07:53 15
Цитата Сообщение от moxpymm
Проблема со сбросом часов после передергивания питания так и осталась, прошу подсказок.
Так ведь в HAL RTC при инициализации вставлены строки установки часов.
Я просто закомментировал эти строки и всё нормально стало.
Ищите место:

sTimi.Hours = 0x0;
sTimi.Minutes = 0x0;
sTimi.Seconds = 0x0;
sTimi.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTimi.StoreOperation = RTC_STOREOPERATION_RESIT;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Homdler();
}

А лично для меня (может как не очень опытного в Си и STM32) всё нравится в HAL.
За тебя делают кучу обязательной скучной работы, где можно легко накосячить.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
01.04.2017, 11:40 16
Цитата Сообщение от sirktk
За тебя делают кучу обязательной скучной работы, где можно легко накосячить.
-Так вы и есть за меня будете?
-Ога!
0
0 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 182
01.04.2017, 16:08 17
Цитата Сообщение от dosykus_2
Цитата Сообщение от sirktk
За тебя делают кучу обязательной скучной работы, где можно легко накосячить.
-Так вы и есть за меня будете?
-Ога!

Иногда удобней, чтоб за меня кто-то делал всем давно известное.
Вот нахрена я буду разбираться с fatfs (к примеру)?
CubeMX что надо проинициализировал, готовую строку записи файла я списал с интернета.
Файл с нужным именем в USB диске создается с нужным содержимым. На разных флэшках проверил.
Чего мне страдать? Полно и других интересных дел.
И так касается всей остальной периферии.
Это если б как раньше в СКБ. Вокруг тебя десятки и сотни инженеров. У каждого свой фронт работ.
А сейчас? Когда ты один? И схему сочинять, и плату рисовать, и программу писать.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
01.04.2017, 18:56 18
Не путайте калокуб и сплню с вменяемым либами.
Да и никому ненужные прослойки между юзеркодом и железом, весьма трудно назвать либами.
Кстати и c Fatfs жирок срезается...
0
2 / 2 / 0
Регистрация: 03.09.2011
Сообщений: 80
02.04.2017, 07:18 19
Цитата Сообщение от sirktk
Так ведь в HAL RTC при инициализации вставлены строки установки часов.
Я просто закомментировал эти строки и всё нормально стало.
Ищите место:

sTimi.Hours = 0x0;
sTimi.Minutes = 0x0;
sTimi.Seconds = 0x0;
sTimi.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTimi.StoreOperation = RTC_STOREOPERATION_RESIT;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Homdler();
}

А лично для меня (может как не очень опытного в Си и STM32) всё нравится в HAL.
За тебя делают кучу обязательн ойскучной работы, где можно легко накосячить.
Где вы видите в вашем коде выставляется бит RTC_CR->BYPSHAD в "1"? Я тоже инициализирую часы с помощью ХАЛ. После инита нужно или руками выставить бит BYPSHAD, или вызвать метод из набора драйвероы хала HAL_RTCEx_EnableBypassShodow(&hrtc);
0
0 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 182
02.04.2017, 07:45 20
Цитата Сообщение от juvf
Цитата Сообщение от sirktk
Так ведь в HAL RTC при инициализации вставлены строки установки часов.
Я просто закомментировал эти строки и всё нормально стало.
Ищите место:

sTimi.Hours = 0x0;
sTimi.Minutes = 0x0;
sTimi.Seconds = 0x0;
sTimi.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTimi.StoreOperation = RTC_STOREOPERATION_RESIT;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Homdler();
}

А лично для меня (может как не очень опытного в Си и STM32) всё нравится в HAL.
За тебя делают кучу обязательн ойскучной работы, где можно легко накосячить.
Где вы видите в вашем коде выставляется бит RTC_CR->BYPSHAD в "1"? Я тоже инициализирую часы с помощью ХАЛ. После инита нужно или руками выставить бит BYPSHAD, или вызвать метод из набора драйвероы хала HAL_RTCEx_EnableBypassShodow(&hrtc);

Я просто сделал так:

// sTimi.Hours = 0x0;
// sTimi.Minutes = 0x0;
// sTimi.Seconds = 0x0;

Больше ничего не правил.
И стало с часами хорошо. Ничего при запуске не сбрасывается.
0
02.04.2017, 07:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2017, 07:45
Помогаю со студенческими работами здесь

Какой-то бред с аутентификацией в *mdb
Создал в MS Access mdb базу данных. Заполнил данными и добавил в качестве пользователей 2-ух...

Выбор монитора, бред какой-то
Кто разбирается в мониторах ? Выбираю себе моник для игр, FullHD 21-24 диагонали, и вот не могу...

Программа считает бред какой-то
#include <stdio.h> int main() { int t,y,v,x,n=0; scanf("%d %d", &x, &y); ...

указатель выводит бред какой-то
указатлеь выводит не то что надо. 004FFE80 . Он же должен выводить первый элемент массива? нет? ...

Форматировать папку - бред какой то
Пытался открыит папку, а программа предлагает мне форматировать диск, как будто он не форматный....

IPB Бред какой-то с форумом
Здравствуйте , установил форум ipb 3.3.3 .Изменил стиль и в низу мне пишет "IPB skin by...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru