Перейти к содержанию
    

STM32F2x

Часики не устанавливаются. Инициализация вроде в норме. Часы тикают и читаются, но не записываются.

Записываются если только в отладчике RTC вывести на экран. Вроде как при чтении каких то регистров дебагером часики перезаписываются.

Может кто подскажет чего в супе не хватает?

    RTC_TimeStructure.RTC_Hours = ((str[8]-0x30)<<4)|(str[9]-0x30);
    RTC_TimeStructure.RTC_Minutes = ((str[10]-0x30)<<4)|(str[11]-0x30);
    RTC_TimeStructure.RTC_Seconds = ((str[12]-0x30)<<4)|(str[13]-0x30);

    RTC_DateStructure.RTC_WeekDay = 0;
    RTC_DateStructure.RTC_Date = ((str[6]-0x30)<<4)|(str[7]-0x30); 
    RTC_DateStructure.RTC_Month = ((str[4]-0x30)<<4)|(str[5]-0x30);
    RTC_DateStructure.RTC_Year = ((str[2]-0x30)<<4)|(str[3]-0x30);

    RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);                    // Init Time
    RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure);                    // Init Date

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может проблема в дебагере?

кеил, например, не умет корректно отображать переменные которые не лежать на момент отображения в регистрах...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может проблема в дебагере?

кеил, например, не умет корректно отображать переменные которые не лежать на момент отображения в регистрах...

Не отпадает. В сотках действительно так было, а здесь все наоборот. Да и программа читает их и в буфер сует, а потом еще через веб сервер в писишку отправляет. Причем время иногда устанавливается а дата никак. Задержки пробывал ставить. Всякие там библиотечные цыклы синхронизации тоже.

Еще сталкнулся с тем, что регистры RTC почему то не защищаются от записи. Пишу в любое время в льбой BKP, хотя протект включен, да библиотечные функции при выходе протект с понтом дела включают.

Изменено пользователем vlad_new

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем танцы с бубном показали, что в счетчик даты нихрена новое значение не переписывается из какого то там их временного внутреннего регистра пока не прочитаеш счетчик времени. Даты шыты все облазел и по этому поводу ни гу гу, еррата то же помалкивает. Все что нашел это то что зачение из этого таинственного временного регистра перепишится в счетчик само по себе через 4 такта шыны. А вот хрен. Оказывается его еще и прочитать надо. Может есть что то еще чего я не допонял, но на то он и бубен с плясками. :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня прекрасно работают

  RTC_SetDate( RTC_Format_BIN, &RTC_DateStructure );
    RTC_SetTime( RTC_Format_BIN, &RTC_TimeStructure );

Но я использую "RTC_Format_BIN"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня прекрасно работают

Но я использую "RTC_Format_BIN"

Я проверил. BIN или BCD тут не причем. У меня другая мысля появилась. А вдруг играет роль последовательность. И точно так и оказалось.

Вот только повлияло последовательность чтения, а не записи.

Вот так работает, а наоборот нет.

   RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure);           // Get the current Time
   RTC_GetDate(RTC_Format_BCD, &RTC_DateStructure);           // Get the current Date

Вот блин, не люблю я такие непонятки.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то у меня ни какими средствами не удается установить дату и время. Причем, если CMOS сброшен, то первичная инициализация проходит и назначается время и дата, но не те, что надо, а так, дефолтные. Потом приходит нужная дата и время, а назначить не удается.

Процессор SMM32F207. Компилятор GCC в среде CodeBlocks

ОС в прошивке FreeRTOS

Дата и время приходят по сети Ethernet, но обрабатываются потом в очереди.

    ts.RTC_Hours     = (uint8_t) tm->hour;
    ts.RTC_Minutes     = (uint8_t) tm->min;
    ts.RTC_Seconds     = (uint8_t) tm->sec;
    ds.RTC_Year     = (uint8_t) (tm->year % 100);
    ds.RTC_Month     = (uint8_t) tm->month;
    ds.RTC_Date     = (uint8_t) tm->day;
    ds.RTC_WeekDay     = (uint8_t) tm->wday;
    portENTER_CRITICAL();
    PWR_BackupAccessCmd( ENABLE );
    // сохраняем дату и время

  //RTC_WriteProtectionCmd(DISABLE);
  //RCC_RTCCLKCmd(ENABLE);
  //RTC_WaitForSynchro();

    RTC_SetTime( RTC_Format_BIN, &ts );
    RTC_SetDate( RTC_Format_BIN, &ds );
  //RTC_WriteProtectionCmd(ENABLE);
    PWR_BackupAccessCmd( DISABLE );
    portEXIT_CRITICAL();

Сначала были только функции назначения даты и времени, потом попытки шаманства, в том числе запрета прерываний. Ничего не помогает.

Отладчик показывает, что доходим до функции RTC_EnterInitMode, там взбодряют RTC->ISR и ждут

RTC->ISR = (uint32_t)RTC_INIT_MASK;

    do
    {
      initstatus = RTC->ISR & RTC_ISR_INITF;
      initcounter++;  
    } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00));

Но флага INITF так и не дожидаемся.

Функции чтения даты и времени работают нормально, на экран часто выводится и дата и время. Но вот назначить новое не получается.

Что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот RTC сделан весьма криво. Кроме

PWR_BackupAccessCmd( ENABLE )

перед записью в регистры RTC нужно обязательно давать пару команд снятия защиты записи в регистры

RTC->WPR = 0xCA; RTC->WPR = 0x53;

 

И еще - вы не забыли сначала задать клок RTC? Этот код - для работы с LSE 32 кгц.

//Сначала разрешаем клоки периферии
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//Часто нужно

PWR_BackupAccessCmd(ENABLE);//Обязательно -всегда

//Конфигурим LSE
RCC_LSEConfig(RCC_LSE_ON);//Включили LSE
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); //Дождались готовности-обязательно

//Теперь настраиваем сам RTC. Задали клок
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);//Разрешили подачу клока
RTC_WaitForSynchro();// Wait for RTC APB registers synchronisation

Ну и далее по прописи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct)
{
.......
/* Disable the write protection for RTC registers */
 RTC->WPR = 0xCA;
 RTC->WPR = 0x53;

 /* Set Initialization mode */
 if (RTC_EnterInitMode() == ERROR)
 {
status = ERROR;
 } 
 else
 {
/* Set the RTC_TR register */
RTC->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK);

/* Exit Initialization mode */
RTC_ExitInitMode(); 

if(RTC_WaitForSynchro() == ERROR)
{
  status = ERROR;
}
else
{
  status = SUCCESS;
}

 }
 /* Enable the write protection for RTC registers */
 RTC->WPR = 0xFF; 

 return status;
}

Защиту снимают в самой функции. Причем дебагер у меня проходит по этому месту. Как раз после этого идет вызов RTC_EnterInitMode, внутри которого и происходит ошибка.

Сами часы настраиваются в функции, которая при старте ОС проверяет, настроены ли часы и, если надо, их настраивает полностью. Неужели и при назначении даты или времени надо проводить так же полную инициализацию, а не только установку даты и времени?

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Вот так работает, а наоборот нет.

   RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure);           // Get the current Time
   RTC_GetDate(RTC_Format_BCD, &RTC_DateStructure);           // Get the current Date

На самом деле будет работать и так и эдак, но нужно поправить функцию библиотеки RTC_GetDate(RTC_Format_BCD, &RTC_DateStructure) - в ней ошибка. Т.е. не совсем ошибка, но бяка, спасибо разработчику этого RTC. Для правильного чтения даты нужно дважды сбросить флаг, т.е. добавить дополнительную команду RTC_WaitForSynchro().

PWR_BackupAccessCmd(ENABLE);//Разрешили доступ к RTC и BackupDomain
  //Считываем из RTC текущие дату и время
  RTC_WaitForSynchro();
  RTC_GetDate(RTC_Format_BIN, &RTC_Date);//Дату считываем дважды - мудак делал RTC
  RTC_WaitForSynchro();
  RTC_GetDate(RTC_Format_BIN, &RTC_Date);
  RTC_WaitForSynchro();
  RTC_GetTime(RTC_Format_BIN, &RTC_Time);//Считываем время

Это слегка перебор, но, зато, точно работает.

 

Есть и другие ошибки в библиотечных функциях. Нужно проверять все по прописи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел на гугле пример правильной установки даты и времени

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd( ENABLE );

RTC_SetTime( RTC_Format_BIN, &ts );
RTC_SetDate( RTC_Format_BIN, &ds );
RTC_WriteBackupRegister(RTC_BKP_DR1, 0xA5A5);
PWR_BackupAccessCmd( DISABLE );

С ним все заработало

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...