BASIC4MCU | 질문게시판 | stm32 보드에서 시간설정과 불러오기를 하는데
페이지 정보
작성자 라칸 작성일2023-09-22 10:09 조회3,829회 댓글5건본문
uint32_t gettime(){
RTC_TimeTypeDef gTime;
RTC_DateTypeDef gDate;
struct tm get_timeinfo;
time_t get_Timestamp;
// STM32의 RTC에서 현재 로컬 시간 및 날짜 정보를 가져옵니다.
HAL_RTC_GetTime(&hrtc, &gTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &gDate, RTC_FORMAT_BIN); // 날짜를 가져오지 않으면 시간 정보가 업데이트되지 않습니다.
// struct tm 형식으로 변환
get_timeinfo.tm_hour = gTime.Hours - 9; // UTC로 변환
get_timeinfo.tm_min = gTime.Minutes;
get_timeinfo.tm_sec = gTime.Seconds;
get_timeinfo.tm_mday = gDate.Date;
get_timeinfo.tm_mon = gDate.Month - 1; // tm_mon은 0부터 시작
get_timeinfo.tm_year = gDate.Year + 100; // 1900을 기준으로 함
// UNIX 타임스탬프로 변환
get_Timestamp = mktime(&get_timeinfo);
return get_Timestamp;
}
time_t Timestamp;
Timestamp = gettime();
uint8_t *data_ptr = &body_q[1];
for (int i = 1; i <= 4; i++) {
body_q[i] = (Timestamp >> (8 * (4 - i))) & 0xFF;
}
--------------------
void settime(uint8_t time_check[]){
// UNIX 타임스탬프 정보를 가져옵니다.
uint32_t set_Timestamp = 0;
for (int check = 0; check < 4; check++) {
set_Timestamp = (set_Timestamp << 8) | time_check[check];
}
// UNIX 타임스탬프를 RTC 시간/날짜 형식으로 변환합니다.
struct tm set_timeinfo;
time_t rawtime = (time_t) set_Timestamp;
localtime_r(&rawtime, &set_timeinfo);
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
// 한국 시간에 맞춰 조정
set_timeinfo.tm_hour += 9;
sTime.Hours = set_timeinfo.tm_hour;
sTime.Minutes = set_timeinfo.tm_min;
sTime.Seconds = set_timeinfo.tm_sec;
sDate.Date = set_timeinfo.tm_mday;
sDate.Month = set_timeinfo.tm_mon + 1; // tm_mon은 0부터 시작하므로 1을 더함.
sDate.Year = set_timeinfo.tm_year - 100;
// 시간 및 날짜 설정
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}
for(int k = 0; k < 4; k++){
time_check[k] = body_q[k + 1];
}
settime(time_check);
---------------
위 함수로 시간을 설정, 불러오기 하는데
설정한값하고 불러오는값이 너무 다르더라고요
{64}{A7}{86}{A1} 값을 {AF}{61}{05}{23}으로 불러오는데
설정을 할때 set_Timestamp에 까지 64 A7 86 A1값이 제대로 가서 64A786A1이 나오는걸 확인했는데 저러더라고요
심지어 setime함수 대신 코드를 그대로 삽입하면 또 다른값이 나오고요
-------
(ex)
for(int k = 0; k < 4; k++){
time_check[k] = body_q[k + 1];
}
uint32_t set_Timestamp = 0;
for (int check = 0; check < 4; check++) {
set_Timestamp = (set_Timestamp << 8) | time_check[check];
}
// UNIX 타임스탬프를 RTC 시간/날짜 형식으로 변환합니다.
struct tm set_timeinfo;
time_t rawtime = (time_t) set_Timestamp;
localtime_r(&rawtime, &set_timeinfo);
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
// 한국 시간에 맞춰 조정
set_timeinfo.tm_hour += 9;
sTime.Hours = set_timeinfo.tm_hour;
sTime.Minutes = set_timeinfo.tm_min;
sTime.Seconds = set_timeinfo.tm_sec;
sDate.Date = set_timeinfo.tm_mday;
sDate.Month = set_timeinfo.tm_mon + 1; // tm_mon은 0부터 시작하므로 1을 더함.
sDate.Year = set_timeinfo.tm_year - 100;
// 시간 및 날짜 설정
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
------------
이거 문제를 어떻게 해결해야하니요?
원래 다른사람이 된다는 코드를 그대로 가져와서 쓰는건데 잘되다가 안되다가 이러네요
댓글 5
조회수 3,829master님의 댓글
master 작성일
struct tm set_timeinfo;
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
RTC_TimeTypeDef gTime;
RTC_DateTypeDef gDate;
struct tm get_timeinfo;
time_t get_Timestamp;
이런 변수 선언을 전역변수로 선언하면 편하지 않을까요?
라칸님의 댓글
라칸 작성일얘네는 나중에 빼더라도 지금 시간 설정한게 다르게 나오는게 문제여서 ㅡ.ㅡ
master님의 댓글
master 작성일설정한 후 읽어오는 부분이 어디인가요?
라칸님의 댓글
라칸 작성일
time_t Timestamp;
Timestamp = gettime();
uint8_t *data_ptr = &body_q[1];
for (int i = 1; i <= 4; i++) {
body_q[i] = (Timestamp >> (8 * (4 - i))) & 0xFF;
}
설정후에 여기로 가서 gettime하면서 body_q에 저장하고 이를 확인하고는 있습니다
그런데 설정할때 64 A7 86 A1으로 보냈는데 불러오기하면 전혀 다른값들이 나오고 있습니다
switch (q[0]){
case 1:
time_t Timestamp;
Timestamp = gettime();
uint8_t *data_ptr = &body_q[1];
for (int i = 1; i <= 4; i++) {
body_q[i] = (Timestamp >> (8 * (4 - i))) & 0xFF;
}
break;
case 2:
memset(time_check, 0x0, sizeof(time_check));
for(int k = 0; k < 4; k++){
time_check[k] = body_q[k + 1];
}
settime(time_check);
break;
}
master님의 댓글
master 작성일가장빠른 방법은 오류없는 예제를 구해서 돌려보는 것입니다.