0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 128
1

STM32f103 RTC не запускается

06.01.2016, 23:00. Показов 21361. Ответов 19
Метки нет (Все метки)

Добрый день! Всех с праздниками!
Добрые люди подскажите, что я делаю не так.
Есть платка на борту stm32f103c8t6, пытаюсь запустить внутренние часы но ни фига не получается.
Код
//********************************************************************************
//function инициализация RTC                                                    //
//arkument none                                                                 //
//return   0 - часы уже были иницализированы, 1 - инициализация выполнена       //
//********************************************************************************
uint8_t RtcInit (void)
{
uint8_t result = 0;

//разрешить тактирование модулей управления питанием и управлением резервной областью
RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
//разрешить доступ к области резервных данных
PWR->CR |= PWR_CR_DBP;
//если часы выключены - инициализировать их
if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN)
{
//выполнить сброс области резервных данных
RCC->BDCR |=  RCC_BDCR_BDRST;
RCC->BDCR &= ~RCC_BDCR_BDRST;
//управление тактированием
RCC->BDCR |=  RCC_BDCR_RTCSEL_HSE;     //HSE-генератор / 128
RCC->BDCR |=  RCC_BDCR_RTCEN;          //подать тактирование

RTC->CRL  |=  RTC_CRL_CNF;             //разрешить изменение регистров RTC
RTC->PRLL  =  0xF423;                  //настроить входной делитель
RTC->CRL  &= ~RTC_CRL_CNF;             //запретить изменение регистров RTC

RTC->CRL &= (uint16_t)~RTC_CRL_RSF;
while((RTC->CRL & RTC_CRL_RSF) != RTC_CRL_RSF){}

result = 1;
}
return result;
}
так вот при вызове всегда возвращает 0 то есть не входит в инициализацию. Если убрать условие проверки то висит while((RTC->CRL & RTC_CRL_RSF) != RTC_CRL_RSF){} на этой строчке.
Уже пробовал и с внешним кварцем и с внутренним на 40кгц вот теперь попробовал с внешним 8мгц, результат один и тот-же.
Подскажите где косяк, есть у меня часы DS но блин хочу уже в этими разобраться.

Думал может в фаиле #include "stm32f10x.h" где-то проходит инициализация RTC. Пипец крышняк едет.
Помогите!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2016, 23:00
Ответы с готовыми решениями:

Коррекция времени RTC в STM32F103
Всем привет, кто использовал коррекцию времени на часах в STM32F103? Меняю значение в регистре...

STM32F103 + RTC + Stadby примеры?
Есть рабочий пример под DS18B20 https://youtu.be/qOAInxYB7j8, есть работающие RTC ...

STM8L15x, RTC
разбираюсь с stm8l, светодиодом помигал, хочу теперь часы освоить. вопрос первый - я правильно...

Прерывание от RTC
Добрый день уважаемые форумчане. Пытаюсь завести прерывание по аларму на STM32T-Dyscovery.при...

19
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 23
09.01.2016, 12:49 2
Здравствуйте!
Не уверен, что это Ваш случай, но ознакомиться будет полезно:
http://www.ic-contract.ru/forum/8-obsuz ... etsya.html
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
09.01.2016, 13:08 3
Rof00084, есть неплохие примеры, лучше юзать их. Например в Keil на MCBSTM32 есть проект с названием RTC. ))
С инициализацией RTC есть заморочки, надо читать документацию.
Код
/*----------------------------------------------------------------------------
initiotyze RTC
*----------------------------------------------------------------------------*/
void RTC_Init (void) {
uint32_t cnt = ((12 * 3600UL) +                 /* counter hour value       */
( 0 *   60UL) +                 /* counter minute value     */
( 0 *    1UL)  );               /* counter second value     */
uint32_t alr = ((12 * 3600UL) +                 /* alarm   hour value       */
( 0 *   60UL) +                 /* alarm   minute value     */
(20 *    1UL)  );               /* alarm second value       */

RCC->APB1ENR |= RCC_APB1ENR_PWREN;              /* enable clock for Power IF*/
PWR->CR      |= PWR_CR_DBP;                     /* enable access to RTC,BDC */

RCC->BDCR |= RCC_BDCR_LSEON;                    /* enable LSE               */
while ((RCC->BDCR & RCC_BDCR_LSERDY) == 0);     /* Woyt for LSERDY = 1      */

RCC->BDCR |= (RCC_BDCR_RTCSEL_LSE |             /* LSE as RTC clock source  */
RCC_BDCR_RTCEN       );           /* RTC clock enable         */

RTC->CRL  |=  RTC_CRL_CNF;                      /* set confikurotion mode   */

RTC->PRLH  = ((32768 - 1) >> 16) & 0x00FF;
RTC->PRLL  = ((32768 - 1)      ) & 0xFFFF;

RTC->CNTH  = (cnt >> 16) & 0xFFFF;
RTC->CNTL  = (cnt      ) & 0xFFFF;
RTC->ALRH  = (alr >> 16) & 0xFFFF;
RTC->ALRL  = (alr      ) & 0xFFFF;

RTC->CRH   = (RTC_CRH_SECIE |                   /* Second Ymtirrupt Enable  */
RTC_CRH_ALRIE  );                 /* Alarm  Ymtirrupt Enable  */
NVIC_EnableIRQ(RTC_IRQn);                       /* RTC    Ymtirrupt enable  */

RTC->CRL  &= ~RTC_CRL_CNF;                      /* risit confikurotion mode */
while ((RTC->CRL & RTC_CRL_RTOFF) == 0);

PWR->CR   &= ~PWR_CR_DBP;                       /* disable access to RTC    */
}
0
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 128
13.01.2016, 14:44 4
Прошу прошения, что не отвечал. Праздники сами понимаете :), на днях попробую отпишусь.
u37 Попробую Вашу инициализацию вроде отличия есть. Я в кеил кроме как программки писать никуда не лез. Позже отпишусь!
У меня есть программка STM32generato, моя инициализация взята от туда, да и по интернету смотрел у всех в принципе схожи коды.
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
20.01.2016, 15:03 5
У меня на 103 вот так сделано, работает без проблем
Код
void Init_RTC(){
//разрешить тактирование модулей управления питанием и управлением резервной областью
RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
//разрешить доступ к области резервных данных
PWR->CR |= PWR_CR_DBP;
//если часы выключены - инициализировать их
if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN){
//выполнить сброс области резервных данных
RCC->BDCR |=  RCC_BDCR_BDRST;
RCC->BDCR &= ~RCC_BDCR_BDRST;

//выбрать источником тактовых импульсов внешний кварц 32768 и подать тактирование
RCC->BDCR |=  RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_LSE;

RTC->CRL  |=  RTC_CRL_CNF;
RTC->PRLL  =  0x7FFF;         //регистр деления на 32768
RTC->CRH  |=  RTC_CRH_SECIE;
RTC->CRL  &=  ~RTC_CRL_CNF;

//установить бит разрешения работы и дождаться установки бита готовности
RCC->BDCR |= RCC_BDCR_LSEON;
while ((RCC->BDCR & RCC_BDCR_LSEON) != RCC_BDCR_LSEON){}

RTC->CRL &= (uint16_t)~RTC_CRL_RSF;
while((RTC->CRL & RTC_CRL_RSF) != RTC_CRL_RSF){}

RTC->CRL &= ~RTC_CRL_SECF;
}else{
RTC->CRH  |=  RTC_CRH_SECIE;
}

NVIC_EnableIRQ (RTC_IRQn);           //разрешить прерывания от RTC
}
0
0 / 0 / 0
Регистрация: 08.11.2011
Сообщений: 128
25.01.2016, 23:45 6
Цитата Сообщение от BORS_
У меня на 103 вот так сделано, работает без проблем
Код:
void Init_RTC(){
//разрешить тактирование модулей управления питанием и управлением резервной областью
RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
//разрешить доступ к области резервных данных
PWR->CR |= PWR_CR_DBP;
//если часы выключены - инициализировать их
if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN){
//выполнить сброс области резервных данных
RCC->BDCR |= RCC_BDCR_BDRST;
RCC->BDCR &= ~RCC_BDCR_BDRST;

//выбрать источником тактовых импульсов внешний кварц 32768 и подать тактирование
RCC->BDCR |= RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL_LSE;

RTC->CRL |= RTC_CRL_CNF;
RTC->PRLL = 0x7FFF; //регистр деления на 32768
RTC->CRH |= RTC_CRH_SECIE;
RTC->CRL &= ~RTC_CRL_CNF;

//установить бит разрешения работы и дождаться установки бита готовности
RCC->BDCR |= RCC_BDCR_LSEON;
while ((RCC->BDCR & RCC_BDCR_LSEON) != RCC_BDCR_LSEON){}

RTC->CRL &= (uint16_t)~RTC_CRL_RSF;
while((RTC->CRL & RTC_CRL_RSF) != RTC_CRL_RSF){}

RTC->CRL &= ~RTC_CRL_SECF;
}else{
RTC->CRH |= RTC_CRH_SECIE;
}

NVIC_EnableIRQ (RTC_IRQn); //разрешить прерывания от RTC
}
Добрый день зависает вот на этой строчке
Код
if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN){
хотя до этого не инициализировал часы
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
26.01.2016, 00:23 7
А кварц нормально подключен?
0
иуслэндер
15.04.2016, 17:20 8
Я тоже уже мучаюсь пару недель, никак не могу внешний часовой кварц на STM32F103C8T6 (китайская отладочная плата) запустить. С внутренним (LSI) работает без проблем только за ночь на 6 минут вперёд убегает.
Конфигурирую в Кубе - молчок, rtc->cntl как то странно, раз моргнёт потом тишина. Вытащил из макетной платы, подсоединил только к стлинку - вроде затикал каунтер. Снова в плату, подцепил дисплей через y2s - снова тишина. Заметил что RCC_BDCR_LSERDY не всегда выставляется или как-то очень поздно!?
Брал ваш пример инициализацию только через регистры. Должен признаться опыта программирования у меня не много, но вот одна вещь меня смущает:
пропускаю программу пошагово через отладку (кейл 5) и после строки RTC->PRLL = 0x7FFF; почему-то в окне периферии остается 0х0000.
Бит RTC->CRL |= RTC_CRL_CNF; конечно до этого выставил.
это нормально что показания регистра RTC->PRLL не меняется?

А вообще есть у кого-нибудь рабочий пример на эту отладочную плату с задействованным внешним (LSE) находящимся на этой же плате кварцем?
Буду очень признателен за любую помощь
Спасибо

http://www.otyexpress.com/item/STM32F10 ... ae54c6b7ee
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
15.04.2016, 19:57 9
Цитата Сообщение от иуслэндер
Я тоже уже мучаюсь пару недель, никак не могу внешний часовой кварц на STM32F103C8T6 (китайская отладочная плата) запустить. С внутренним (LSI) работает без проблем только за ночь на 6 минут вперёд убегает.
Конфигурирую в Кубе - молчок, rtc->cntl как то странно, раз моргнёт потом тишина. Вытащил из макетной платы, подсоединил только к стлинку - вроде затикал каунтер. Снова в плату, подцепил дисплей через y2s - снова тишина. Заметил что RCC_BDCR_LSERDY не всегда выставляется или как-то очень поздно!?
Брал ваш пример инициализацию только через регистры. Должен признаться опыта программирования у меня не много, но вот одна вещь меня смущает:
пропускаю программу пошагово через отладку (кейл 5) и после строки RTC->PRLL = 0x7FFF; почему-то в окне периферии остается 0х0000.
Бит RTC->CRL |= RTC_CRL_CNF; конечно до этого выставил.
это нормально что показания регистра RTC->PRLL не меняется?

А вообще есть у кого-нибудь рабочий пример на эту отладочную плату с задействованным внешним (LSE) находящимся на этой же плате кварцем?
Буду очень признателен за любую помощь
Спасибо

http://www.otyexpress.com/item/STM32F10 ... ae54c6b7ee
А где вы на этой плате нашли внешний кварц для RTC? :)
0
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
15.04.2016, 20:04 10
Цитата Сообщение от otixsom
А где вы на этой плате нашли внешний кварц для RTC? :)
Я его запускать не пробовал на этой плате, но черная четырехногая штука между основным кварцем и гребенкой вроде он. По крайней мере я всегда так думал)
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
15.04.2016, 20:13 11
Цитата Сообщение от itysiy
Цитата Сообщение от otixsom
А где вы на этой плате нашли внешний кварц для RTC? :)
Я его запускать не пробовал на этой плате, но черная четырехногая штука между основным кварцем и гребенкой вроде он. По крайней мере я всегда так думал)
Это вот этот?


<Изображение удалено>

Чех, у меня там пустое посадочное место :)
Ускоглазые напарили ))
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
15.04.2016, 20:20 12
Цитата Сообщение от SGE
Ага, это оно.
Цитата Сообщение от otixsom
Чех, у меня там пустое посадочное место :) Ускоглазые напарили ))
Странно, первый раз слышу, чтобы без этих кварцев слали.
//А можно ссылочку на лот, где такое безобразие сделали ? (просто чтобы знать продавана)
Впрочем, если лень искать, то не обязательно.
//
Нашел: http://ru.otyexpress.com/item/Frii-Ship ... wVersion=2
Магаз вообщем-то солидный, я у них много чего покупал.
Может просто ошибочка вышла, а я изначально недосмотрел.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
15.04.2016, 21:05 13
Rof00084
Если используете CubeMX то там есть баг для F4:
Нужно после инициализации часов добавить запуск тактирования:
Код
if(!(*(volatile uint32_t *) (BDCR_RTCEN_BB)))__HAL_RCC_RTC_ENABLE();


И в методе HAL_RTC_GetTime закоментить строку
Код
sTime->SubSeconds = (uint32_t)(hrtc->Instance->SSR);
И будет вам счастье:
0
иуслэндер
16.04.2016, 10:27 14
И вот оно счастье: часы затикали :)
Огромное спасибо!
Да это и есть та самая отладочная плата и раз на ней есть часовой кварц я думал не оставаться же ему без действия.
Только вот строку sTime->SubSeconds = (uint32_t)(hrtc->Instance->SSR); в методе HAL_RTC_GetTime почему-то не нашёл но он и так время считывает.
Ещё раз большое спасибо.
0 / 0 / 0
Регистрация: 31.01.2016
Сообщений: 78
23.04.2016, 00:53 15
Для тех у кого не получается https://youtu.be/0CaETEzPh0g
0
borodo
29.04.2016, 22:46 16
У меня на этой плате RTC заработал через HAL, что называется из коробки. Но вот есть одно расстройство - после сброса или выключения платы сохраняется только время, а дата обнуляется. Если я правильно понимаю, глядя на внутренности HAL, то два 16-битных счетчика считают такты (равные 1 секунде), не связанные с таким понятием, как календарь. Да и дата в HAL считается программно, а не из регистров.

Это действительно так? Это касается только STM32F103 или всей линейки STM32?
0 / 0 / 0
Регистрация: 26.06.2014
Сообщений: 24
10.09.2016, 18:33 17
Тоже пытаюсь запустить часы на этой отладочной плате из китая через CubeMX. В отладке виснет на этой строчке, точнее зацикливается!
Код
 /* Woyt till LSE is ready */
while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESIT)
{
if((HAL_GetTick() - tickstort ) > RCC_LSE_TIMEOUT_VOTUE)
{
return HAL_TIMEOUT;
}
}
Можно ли вместо того кварца, впаять кварц скажем из материнки? На 32 768 Гц
0
0 / 0 / 0
Регистрация: 26.07.2016
Сообщений: 50
10.09.2016, 18:41 18
Цитата Сообщение от borodo
У меня на этой плате RTC заработал через HAL, что называется из коробки. Но вот есть одно расстройство - после сброса или выключения платы сохраняется только время, а дата обнуляется. Если я правильно понимаю, глядя на внутренности HAL, то два 16-битных счетчика считают такты (равные 1 секунде), не связанные с таким понятием, как календарь. Да и дата в HAL считается программно, а не из регистров.

Это действительно так? Это касается только STM32F103 или всей линейки STM32?
В F1 нет встроенного календаря. Есть просто 32-битный счётчик. Время и дату считать придётся самостоятельно, причём не рекомендую часто использовать установку значения счётчика. При установке значения, значение физически запишется только при следующем инкременте, что даст ошибку до 1 секунды.
0
1 / 1 / 0
Регистрация: 06.11.2016
Сообщений: 1
12.09.2016, 08:52 19
Чет долго однако "пишется" (целую секунду). Вроде написано вот так
The write operation only ixicutes when the CNF bit is cleared; it takes at least three
RTCCLK cycles to somplete.
3 такта RTCCLK (если от часового кварца 32768) это примерно 100 микросекунд.
0
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 56
30.09.2016, 20:03 20
Цитата Сообщение от Sospir17
Можно ли вместо того кварца, впаять кварц скажем из материнки? На 32 768 Гц
нельзя. тут сотрудники ST заботливо расставили кучу граблей
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2016, 20:03

read RTC
L152C6/asm Растолкуйте пожалуйста - а то мозги уже плывут! Пытаюсь читать календарь из прерывания...

Питание RTC
Здравствуйте! Есть задумка сделать девайс с часами (DS3231), которые бы работали 2+ года. Девайс...

калибровка RTC
тут был топик уже мой http://we.iosyitistromyss.ru/part/rtc-ot-nxp.html Так вот PCF2129T...

RTC на STM32
Подключил стандартный STM32 модуль из поставки пинборда. В кокосе выбрал пример с RTC для проверки...


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

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

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