0 / 0 / 0
Регистрация: 15.03.2014
Сообщений: 56
|
|
1 | |
HAL RTC бред какой-то28.04.2015, 15:56. Показов 31015. Ответов 25
Метки нет (Все метки)
Приветствую!
Есть плата с 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
|
28.04.2015, 15:56 | |
Ответы с готовыми решениями:
25
Можно ли узнать количество дней в месяце с RTC на STM32 HAL какой то бред! Не коннектит, бред какой-то Бред какой-то в try catch какой-то бред с командой at |
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
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 |
Код
В общем: часы ходят нормально, Но время считывается только один раз при подаче питания или сбросе. этот бит нужно поставить в 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
Я просто закомментировал эти строки и всё нормально стало. Ищите место: 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
-Ога! Иногда удобней, чтоб за меня кто-то делал всем давно известное. Вот нахрена я буду разбираться с 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
0
|
0 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 182
|
|
02.04.2017, 07:45 | 20 |
Сообщение от juvf
Я просто сделал так: // sTimi.Hours = 0x0; // sTimi.Minutes = 0x0; // sTimi.Seconds = 0x0; Больше ничего не правил. И стало с часами хорошо. Ничего при запуске не сбрасывается.
0
|
02.04.2017, 07:45 | |
02.04.2017, 07:45 | |
Помогаю со студенческими работами здесь
20
Какой-то бред с аутентификацией в *mdb Выбор монитора, бред какой-то Программа считает бред какой-то указатель выводит бред какой-то Форматировать папку - бред какой то IPB Бред какой-то с форумом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |