Skip to content

RTC在计数器换算年月日时出现了问题 #8

@santook

Description

@santook

使用HAL库操作RTC时,写入Year 为23时,结果为5。加入设置时间为23/07/14 23:59:00,则一分钟后,通过HAL_RTC_GetDate和HAL_RTC_GetTime得到的结果是:
5/7/14 23:59:56
5/7/14 23:59:57
5/7/14 23:59:58
5/7/14 23:59:59
6/7/15 0:0:0
6/7/15 0:0:1
6/7/15 0:0:2
6/7/15 0:0:3

库代码如下:
`#pragma once

class RealTimeClock
{
public:
enum RTC_CLOCK_SOURCE
{
LSI,
LSE
};

/*
初始化RTC外设
clksource - RTC时钟源
*/
bool begin(RTC_CLOCK_SOURCE clksource)
{
	bool ret = false;

	RCC_OscInitTypeDef        RCC_OscInitStruct;
	RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;

	if (clksource == LSE)
	{
		RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
		RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
		RCC_OscInitStruct.LSEState = RCC_LSE_ON;
		RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
		if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
		{
		}

		PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
		PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
		if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
		{
		}
	}

	if (clksource == LSI)
	{
		/* LSI作为时钟源相关配置 */
		RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
		RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
		RCC_OscInitStruct.LSIState = RCC_LSI_ON;
		RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
		if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
		{
		}

		/* RTC时钟选择为LSI */
		PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
		PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
		if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
		{
		}
	}

	/*使能RTC外设时钟*/
	__HAL_RCC_RTCAPB_CLK_ENABLE();
	/* 使能RTC模块*/
	__HAL_RCC_RTC_ENABLE();

	/*使能RTC中断*/
	HAL_NVIC_SetPriority(RTC_IRQn, 0, 0);
	NVIC_EnableIRQ(RTC_IRQn);
	/*使能秒中断和闹钟中断*/
	__HAL_RTC_OVERFLOW_ENABLE_IT(&rtc_handle, RTC_IT_OW);
	__HAL_RTC_SECOND_ENABLE_IT(&rtc_handle, RTC_IT_SEC);


	/*初始化RTC*/
	rtc_handle.Instance = RTC;
	rtc_handle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
	if (HAL_RTC_Init(&rtc_handle) == HAL_OK)
	{
		ret = true;
	}
	return ret;
}

/*
设置日期
*/
bool setdate(uint16_t Year, uint8_t Month, uint8_t Day)
{
	RTC_DateTypeDef sd;
	bool ret = false;
	sd.Year =Year;
	sd.Month = Month;
	sd.Date = Day;
	sd.WeekDay = 0;
	
	if (HAL_RTC_SetDate(&rtc_handle, &sd, RTC_FORMAT_BIN) == HAL_OK)
	{
		ret = true;
	}
	return ret;
}

/*设置时间*/
bool settime(uint8_t Hour, uint8_t Minute, uint8_t Second)
{
	RTC_TimeTypeDef st;
	bool ret = false;
	st.Hours = Hour;
	st.Minutes = Minute;
	st.Seconds = Second;
	if (HAL_RTC_SetTime(&rtc_handle, &st, RTC_FORMAT_BIN) == HAL_OK)
	{
		ret = true;
	}
	return ret;
}


/*同步读取RTC时间*/
void syncdatetime()
{
	RTC_DateTypeDef sd;
	RTC_TimeTypeDef st;

	HAL_RTC_GetDate(&rtc_handle, &sd, RTC_FORMAT_BIN);
	HAL_RTC_GetTime(&rtc_handle, &st, RTC_FORMAT_BIN);
	
	datetime[0] = sd.Year;
	datetime[1] = sd.Month;
	datetime[2] = sd.Date;
	datetime[3] = st.Hours;
	datetime[4] = st.Minutes;
	datetime[5] = st.Seconds;
	datetime[0] = sd.WeekDay;
}

/*年*/
uint16_t Year()
{
	return datetime[0];
}

/*月*/
uint8_t Month()
{
	return datetime[1];
}

/*日*/
uint8_t Day()
{
	return datetime[2];
}

/*星期*/
uint8_t Weekday()
{
	return datetime[6];
}

/*时*/
uint8_t Hour()
{
	return datetime[3];
}

/*分*/
uint8_t Minute()
{
	return datetime[4];
}

/*秒*/
uint8_t Second()
{
	return datetime[5];
}

/*读取时间*/
uint8_t operator[](uint8_t index)
{
	return datetime[index<8?index:0];
}

private:
RTC_HandleTypeDef rtc_handle;
uint8_t datetime[7];
};
`

主代码如下:
`#include "RealTimeClock.h"

RealTimeClock myrtc;
HardwareSerial com0(PA3, PA2);

void setup() {
pinMode(PB0, OUTPUT);
com0.begin(115200);
if (!myrtc.begin(myrtc.LSI))
{
com0.println("RTC fail!");
}
else
{
myrtc.setdate(23,07,14);
myrtc.settime(23,59,00);
}

}

void loop() {
myrtc.syncdatetime();
com0.printf("%d/%d/%d %d:%d:%d", myrtc[0], myrtc[1], myrtc[2], myrtc[3],myrtc[4], myrtc[5]);
delay(1000);
}`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions