Easyelectronics.ru

Электроника для всех
Текущее время: 21 мар 2019, 01:00

Часовой пояс: UTC + 5 часов




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 16 июл 2012, 17:36 
Заглядывает иногда

Зарегистрирован: 31 июл 2010, 21:36
Сообщения: 65
Откуда: Киев
Привет всем. Помогите с настройкой RTC. После инициализации и запуска часов не сохраняются регистры, которые находятся Backup области. После сброса процессора счетный регистр RTC_CNT начинается с нуля, а в регистре входного делителя RTC_PRL устанавливается число по умолчанию - 0x8000, хотя прописываю 7FFF для секунд. Вот код инициализации:
Код:
void InitRTC(void)
   {
       if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
         {
            /* Backup data register value is not correct or not yet programmed (when
                the first time the program is executed) */

            /* RTC Configuration */
            RTC_Configuration();

            BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
            PWR_BackupAccessCmd(DISABLE);
         }
   }
   
   void RTC_Configuration(void)
      {
         /* Enable PWR and BKP clocks */
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

         /* Allow access to BKP Domain */
         PWR_BackupAccessCmd(ENABLE);
         
         /* Reset Backup Domain */
         BKP_DeInit();

         /* Enable LSE */
         RCC_LSEConfig(RCC_LSE_ON);
         /* Wait till LSE is ready */
         while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
         {}

         /* Select LSE as RTC Clock Source */
         RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

         /* Enable RTC Clock */
         RCC_RTCCLKCmd(ENABLE);

         /* Wait for RTC registers synchronization */
         RTC_WaitForSynchro();

         /* Wait until last write operation on RTC registers has finished */
         RTC_WaitForLastTask(); 

         /* Set RTC prescaler: set RTC period to 1sec */
         RTC_SetPrescaler(0x7FFF); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
         
         /* Wait until last write operation on RTC registers has finished */
         RTC_WaitForLastTask();
         
         /* Enable the RTC Second */
         RTC_ITConfig(RTC_IT_SEC, ENABLE);

         /* Wait until last write operation on RTC registers has finished */
         RTC_WaitForLastTask();
         
//           PWR_BackupAccessCmd(DISABLE);
      }

Батарелка присудствует.
Очень буду спасибо за подсказку)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 16 июл 2012, 19:49 
Старожил

Зарегистрирован: 28 май 2012, 09:26
Сообщения: 226
Вот проверенный код:
Код:
#include "stm32f10x.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
void RTC_Config(void)
{
   NVIC_InitTypeDef NVIC_InitStructure;

   /* Configure one bit for preemption priority */
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

   /* Enable the RTC Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

   PWR_BackupAccessCmd(ENABLE);
   RCC_LSEConfig(RCC_LSE_ON);
   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
   RCC_RTCCLKCmd(ENABLE);

   RTC_WaitForSynchro();
   RTC_WaitForLastTask();
   RTC_ITConfig(RTC_IT_SEC, ENABLE);
   RTC_WaitForLastTask();
   RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
   RTC_WaitForLastTask();
}

void RTC_IRQHandler(void)
{
   if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
   {
      RTC_ClearITPendingBit(RTC_IT_SEC);
      RTC_WaitForLastTask();
   }
   //times=RTC_GetCounter();
}


Доступ к BKP:
Код:
#include "stm32f10x.h"
#include "stm32f10x_bkp.h"
#include "stm32f10x_rcc.h"

#define BKP_DR_NUMBER              42

uint16_t BKPDataReg[BKP_DR_NUMBER] = { BKP_DR1, BKP_DR2, BKP_DR3, BKP_DR4,
        BKP_DR5, BKP_DR6, BKP_DR7, BKP_DR8, BKP_DR9, BKP_DR10, BKP_DR11,
        BKP_DR12, BKP_DR13, BKP_DR14, BKP_DR15, BKP_DR16, BKP_DR17, BKP_DR18,
        BKP_DR19, BKP_DR20, BKP_DR21, BKP_DR22, BKP_DR23, BKP_DR24, BKP_DR25,
        BKP_DR26, BKP_DR27, BKP_DR28, BKP_DR29, BKP_DR30, BKP_DR31, BKP_DR32,
        BKP_DR33, BKP_DR34, BKP_DR35, BKP_DR36, BKP_DR37, BKP_DR38, BKP_DR39,
        BKP_DR40, BKP_DR41, BKP_DR42 };

void BKPinit()
{
    /* Enable PWR and BKP clock */
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);

}

/*
    BKP_WriteBackupRegister(BKPDataReg[1],BKP_ReadBackupRegister(BKPDataReg[1])+1);
    datar= BKP_ReadBackupRegister(BKPDataReg[1]);
*/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 16 июл 2012, 20:19 
Заглядывает иногда

Зарегистрирован: 31 июл 2010, 21:36
Сообщения: 65
Откуда: Киев
makser Спасибо за ответ. Помогло. В моем коде функция BKP_DeInit(); каждый раз при ee запуске сбрасывала мои регистры. Возможно ее нада запускать только после проверки на инициализацию часов, и если часы не инициализированы, то BKP_DeInit();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 10 сен 2012, 02:53 
Заглядывает иногда

Зарегистрирован: 27 авг 2012, 01:30
Сообщения: 39
А зачем BKP регистры используются? Я что-то не понял их назначения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 10 сен 2012, 09:36 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2010, 15:24
Сообщения: 711
Откуда: Украина, Николаев
Если есть резервное питание, то в них можно хранить данные после выключения питания. Типа еепрома с неограниченным количеством записей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 04 июл 2014, 13:39 
Здравствуйте!

Зарегистрирован: 25 мар 2014, 00:11
Сообщения: 3
Всем доброго времени суток! У меня следующая проблема.. На моем девайсе stm32f103c8t6 BKP регистры с 11 по 42-й всегда возвращают 0... Причем остальные регистры (1 - 10) работают отлично, в паре с RTC. Сначала я уместил все в эти 10 регистров, но сейчас остальные регистры нужны позарез. Кто знает в чем может быть проблема?
Код:
  RCC->APB1ENR |= RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN;
  PWR->CR |= PWR_CR_DBP;

  PWR_BackupAccessCmd(ENABLE);

  if ((RCC->BDCR & RCC_BDCR_RTCEN) != RCC_BDCR_RTCEN)
  {

    RCC->BDCR |=  RCC_BDCR_BDRST;
    RCC->BDCR &= ~RCC_BDCR_BDRST;

    RCC->BDCR |=  RCC_BDCR_RTCSEL_LSE;     //
    RCC->BDCR |=  RCC_BDCR_RTCEN;          //

    RTC->CRL  |=  RTC_CRL_CNF;             //
    RTC->PRLL  =  0x7FFF;                  //
    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){}

    result = 1;
  }
Инициализация регистров и часов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 04 июл 2014, 14:35 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5343
GunyaElectron, по даташиту для вашего камня доступны только 1-10 BKP_DRx ...
Цитата:
2.3.14 RTC (real-time clock) and backup registers
The RTC and the backup registers are supplied through a switch that takes power either on
VDDsupply when present or through the V
BATpin. The backup registers are ten 16-bit
registers used to store 20 bytes of user application data when VDDpower is not present.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 04 июл 2014, 15:07 
Здравствуйте!

Зарегистрирован: 25 мар 2014, 00:11
Сообщения: 3
Ааа.. понятно)) Спасибо, буду тогда искать альтернативные способы.. можно прямо во флеш программ записать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 18 янв 2016, 14:39 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2143
Уважаемые знатоки, подскажите пожалуйста...
Я правильно понимаю, что настраивать тактирование RTC не обязательно каждый раз, если тактируем от часового кварца?

Если все же вызывать каждый раз при включении функцию настройки тактирования - часы то не сбиваются при этом?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 30 апр 2016, 22:58 
Здравствуйте!

Зарегистрирован: 30 апр 2016, 12:37
Сообщения: 2
GunyaElectron писал(а):
... Причем остальные регистры (1 - 10) работают отлично, в паре с RTC...


У меня после сброса платы STM32F103C8T6 в RTC сохраняется только время, а дата обнуляется. Судя по HAL в функции RTC_ReadTimeCounter используются два 16-битных регистра счетчика CNTH и CNTL. А глянув еще глубже обнаружил, что дата вообще считается программно по переполнению счетчика суток. Если счетчик считает секунды, то их должно хватить до 2038 года, но, если мс, то тогда это просто счетчик. Хотел отказаться от внешнего DS1307, но похоже, что не выйдет.

Выдержка из datasheet:

The real-time clock provides a set of continuously running counters which can be used with suitable software to provide a clock calendar function, and provides an alarm interrupt and a periodic interrupt.
The RTC features a 32-bit programmable counter for long term measurement using the Compare register to generate an alarm.

Кто уже имеет опыт, скажите, RTC в STM32 действительно не считает дни/месяцы/годы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 02 май 2016, 13:16 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
boroda писал(а):
Кто уже имеет опыт, скажите, RTC в STM32 действительно не считает дни/месяцы/годы?

У STM32F103C8T6 нет поддержки календаря. Там просто счетчик, который инкрементируется раз в секунду. Как правило за ноль счетчика принимают дату 1 января 1970 года, и счетчик показывает количество секунд, прошедшее с этого момента времени. День недели, год, месяц, число высчтитываются программно. Вот тут это обсуждали

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 14 мар 2018, 20:57 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2568
сорри, подниму:
хочу уточнить, если rtc не нужен, но нужно только сохранять пару счетчиков да еще кое-какой коэффициент - я правильно понял, мне нужен только второй кусок кода из второго сообщения?
и чтобы оно работало - нужно просто подцепить батарейку к vbat, без каких-либо дополнительных телодвижений в коде?
правильно ли я понял, что все это - в оперативной памяти хранится, у которой типа неисчерпаемый ресурс. то есть я могу этот счетчик спокойно сохранять после каждого изменения прямо в регистре? (до этого хотел отслеживать внешнее событие, при наступлении которого счетчик перестает считать, и после этого сохранять значение в регистр)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F1 RTC и BKP регистры
СообщениеДобавлено: 14 мар 2018, 21:44 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2900
Разблокируйте запись в бекап-регистры и спокойно пишите в них напрямую. Они 16-битные, и такие же, как и вся SRAM, без ограничения циклов.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: VladimirStm32


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB