16:31

STM32F4. RTC

Кто-то любит пирожки, а кто-то - нет.
В STM32, конечно же, есть контроллер часов реального времени.

Для его запуска не обязательно даже иметь внешний кварц на 32.768 кГц, так как затактировать можно от внутреннего LSI-генератора на ~32 кГц (с возможностью калибровки) или внешнего основного кварца (с настраиваемым предделителем).
А ещё, как бонус, 20 регистров (80 байт) для хранения разных данных, питание им будет идти от батарейки, от которой часы и работают, когда нет основного питания.
Возможностей у часов много, они подробно описаны в RM, остановимся пока на базовом уровне...

читать дальше

<< Предыдущее Следующее >>

@темы: arm, программизмы, электроника, stm32f4discovery, stm32

Комментарии
19.09.2013 в 19:36

Вы их проверяли на точность? Походу LSI не подходит для RTC, сколько не пытался часы спешат, в апноуте написано For STM32F2xx and STM32F4xx, LSI = 32 KHz, but LSI accuracy is not suitable for calendar application.☻
19.09.2013 в 20:27

Кто-то любит пирожки, а кто-то - нет.
Гость, нет, здесь только для примера, ибо часового кварца по дефолту нет на плате, что можно было вот так попробовать =) Для точных измерений лучше ставить кварц...

Но, вроде, здесь можно подстраивать частоту (+-ppm да и выбирать частоту импульсов)? Или я путаю с другим контроллером? .з. Блин, везде часы и везде все разные по возможностям, надо рефман поглядеть.
21.11.2013 в 12:35

Добрый день, не подскажите как правильно писать и читать регистры из бэкап домена? Буду Вам очень благодарен.
У меня стоит кварц и я немного переделал процедуру инициализации под LSE. А именно:
читать дальше
Писать и читать пробовал следующими процедурами:

Что я не так делаю, а то не фурычит, читаются нули. Проц у меня STM32F407.
21.11.2013 в 13:22

Кто-то любит пирожки, а кто-то - нет.
Гость, он заблокирован от записи (флаг DBP):

потому вынесите код


до проверки на инициализированность rtc =)



Для RTC эти флаги нужны только для настройки, а для BKP всегда. Ну либо снимать защиту DBP на время доступа к энергонезависимому домену — так будет даже лучше.
21.11.2013 в 15:30

teplofizik,
Огромное Вам СПАСИБО, выручили. Всё работает, но регистры 8 разрядные, больше чем 0xFF записать не удаётся.
21.11.2013 в 15:44

Кто-то любит пирожки, а кто-то - нет.
Гость, нет-нет, они размером 32 бита. Правда, записывать, скорее всего надо тоже ровно по 32. Я в system viewer спокойно записал в регистр 0x190, но можно и больше. Проверяёте, где отрезается -- асмом ли, алгоритмом ли... Благо, отладчик есть.


21.11.2013 в 17:24

teplofizik, спасибо, разобрался. :)
21.11.2013 в 17:29

Кто-то любит пирожки, а кто-то - нет.
Гость, хорошо =)
19.02.2014 в 07:24

Добрый день! Расскажи пожалуйста одну непонятку. В функции main исполняется сначала RTC_RESET затем RTC_Init в последней есть проверка часов на то включены они или нет а в rtc_Reset нет проверки часов включены они или нет и получается каждый раз происходит сброс часов.
// Сброс состояния часов
void rtc_Reset(void)
{
// Включим тактирование PWR
RCC->APB1ENR |= RCC_APB1ENR_PWREN;

// Разрешим доступ к управляющим регистрам энергонезависимого домена
PWR->CR |= PWR_CR_DBP;

// Выберем его как источник тактирования RTC:
RCC->BDCR |= RCC_BDCR_BDRST;
RCC->BDCR &= ~RCC_BDCR_BDRST;

А часы не должны ведь каждый раз сбрасываться командой
RCC->BDCR |= RCC_BDCR_BDRST;
RCC->BDCR &= ~RCC_BDCR_BDRST;

Я имею ввиду случай когда подключена резервная батарейка и часы должны идти все время.
19.02.2014 в 08:25

Кто-то любит пирожки, а кто-то - нет.
Гость, да, если есть батарейка, то нужно ресет вызывать только в случае, если часы не запущены. Да и настройка чуть другая будет -- на внешний часовой кварц.
19.02.2014 в 09:57

Ага! Тоже сам нашел фразу в тексте выше ".....Конечно, при ресете, от такого источника часы накроются медным тазом, но пофиг." Надо было мне внимательней читать русские слова! Извиняюсь что не в тему долго мучал вопрос в одной из статей ты написал фразу что то типа "... за год работы в ADI..." Что такое ADI?
19.02.2014 в 10:27

Кто-то любит пирожки, а кто-то - нет.
Гость, ADL, да небольшая контора в Питере по производству всякого театрального оборудования, в основном, осветительной тематики, но не только)
19.02.2014 в 12:23

teplofizik подскажи пожалуйста если в курсе. У меня плата stm32vldiscovery там контроллер stm32f100RB. Упражнялся в асме писал при инициализации часов перед установкой бита CNF ждал установки бита RTOFF после записывал значения в делитель или сам счетчик сбрасывал CNF и опять ждал готовности т. е. установки бита RTOFF. Работало нормально.Теперь начал упражняться с Си и нашел много примеров где народ кто ждет готовности бита RSF перед входом в режим конфигурации (CNF установлен) кто как и я проверяет готовность по биту RTOFF. Как правильно? В чем разница между этими флагами если не словами ref. man. а по рабоче-крестьянски.:)
21.03.2014 в 15:03

Добрый день, не могли бы Вы подсказать почему после вызова функций установки даты и времени, функция чтения читает старые данные, а меняются они только после сброса (физического) процессора?
21.03.2014 в 15:27

Кто-то любит пирожки, а кто-то - нет.
Гость, Пока RTOFF равно нулю, запись в RTC невозможна.
RSF нужно ждать после любого изменения в тактировании модуля RTC (что происходит при запуске контроллера), чтобы убедиться, что внутренние регистры синхронизировались с внешними.

Гость, не должно быть так. В отладчике смотрели?
Кстати, если считывать непосредственно после записи, может считаться и байда. Там же есть теневые регистры, которые могут обновить по запросу содержимое рабочих далеко не каждый такт. Часы работают от медленного генератора и синхронизироваться с ними надо. потому после установки времени надо некоторое время подождать, прежде чес считывать данные (там есть флаг какой-то, когда происходит обновление). Может, дело в этом, не знаю...
04.05.2014 в 06:47

Спасибо за интересные статьи. Немного разобрался с кодом. Запустил от LSE и подключил батарейку. При выключении питания данные в регистрах DT и TR сохраняются. При включении питания отображаются данные на момент выключения. Видимо не работает генератор от LSE при снятии питания. В чём может быть проблемма. Спасибо за помощь.
12.08.2014 в 20:16

Добрый день teplofizik. Не могли бы Вы рассказать, как запустить часы с внешним кварцем и батарейкой.
Ситуация такая, при отключении питания часы стоят, при включении процессор stm32f4 запускается только с ресета. Далее часы начинают работу со времени на момент выключения.
И еще не знаете, может у меня просто внешний кварц не запускается, а на внутреннем от батарейки не должен работать?
13.08.2014 в 00:15

Кто-то любит пирожки, а кто-то - нет.
r6dan, да так же, только надо предварительно запустить внешний часовой кварц и выбрать тактирование с него. Если кварц не заведётся, то и идти часы не будут никак. Если от внешнего завелись, то уже не должны остановиться.

Внутренний работает только при основном питании.
13.08.2014 в 08:09

teplofizik, Спасибо, значит предположение о том, что внутренний не работает от батарейки было верным. Значит у меня, что то кварц не хочет заводиться. Еще скажите, ножки ни как не нужно предварительно настраивать PC14, PC15 ?
10.09.2014 в 13:47

Кто-то любит пирожки, а кто-то - нет.
r6dan, вроде, не надо их настраивать, оно само разберётся.
10.09.2014 в 14:30

Спасибо, уже разобрался, у меня просто внешний кварц не запускался.
Дополнительно, для нормального потребления от батарейки нужно PDR_ON посадить на + (может кому пригодится), если на 0, то при батарейке, ядро остается под питанием, и запуск будет только через ресет.
10.09.2014 в 14:34

Кто-то любит пирожки, а кто-то - нет.
r6dan, бывает...

Про PDR_ON не знал =)