Перейти к содержанию
    

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

https://gcc.gnu.org/onlinedocs/cpp/Standard...ned-Macros.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

У меня 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
}

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

У меня 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);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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;
}

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...