реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F2x, Часики
vlad_new
сообщение Feb 10 2013, 14:35
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Часики не устанавливаются. Инициализация вроде в норме. Часы тикают и читаются, но не записываются.
Записываются если только в отладчике 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 10 2013, 14:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



может проблема в дебагере?
кеил, например, не умет корректно отображать переменные которые не лежать на момент отображения в регистрах...
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Feb 10 2013, 15:16
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Цитата(Golikov A. @ Feb 10 2013, 18:41) *
может проблема в дебагере?
кеил, например, не умет корректно отображать переменные которые не лежать на момент отображения в регистрах...

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

Сообщение отредактировал vlad_new - Feb 10 2013, 15:23
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Feb 10 2013, 21:09
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Вообщем танцы с бубном показали, что в счетчик даты нихрена новое значение не переписывается из какого то там их временного внутреннего регистра пока не прочитаеш счетчик времени. Даты шыты все облазел и по этому поводу ни гу гу, еррата то же помалкивает. Все что нашел это то что зачение из этого таинственного временного регистра перепишится в счетчик само по себе через 4 такта шыны. А вот хрен. Оказывается его еще и прочитать надо. Может есть что то еще чего я не допонял, но на то он и бубен с плясками. sm.gif
Go to the top of the page
 
+Quote Post
VAI
сообщение Feb 11 2013, 09:47
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



У меня прекрасно работают
Код
  RTC_SetDate( RTC_Format_BIN, &RTC_DateStructure );
    RTC_SetTime( RTC_Format_BIN, &RTC_TimeStructure );

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


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Feb 11 2013, 12:39
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Цитата(VAI @ Feb 11 2013, 13:47) *
У меня прекрасно работают
Но я использую "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

Вот блин, не люблю я такие непонятки.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Apr 25 2013, 20:54
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Что-то у меня ни какими средствами не удается установить дату и время. Причем, если 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 так и не дожидаемся.
Функции чтения даты и времени работают нормально, на экран часто выводится и дата и время. Но вот назначить новое не получается.
Что не так?
Go to the top of the page
 
+Quote Post
rudy_b
сообщение Apr 26 2013, 02:55
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



Этот RTC сделан весьма криво. Кроме
PWR_BackupAccessCmd( ENABLE )
перед записью в регистры RTC нужно обязательно давать пару команд снятия защиты записи в регистры
RTC->WPR = 0xCA; RTC->WPR = 0x53;

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

//Сначала разрешаем клоки периферии
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

Ну и далее по прописи.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Apr 26 2013, 07:10
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



По поводу снятия защиты, я открываю библиотеку и там
CODE
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 - Apr 26 2013, 12:41
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
rudy_b
сообщение Apr 26 2013, 20:19
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458



Цитата(vlad_new @ Feb 11 2013, 15:39) *
...Вот так работает, а наоборот нет.
Код
   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().
CODE
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);//Считываем время

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

Есть и другие ошибки в библиотечных функциях. Нужно проверять все по прописи.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Apr 28 2013, 21:45
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Нашел на гугле пример правильной установки даты и времени
Код
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 );

С ним все заработало
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 02:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016