Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32 проблемы с RTC
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Nikitoc
Прошу помощи уважаемого сообщества. Не могу понять, где я допустил ошибку. При считывании года из часов получаю левые данные. Остальные параметры корректны и соответствуют установленным.


Вот код инициализации часов:

Код
void RtcInit (void) {
</p>        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        /* Allow access to RTC */
        PWR_RTCAccessCmd(ENABLE);
        /* Reset Backup Domain */
        RCC_RTCResetCmd(ENABLE);
        RCC_RTCResetCmd(DISABLE);
         /* LSE Enable */
        RCC_LSEConfig(RCC_LSE_ON);
         /*Wait till LSE is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
        {}
         /* LCD Clock Source Selection */
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
        /* Enable the RTC Clock */
        RCC_RTCCLKCmd(ENABLE);
        /* Wait for RTC APB registers synchronisation */
        RTC_WaitForSynchro();                                /* Wait until last write operation on RTC registers has finished */
  
<p>   }


Установка времени:

Код
void DateSetup(DWORD TimeDate) {
</p>       RTC_InitTypeDef   RTC_InitStructure;
      RTC_TimeTypeDef   RTC_TimeStructure;
      RTC_DateTypeDef   RTC_DateStructure;
  
RTC_TimeStructure.RTC_Hours   = 12;
RTC_TimeStructure.RTC_Minutes = 10;
RTC_TimeStructure.RTC_Seconds = 0;
      
        /* Set the Date */
RTC_DateStructure.RTC_Month = 6;
RTC_DateStructure.RTC_Date =  22;
RTC_DateStructure.RTC_Year =  11;
  
        /* Calender Configuartion */
        RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
        RTC_InitStructure.RTC_SynchPrediv    =  0xFF;
        RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
        RTC_Init(&amp;RTC_InitStructure);
  
        RTC_SetTime(RTC_Format_BIN, &amp;RTC_TimeStructure);
        RTC_SetDate(RTC_Format_BIN, &amp;RTC_DateStructure);
<p>   }


Считывание времени:

Код
DWORD GetSystemTime (void) {
</p>  DWORD time = 0;
      DWORD sec = 0;
      DWORD min = 0;
      DWORD hour = 0;
      DWORD day = 0;
      DWORD month = 0;
      DWORD year = 0;
      RTC_DateTypeDef   RTC_DateStructure;
      RTC_TimeTypeDef   RTC_TimeStructure;
  
      RTC_GetDate(RTC_Format_BIN, &amp;RTC_DateStructure);        // Get the current Date
      RTC_GetTime(RTC_Format_BIN, &amp;RTC_TimeStructure);        // Get the current Time
                                                  
year =  ((BYTE)RTC_DateStructure.RTC_Year);&nbsp;
month = ((BYTE) RTC_DateStructure.RTC_Month);&nbsp;
day =   ((BYTE)RTC_DateStructure.RTC_Date);&nbsp;
hour =  ((BYTE)RTC_TimeStructure.RTC_Hours);&nbsp;
min =   ((BYTE)RTC_TimeStructure.RTC_Minutes);&nbsp;
sec =   ((BYTE)RTC_TimeStructure.RTC_Seconds);
<p>   }


И вот здесь-то при считывании я и получаю некорректное значение <strong>year.</strong>Заранее благодарен за любые советы.


andrewlekar
Структуру RTC_DateTypeDef покажите.
Nikitoc
Цитата(andrewlekar @ Jun 24 2011, 07:53) *
Структуру RTC_DateTypeDef покажите.

Код
typedef struct
{
  uint32_t RTC_WeekDay; /*!< Specifies the RTC Date WeekDay.
                        This parameter can be a value of @ref RTC_WeekDay_Definitions */
  
  uint32_t RTC_Month;   /*!< Specifies the RTC Date Month.
                        This parameter can be a value of @ref RTC_Month_Date_Definitions */

  uint8_t RTC_Date;     /*!< Specifies the RTC Date.
                        This parameter must be set to a value in the 1-31 range. */
  
  uint8_t RTC_Year;     /*!< Specifies the RTC Date Year.
                        This parameter must be set to a value in the 0-99 range. */
}RTC_DateTypeDef;
demiurg_spb
Вы какой-либо библиотекой для чтения rtc пользуетесь?
Moжет проблема с выравниванием полей структуры?
Попробуйте задать принудительно через #pragma pack или attribute(packed).
Или сделайте все поля структуры типом int.
andrewlekar
Как-то удивляет, что RTC_Month имеет тип uint32_t. Там, наверное, хранится не только номер месяца, но и что-то еще. Проблема с выравниванием тоже может быть, если RTC_GetDate обращается к структуре как к массиву байт.
AHTOXA
Я не знаю, что у вас за библиотека, но в unixtime, например, год отсчитывается от 1970. Попробуйте задать не
RTC_DateStructure.RTC_Year = 11;
а
RTC_DateStructure.RTC_Year = 41;
Nikitoc
Гхм. Спасибо всем за советы и участие (отдельное - andrewlekar). Когда сделал все поля uint_8 - все заработало. Даже не хочу докапываться почему, т.к. в дебрях этих библиотек сам черт ногу сломит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.