Jump to content

    
Sign in to follow this  
jenya7

Инициализация RTC.

Recommended Posts

да спасибо. работает макрос. правда есть сдвиг секунд 20. даже если вставить после всей инициализации перед while(1).

Share this post


Link to post
Share on other sites

Всё равно кое-какие телодвижения делать придётся...

У меня STM32F205 и stm32f2xx_stdperiph_lib.v1.1.0

Я делаю так (понавыдирал куски кода из проекта, немного подправил, удалил, что не касается темы...):

 

В *.h-файле с описаниями данных описываю структуру с калибровочными константами прибора


#pragma pack( 4 )
typedef struct
{ char                    b_date[sizeof( __DATE__ )];             // r_const.build_dt.b_date[];"Apr 23 2011"
 char                    b_time[sizeof( __TIME__ )];             // r_const.build_dt.b_time[];"14:18:40"
} BUILD_VER;

typedef struct
{ BUILD_VER               build_dt;                               // r_const.build_dt;     - Дата и время компиляции будет вместо версии ПО
 unsigned long           Firm_number;                            // r_const.Firm_number;  - Заводской номер прибора
//... далее калибровочные константы прибора

} ATM_Constant;
#pragma pack()                                                    // выравнивание по умолчанию

 

В *.h-файле, где инициализирую данные:

#if defined( MAIN_FILE )                // объявлена в файле, где функция main(), т.е. в этом файле инициализируем, а в остальных extern
const ATM_Constant r_const =
{ { __DATE__,                                                   // r_const.build_dt.b_date[];"Apr 23 2011"
    __TIME__                                                    // r_const.build_dt.b_time[];"14:18:40"
  },
  FIRST_RUN,                                                    // r_const.Firm_number;                 - заводской номер прибора
};
#else   // MAIN_FILE
extern const ATM_Constant r_const;
#endif  // MAIN_FILE

 

В сишном файле делаю функции...

/* --- mon_num() ------------------------------------------------------------------------------------------ **
*  Возвращает номер месяца (1..12) из строки r_const.build_dt.b_date[sizeof( __DATE__ )]; // "Apr 23 2011"
*  При ошибке в текстовой строке r_const.build_dt.b_date[sizeof( __DATE__ )] (если не нашли название месяца)
*  - возвращает 0.
* -------------------------------------------------------------------------------------------------------- */
static uint8_t mon_num( void )
{
#define MON_LEN   3                                               // длина строки имени месяца
#define MON_CNT   ( sizeof( build_date_mon ) / sizeof( const char * ) - 1 )  // последний элемент массива
static const char * const build_date_mon[] =
{ "",
 "Jan",
 "Feb",
 "Mar",
 "Apr",
 "May",
 "Jun",
 "Jul",
 "Aug",
 "Sep",
 "Oct",
 "Nov",
 "Dec"
};
int a, b;

 for ( a = MON_CNT; a != 0; a-- )
 { for ( b = 0; b < MON_LEN; b++ )
     if ( build_date_mon[a][b] != r_const.build_dt.b_date[b] )
       break;
   if ( b == MON_LEN )
     break;
 }
 return( a );
#undef MON_LEN
#undef MON_CNT
}

/* --- rtc_build_date_time_2_struct() --------------------------------------------------------------------- **
*  Время создания прошивки в структуры для часов
*    r_const.build_dt.b_date[sizeof( __DATE__ )];         // "Apr 23 2011" или "Oct  2 2012"
*    r_const.build_dt.b_time[sizeof( __TIME__ )];         // "14:18:40"
*  При правильном преобразовании  - возвращает 1.
*  При ошибке в текстовых строках - возвращает 0.
* -------------------------------------------------------------------------------------------------------- */
int rtc_build_date_time_2_struct( RTC_DateTypeDef *dat, RTC_TimeTypeDef *tim )
{
#define D_POS   4
#define Y_POS   9
#define H_POS   0
#define M_POS   3
#define S_POS   6

 if (( dat->RTC_Month = mon_num()) == 0 )
   return( 0 );                                                  // неверная текстовая строка в константах
 dat->RTC_Date    = ( r_const.build_dt.b_date[D_POS + 1] - '0' );
 if ( r_const.build_dt.b_date[D_POS] != ' ' )
   dat->RTC_Date += ( r_const.build_dt.b_date[D_POS] - '0' ) * 10;
 if ( dat->RTC_Date < 1 || dat->RTC_Date > 31 )                  // Число от 1 до 31
   return( 0 );                                                  // неверная текстовая строка в константах
 if ( r_const.build_dt.b_date[Y_POS - 2] != '2' )                // Год должен быть 2ххх
   return( 0 );                                                  // неверная текстовая строка в константах
 dat->RTC_Year    = ( r_const.build_dt.b_date[Y_POS] - '0' ) * 10 + ( r_const.build_dt.b_date[Y_POS + 1] - '0' );
 tim->RTC_Hours   = ( r_const.build_dt.b_time[H_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[H_POS + 1] - '0' );
 tim->RTC_Minutes = ( r_const.build_dt.b_time[M_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[M_POS + 1] - '0' );
 tim->RTC_Seconds = ( r_const.build_dt.b_time[s_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[s_POS + 1] - '0' );
 if ( tim->RTC_Hours > 23 || tim->RTC_Minutes > 59 || tim->RTC_Seconds > 59 )  // Часы от 0 до 23,  Минуты от 0 до 59, секунды от 0 до 59
   return( 0 );                                                  // неверная текстовая строка в константах
 return( 1 );                                                    // Всё ОК
#undef D_POS
#undef Y_POS
#undef H_POS
#undef M_POS
#undef S_POS
}

Где-то так...

 

Share this post


Link to post
Share on other sites
Всё равно кое-какие телодвижения делать придётся...

У меня STM32F205 и stm32f2xx_stdperiph_lib.v1.1.0

Я делаю так (понавыдирал куски кода из проекта, немного подправил, удалил, что не касается темы...):

 

В *.h-файле с описаниями данных описываю структуру с калибровочными константами прибора


#pragma pack( 4 )
typedef struct
{ char                    b_date[sizeof( __DATE__ )];             // r_const.build_dt.b_date[];"Apr 23 2011"
 char                    b_time[sizeof( __TIME__ )];             // r_const.build_dt.b_time[];"14:18:40"
} BUILD_VER;

typedef struct
{ BUILD_VER               build_dt;                               // r_const.build_dt;     - Дата и время компиляции будет вместо версии ПО
 unsigned long           Firm_number;                            // r_const.Firm_number;  - Заводской номер прибора
//... далее калибровочные константы прибора

} ATM_Constant;
#pragma pack()                                                    // выравнивание по умолчанию

 

В *.h-файле, где инициализирую данные:

#if defined( MAIN_FILE )                // объявлена в файле, где функция main(), т.е. в этом файле инициализируем, а в остальных extern
const ATM_Constant r_const =
{ { __DATE__,                                                   // r_const.build_dt.b_date[];"Apr 23 2011"
    __TIME__                                                    // r_const.build_dt.b_time[];"14:18:40"
  },
  FIRST_RUN,                                                    // r_const.Firm_number;                 - заводской номер прибора
};
#else   // MAIN_FILE
extern const ATM_Constant r_const;
#endif  // MAIN_FILE

 

В сишном файле делаю функции...

/* --- mon_num() ------------------------------------------------------------------------------------------ **
*  Возвращает номер месяца (1..12) из строки r_const.build_dt.b_date[sizeof( __DATE__ )]; // "Apr 23 2011"
*  При ошибке в текстовой строке r_const.build_dt.b_date[sizeof( __DATE__ )] (если не нашли название месяца)
*  - возвращает 0.
* -------------------------------------------------------------------------------------------------------- */
static uint8_t mon_num( void )
{
#define MON_LEN   3                                               // длина строки имени месяца
#define MON_CNT   ( sizeof( build_date_mon ) / sizeof( const char * ) - 1 )  // последний элемент массива
static const char * const build_date_mon[] =
{ "",
 "Jan",
 "Feb",
 "Mar",
 "Apr",
 "May",
 "Jun",
 "Jul",
 "Aug",
 "Sep",
 "Oct",
 "Nov",
 "Dec"
};
int a, b;

 for ( a = MON_CNT; a != 0; a-- )
 { for ( b = 0; b < MON_LEN; b++ )
     if ( build_date_mon[a][b] != r_const.build_dt.b_date[b] )
       break;
   if ( b == MON_LEN )
     break;
 }
 return( a );
#undef MON_LEN
#undef MON_CNT
}

/* --- rtc_build_date_time_2_struct() --------------------------------------------------------------------- **
*  Время создания прошивки в структуры для часов
*    r_const.build_dt.b_date[sizeof( __DATE__ )];         // "Apr 23 2011" или "Oct  2 2012"
*    r_const.build_dt.b_time[sizeof( __TIME__ )];         // "14:18:40"
*  При правильном преобразовании  - возвращает 1.
*  При ошибке в текстовых строках - возвращает 0.
* -------------------------------------------------------------------------------------------------------- */
int rtc_build_date_time_2_struct( RTC_DateTypeDef *dat, RTC_TimeTypeDef *tim )
{
#define D_POS   4
#define Y_POS   9
#define H_POS   0
#define M_POS   3
#define S_POS   6

 if (( dat->RTC_Month = mon_num()) == 0 )
   return( 0 );                                                  // неверная текстовая строка в константах
 dat->RTC_Date    = ( r_const.build_dt.b_date[D_POS + 1] - '0' );
 if ( r_const.build_dt.b_date[D_POS] != ' ' )
   dat->RTC_Date += ( r_const.build_dt.b_date[D_POS] - '0' ) * 10;
 if ( dat->RTC_Date < 1 || dat->RTC_Date > 31 )                  // Число от 1 до 31
   return( 0 );                                                  // неверная текстовая строка в константах
 if ( r_const.build_dt.b_date[Y_POS - 2] != '2' )                // Год должен быть 2ххх
   return( 0 );                                                  // неверная текстовая строка в константах
 dat->RTC_Year    = ( r_const.build_dt.b_date[Y_POS] - '0' ) * 10 + ( r_const.build_dt.b_date[Y_POS + 1] - '0' );
 tim->RTC_Hours   = ( r_const.build_dt.b_time[H_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[H_POS + 1] - '0' );
 tim->RTC_Minutes = ( r_const.build_dt.b_time[M_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[M_POS + 1] - '0' );
 tim->RTC_Seconds = ( r_const.build_dt.b_time[s_POS] - '0' ) * 10 + ( r_const.build_dt.b_time[s_POS + 1] - '0' );
 if ( tim->RTC_Hours > 23 || tim->RTC_Minutes > 59 || tim->RTC_Seconds > 59 )  // Часы от 0 до 23,  Минуты от 0 до 59, секунды от 0 до 59
   return( 0 );                                                  // неверная текстовая строка в константах
 return( 1 );                                                    // Всё ОК
#undef D_POS
#undef Y_POS
#undef H_POS
#undef M_POS
#undef S_POS
}

Где-то так...

спасибо.интересно. а то я сделал по тупому.

void TimeInit(void)
{
    
    char time[] =  __TIME__;
    //char date[] = __DATE__;

    char *sec="";
    char *min="";
    char *hour="";

    hour = strtok(time,":");
    min = strtok (NULL, ":");
    sec = strtok (NULL, ":");

    rtc.rtcSec = atoi(sec);
    rtc.rtcMin = atoi(min);
    rtc.rtcHour = atoi(hour);
}

Share this post


Link to post
Share on other sites

а интересно день недели можно откуда нибудь вытащить?

 

а интересно день недели можно откуда нибудь вытащить?

 

uint8_t dayOfWeek(uint8_t day, uint8_t month, uint16_t year)
{
     // returns 0 for monday thru 6 for sunday.
   
    if( month < 3 ){
        month += 12;
        year--;
   }
   return ( ( 13 * month + 3 ) / 5 + day + year + ( year / 4 ) - ( year / 100 ) + ( year / 400 ) ) % 7;
}

Edited by Jenya7

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this