jenya7 0 19 ноября, 2015 Опубликовано 19 ноября, 2015 · Жалоба я хочу при компиляции автоматически подставить текущее время в структуру RTC. как это можно сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
insane_person 0 19 ноября, 2015 Опубликовано 19 ноября, 2015 · Жалоба я хочу при компиляции автоматически подставить текущее время в структуру RTC. как это можно сделать? https://gcc.gnu.org/onlinedocs/cpp/Standard...ned-Macros.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 ноября, 2015 Опубликовано 19 ноября, 2015 · Жалоба https://gcc.gnu.org/onlinedocs/cpp/Standard...ned-Macros.html да спасибо. работает макрос. правда есть сдвиг секунд 20. даже если вставить после всей инициализации перед while(1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 19 ноября, 2015 Опубликовано 19 ноября, 2015 · Жалоба https://gcc.gnu.org/onlinedocs/cpp/Standard...ned-Macros.html Всё равно кое-какие телодвижения делать придётся... У меня 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 } Где-то так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 ноября, 2015 Опубликовано 19 ноября, 2015 · Жалоба Всё равно кое-какие телодвижения делать придётся... У меня 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 ноября, 2015 Опубликовано 19 ноября, 2015 (изменено) · Жалоба а интересно день недели можно откуда нибудь вытащить? а интересно день недели можно откуда нибудь вытащить? 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; } Изменено 19 ноября, 2015 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться