|
|
  |
STM32F2x, Часики |
|
|
|
Feb 10 2013, 14:35
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 10 2013, 15:16
|
Местный
  
Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127

|
Цитата(Golikov A. @ Feb 10 2013, 18:41)  может проблема в дебагере? кеил, например, не умет корректно отображать переменные которые не лежать на момент отображения в регистрах... Не отпадает. В сотках действительно так было, а здесь все наоборот. Да и программа читает их и в буфер сует, а потом еще через веб сервер в писишку отправляет. Причем время иногда устанавливается а дата никак. Задержки пробывал ставить. Всякие там библиотечные цыклы синхронизации тоже. Еще сталкнулся с тем, что регистры RTC почему то не защищаются от записи. Пишу в любое время в льбой BKP, хотя протект включен, да библиотечные функции при выходе протект с понтом дела включают.
Сообщение отредактировал vlad_new - Feb 10 2013, 15:23
|
|
|
|
|
Feb 11 2013, 09:47
|

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

|
У меня прекрасно работают Код RTC_SetDate( RTC_Format_BIN, &RTC_DateStructure ); RTC_SetTime( RTC_Format_BIN, &RTC_TimeStructure ); Но я использую "RTC_Format_BIN"
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Feb 11 2013, 12:39
|
Местный
  
Группа: Участник
Сообщений: 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 Вот блин, не люблю я такие непонятки.
|
|
|
|
|
Apr 25 2013, 20:54
|
Частый гость
 
Группа: Участник
Сообщений: 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 так и не дожидаемся. Функции чтения даты и времени работают нормально, на экран часто выводится и дата и время. Но вот назначить новое не получается. Что не так?
|
|
|
|
|
Apr 26 2013, 02:55
|
Знающий
   
Группа: Свой
Сообщений: 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
Ну и далее по прописи.
|
|
|
|
|
Apr 26 2013, 07:10
|
Частый гость
 
Группа: Участник
Сообщений: 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] - для короткого!!!
|
|
|
|
|
Apr 26 2013, 20:19
|
Знающий
   
Группа: Свой
Сообщений: 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);//Считываем время
Это слегка перебор, но, зато, точно работает. Есть и другие ошибки в библиотечных функциях. Нужно проверять все по прописи.
|
|
|
|
|
Apr 28 2013, 21:45
|
Частый гость
 
Группа: Участник
Сообщений: 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 ); С ним все заработало
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|