Jump to content

    

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

я хочу при компиляции автоматически подставить текущее время в структуру RTC. как это можно сделать?

 

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this