[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를 계산
	}
}