-
Notifications
You must be signed in to change notification settings - Fork 28
Description
使用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);
}`