реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Инициализация RTC.
Jenya7
сообщение Nov 19 2015, 09:49
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



я хочу при компиляции автоматически подставить текущее время в структуру RTC. как это можно сделать?
Go to the top of the page
 
+Quote Post
insane_person
сообщение Nov 19 2015, 10:11
Сообщение #2





Группа: Участник
Сообщений: 6
Регистрация: 20-04-13
Пользователь №: 76 551



Цитата(Jenya7 @ Nov 19 2015, 12:49) *
я хочу при компиляции автоматически подставить текущее время в структуру RTC. как это можно сделать?

https://gcc.gnu.org/onlinedocs/cpp/Standard...ned-Macros.html
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 19 2015, 11:43
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

да спасибо. работает макрос. правда есть сдвиг секунд 20. даже если вставить после всей инициализации перед while(1).
Go to the top of the page
 
+Quote Post
VAI
сообщение Nov 19 2015, 12:14
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Цитата(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
}

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


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 19 2015, 12:26
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(VAI @ Nov 19 2015, 18:14) *
Всё равно кое-какие телодвижения делать придётся...
У меня 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
}

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

спасибо.интересно. а то я сделал по тупому.
Код
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);
}
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 19 2015, 14:55
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

Цитата(Jenya7 @ Nov 19 2015, 19:59) *
а интересно день недели можно откуда нибудь вытащить?


Код
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 - Nov 19 2015, 14:57
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016