vlad_new 1 10 февраля, 2013 Опубликовано 10 февраля, 2013 · Жалоба Часики не устанавливаются. Инициализация вроде в норме. Часы тикают и читаются, но не записываются. Записываются если только в отладчике 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 10 февраля, 2013 Опубликовано 10 февраля, 2013 · Жалоба может проблема в дебагере? кеил, например, не умет корректно отображать переменные которые не лежать на момент отображения в регистрах... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vlad_new 1 10 февраля, 2013 Опубликовано 10 февраля, 2013 (изменено) · Жалоба может проблема в дебагере? кеил, например, не умет корректно отображать переменные которые не лежать на момент отображения в регистрах... Не отпадает. В сотках действительно так было, а здесь все наоборот. Да и программа читает их и в буфер сует, а потом еще через веб сервер в писишку отправляет. Причем время иногда устанавливается а дата никак. Задержки пробывал ставить. Всякие там библиотечные цыклы синхронизации тоже. Еще сталкнулся с тем, что регистры RTC почему то не защищаются от записи. Пишу в любое время в льбой BKP, хотя протект включен, да библиотечные функции при выходе протект с понтом дела включают. Изменено 10 февраля, 2013 пользователем vlad_new Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vlad_new 1 10 февраля, 2013 Опубликовано 10 февраля, 2013 · Жалоба Вообщем танцы с бубном показали, что в счетчик даты нихрена новое значение не переписывается из какого то там их временного внутреннего регистра пока не прочитаеш счетчик времени. Даты шыты все облазел и по этому поводу ни гу гу, еррата то же помалкивает. Все что нашел это то что зачение из этого таинственного временного регистра перепишится в счетчик само по себе через 4 такта шыны. А вот хрен. Оказывается его еще и прочитать надо. Может есть что то еще чего я не допонял, но на то он и бубен с плясками. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 11 февраля, 2013 Опубликовано 11 февраля, 2013 · Жалоба У меня прекрасно работают RTC_SetDate( RTC_Format_BIN, &RTC_DateStructure ); RTC_SetTime( RTC_Format_BIN, &RTC_TimeStructure ); Но я использую "RTC_Format_BIN" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vlad_new 1 11 февраля, 2013 Опубликовано 11 февраля, 2013 · Жалоба У меня прекрасно работают Но я использую "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 Вот блин, не люблю я такие непонятки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 25 апреля, 2013 Опубликовано 25 апреля, 2013 · Жалоба Что-то у меня ни какими средствами не удается установить дату и время. Причем, если 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 так и не дожидаемся. Функции чтения даты и времени работают нормально, на экран часто выводится и дата и время. Но вот назначить новое не получается. Что не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rudy_b 4 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Этот 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 Ну и далее по прописи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 (изменено) · Жалоба По поводу снятия защиты, я открываю библиотеку и там 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, внутри которого и происходит ошибка. Сами часы настраиваются в функции, которая при старте ОС проверяет, настроены ли часы и, если надо, их настраивает полностью. Неужели и при назначении даты или времени надо проводить так же полную инициализацию, а не только установку даты и времени? Изменено 26 апреля, 2013 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rudy_b 4 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба ...Вот так работает, а наоборот нет. 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);//Считываем время Это слегка перебор, но, зато, точно работает. Есть и другие ошибки в библиотечных функциях. Нужно проверять все по прописи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 28 апреля, 2013 Опубликовано 28 апреля, 2013 · Жалоба Нашел на гугле пример правильной установки даты и времени 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 ); С ним все заработало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться