Цитата(insane_person @ Nov 19 2015, 14:11)

Всё равно кое-какие телодвижения делать придётся...
У меня STM32F205 и stm32f2xx_stdperiph_lib.v1.1.0
Я делаю так (понавыдирал куски кода из проекта, немного подправил, удалил, что не касается темы...):
В *.h-файле с описаниями данных описываю структуру с калибровочными константами прибора
CODE
#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-файле, где инициализирую данные:
CODE
#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
В сишном файле делаю функции...
CODE
/* --- 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
}
Где-то так...