[STM32]내부RTC Get/Set 동작
2021. 11. 9. 23:54ㆍ코딩/STM32
#include "main.h"
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
extern RTC_HandleTypeDef hrtc;
// ex) 21
// high nibble low nibble
// 0010 0001
// *10 *1
// 20 + 1
// 21
uint8_t B2D(unsigned char byte)
{
unsigned char high, low;
low = byte & 0x0f; // low nibble
high = ((byte >> 4) & 0x0f) * 10; // high nibble
return high + low;
}
uint8_t D2B(unsigned char byte) // Binary to Decimal
{
return ( ((byte / 10) << 4) + (byte % 10) );
}
//1
//012345678901234567
//setrtc211019151000
void SetRTCTume(char *date_time)
{
char yy[4], mm[4], dd[4];
char hh[4], min[4], ss[4];
strncpy(yy, date_time+6, 2);
strncpy(mm, date_time+8, 2);
strncpy(dd, date_time+10, 2);
strncpy(hh, date_time+12, 2);
strncpy(min, date_time+14, 2);
strncpy(ss, date_time+16, 2);
sDate.Year = D2B(atoi(yy));
sDate.Month = D2B(atoi(mm));
sDate.Date = D2B(atoi(dd));
sTime.Hours = D2B(atoi(hh));
sTime.Minutes = D2B(atoi(min));
sTime.Seconds = D2B(atoi(ss));
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD);
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD);
}
char GetRTCTime(void)
{
static RTC_TimeTypeDef oldTime;
char lcd_buff[40];
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BCD);
HAL_RTC_GetDate(&hrtc,& sDate, RTC_FORMAT_BCD);
if(oldTime.Seconds != sTime.Seconds)
{
// YYYY-MM-DD HH:mm:SS (format)
sprintf(lcd_buff,"%04d-%02d-%02d", B2D(sDate.Year)+2000, B2D(sDate.Month), B2D(sDate.Date));
lcd_string_xy(0, 0, lcd_buff);
sprintf(lcd_buff,"%02d:%02d:%02d", B2D(sTime.Hours), B2D(sTime.Minutes), B2D(sTime.Seconds));
lcd_string_xy(1, 0, lcd_buff);
}
oldTime.Seconds = sTime.Seconds;
}
void pc_command_processing()
{
if(command_count) // command_buffer에 message가 있으면
{
command_count--;
rx_cmd_flag = 0;
printf("pc : %s\n", command_buffer[read_index]); // command_buffer[read_index][0]
if(!strncmp((const char *)command_buffer[read_index], "led2on", strlen("led2on")-1))
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}
if(!strncmp((const char *)command_buffer[read_index], "led2off", strlen("led2off")-1))
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}
if(!strncmp((const char *)command_buffer[read_index], "setrtc", strlen("setrtc")-1))
{
SetRTCTume(command_buffer);
}
memset(command_buffer[read_index], 0, COMMAND_LENGTH);
read_index++;
read_index %= COMMAND_MAX; // 다음 읽을 pointer를 계산
}
}
'코딩 > STM32' 카테고리의 다른 글
[STM32] 자동급수화분 동영상 (0) | 2021.12.02 |
---|---|
[STM32] Elevator project 동작 동영상 (0) | 2021.11.09 |
[STM32] Stepmotor FOR/BACKWARD/STOP+PC command (0) | 2021.11.09 |
[STM32] photo coupler LED 점등 (0) | 2021.11.09 |
[STM32] 8cm 초음파 센서 줄자 / 온도계 (0) | 2021.11.09 |