#include "hc32l1xx_ll_rtc.h"
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_DeInit(RTC_TypeDef *RTCx)
{
LL_PER0_GRP1_ForceReset(LL_PER0_GRP1_PERIPH_RTC);
LL_PER0_GRP1_ReleaseReset(LL_PER0_GRP1_PERIPH_RTC);
return 0;
}
///
//函 数:
//功 能: 锁定RTC
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_Lock(RTC_TypeDef *RTCx)
{
uint16_t cnt = 0;
CLEAR_BIT(RTCx->CR1, RTC_CR1_WAIT);
//---检查是否有效
while (1)
{
if (READ_BIT(RTCx->CR1, RTC_CR1_WAITF) != 0)
{
break;
}
//---判断是否超时
if (cnt > 1000)
{
return 1;
}
cnt++;
//WDT_RESET();
}
return 0;
}
///
//函 数:
//功 能: 解锁RTC
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_UnLock(RTC_TypeDef *RTCx)
{
uint16_t cnt = 0;
if (LL_RTC_IsEnabled(RTCx)!=0)
{
SET_BIT(RTCx->CR1, RTC_CR1_WAIT);
//---检查是否有效
while (1)
{
if (READ_BIT(RTCx->CR1, RTC_CR1_WAITF)!=0)
{
break;
}
//---判断是否超时
if (cnt>1000)
{
return 1;
}
cnt++;
//WDT_RESET();
}
}
return 0;
}
///
//函 数:
//功 能: 时间初始化
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_SetTime(RTC_TypeDef *RTCx,uint8_t hour,uint8_t minute,uint8_t second)
{
//---解锁
uint8_t _return = 0;
//---不使能低功耗模式
LL_RCC_RTC_DisableLowPower();
//---解锁RTC日期操作
_return = LL_RTC_UnLock(RTCx);
//---校验结果
if (_return==0)
{
//---设置秒
LL_RTC_TIME_SetSecond(RTCx, second);
//---设置分
LL_RTC_TIME_SetMinute(RTCx, minute);
//---设置时
LL_RTC_TIME_SetHour(RTCx, hour);
//---锁定
_return = LL_RTC_Lock(RTCx);
}
//---使能低功耗模式
LL_RCC_RTC_EnableLowPower();
return _return;
}
///
//函 数:
//功 能: 时间初始化
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_TimeInit(RTC_TypeDef *RTCx, LL_RTC_TimeTypeDef *Timex)
{
//---设置时间格式
LL_RTC_TIME_SetFormat(RTCx, Timex->TimeFormat);
//---设置是分秒
return LL_RTC_SetTime(RTCx, Timex->Hours, Timex->Minutes, Timex->Seconds);
}
///
//函 数:
//功 能: 日期初始化
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_SetDate(RTC_TypeDef *RTCx,uint8_t year,uint8_t month,uint8_t day,uint8_t weekday)
{
uint8_t _return = 0;
//---不使能低功耗模式
LL_RCC_RTC_DisableLowPower();
//---解锁RTC日期操作
_return = LL_RTC_UnLock(RTCx);
//---校验结果
if (_return == 0)
{
//---设置年
LL_RTC_DATE_SetYear(RTCx, year);
//---设置月
LL_RTC_DATE_SetMonth(RTCx, month);
//---设置日
LL_RTC_DATE_SetDay(RTCx, day);
//---设置周
LL_RTC_DATE_SetWeekDay(RTCx, weekday);
//---锁定
_return = LL_RTC_Lock(RTCx);
}
//---使能低功耗模式
LL_RCC_RTC_EnableLowPower();
return _return;
}
///
//函 数:
//功 能: 日期初始化
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_DateInit(RTC_TypeDef *RTCx, LL_RTC_DateTypeDef *Datex)
{
return LL_RTC_SetDate(RTCx,Datex->Year,Datex->Month,Datex->Day,Datex->WeekDay);
}
///
//函 数:
//功 能: 报警初始化
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_SetAlarm(RTC_TypeDef *RTCx, uint8_t hour, uint8_t minute, uint8_t second,uint8_t weekday)
{
//---不使能低功耗模式
LL_RCC_RTC_DisableLowPower();
//---不使能RTC
LL_RTC_Disable(RTCx);
//---设置时
LL_RTC_ALM_SetHour(RTCx, hour);
//---设置分
LL_RTC_ALM_SetMinute(RTCx, minute);
//---设置秒
LL_RTC_ALM_SetSecond(RTCx, second);
//---设置周
LL_RTC_ALM_SetWeekDay(RTCx, weekday);
//---使能RTC
LL_RTC_Enable(RTCx);
//---使能低功耗模式
LL_RCC_RTC_EnableLowPower();
return 0;
}
///
//函 数:
//功 能: 报警初始化
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_AlarmInit(RTC_TypeDef *RTCx, LL_RTC_AlarmTypeDef *Alarmx)
{
if (LL_RTC_TIME_GetFormat(RTCx)!=Alarmx->AlarmTime.TimeFormat)
{
LL_RTC_TIME_SetFormat(RTCx, Alarmx->AlarmTime.TimeFormat);
}
return LL_RTC_SetAlarm(RTCx,Alarmx->AlarmTime.Hours,
Alarmx->AlarmTime.Minutes,
Alarmx->AlarmTime.Seconds,
Alarmx->AlarmWeekDay);
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
uint8_t LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_TimeTypeDef *Timex, LL_RTC_DateTypeDef *Datex)
{
uint32_t _adj = 0;
//---解锁
uint8_t _return = 0;
//---设置RTC高速补偿时钟频率选择
if (SystemCoreClock>24000000UL)
{
//LL_RCC_RTC_SetAdj(LL_RCC_RTC_ADJ_32M);
_adj = LL_RCC_RTC_ADJ_32M;
}
else if(SystemCoreClock > 20000000UL)
{
//LL_RCC_RTC_SetAdj(LL_RCC_RTC_ADJ_24M);
_adj = LL_RCC_RTC_ADJ_24M;
}
else if (SystemCoreClock > 16000000UL)
{
//LL_RCC_RTC_SetAdj(LL_RCC_RTC_ADJ_20M);
_adj = LL_RCC_RTC_ADJ_20M;
}
else if (SystemCoreClock > 12000000UL)
{
//LL_RCC_RTC_SetAdj(LL_RCC_RTC_ADJ_16M);
_adj = LL_RCC_RTC_ADJ_16M;
}
else if (SystemCoreClock > 8000000UL)
{
//LL_RCC_RTC_SetAdj(LL_RCC_RTC_ADJ_12M);
_adj = LL_RCC_RTC_ADJ_12M;
}
else if (SystemCoreClock > 6000000UL)
{
//LL_RCC_RTC_SetAdj(LL_RCC_RTC_ADJ_8M);
_adj = LL_RCC_RTC_ADJ_8M;
}
else if (SystemCoreClock > 4000000UL)
{
//LL_RCC_RTC_SetAdj(LL_RCC_RTC_ADJ_6M);
_adj = LL_RCC_RTC_ADJ_6M;
}
else
{
//LL_RCC_RTC_SetAdj(LL_RCC_RTC_ADJ_4M);
_adj = LL_RCC_RTC_ADJ_4M;
}
//---设置RTC补偿
LL_RCC_RTC_SetAdj(_adj);
//---不使能低功耗模式
LL_RCC_RTC_DisableLowPower();
//---不使能RTC
LL_RTC_Disable(RTCx);
//---设置时间格式
LL_RTC_TIME_SetFormat(RTCx, Timex->TimeFormat);
//---解锁RTC日期操作
_return = LL_RTC_UnLock(RTCx);
//---校验结果
if (_return == 0)
{
//---设置秒
LL_RTC_TIME_SetSecond(RTCx,Timex->Seconds);
//---设置分
LL_RTC_TIME_SetMinute(RTCx, Timex->Minutes);
//---设置时
LL_RTC_TIME_SetHour(RTCx, Timex->Hours);
//---设置年
LL_RTC_DATE_SetYear(RTCx, Datex->Year);
//---设置月
LL_RTC_DATE_SetMonth(RTCx, Datex->Month);
//---设置日
LL_RTC_DATE_SetDay(RTCx, Datex->Day);
//---设置周
LL_RTC_DATE_SetWeekDay(RTCx, Datex->WeekDay);
}
//---锁定
_return = LL_RTC_Lock(RTCx);
//---使能RTC
LL_RTC_Enable(RTCx);
//---使能低功耗模式
LL_RCC_RTC_EnableLowPower();
return _return;
}
#ifndef HC32L1XX_LL_RTC_H_
#define HC32L1XX_LL_RTC_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "hc32l1xx.h"
#include "hc32l1xx_ll_bus.h"
#include "hc32l1xx_ll_rcc.h"
///
//===AM模式或者24小时制
#define LL_RTC_TIME_FORMAT_AM_OR_24 RTC_CR0_AM
//===12小时制
#define LL_RTC_TIME_FORMAT_PM RTC_CR0_PM
//===星期信息,依次是周日,周一,周二,周三,周四,周五,周六
#define LL_RTC_WEEKDAY_SUNDAY (0x00U)
#define LL_RTC_WEEKDAY_MONDAY (0x01U)
#define LL_RTC_WEEKDAY_TUESDAY (0x02U)
#define LL_RTC_WEEKDAY_WEDNESDAY (0x03U)
#define LL_RTC_WEEKDAY_THURSDAY (0x04U)
#define LL_RTC_WEEKDAY_FRIDAY (0x05U)
#define LL_RTC_WEEKDAY_SATURDAY (0x06U)
//===月份信息,依次是1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月
#define LL_RTC_MONTH_JANUARY (0x01U)
#define LL_RTC_MONTH_FEBRUARY (0x02U)
#define LL_RTC_MONTH_MARCH (0x03U)
#define LL_RTC_MONTH_APRIL (0x04U)
#define LL_RTC_MONTH_MAY (0x05U)
#define LL_RTC_MONTH_JUNE (0x06U)
#define LL_RTC_MONTH_JULY (0x07U)
#define LL_RTC_MONTH_AUGUST (0x08U)
#define LL_RTC_MONTH_SEPTEMBER (0x09U)
#define LL_RTC_MONTH_OCTOBER (0x10U)
#define LL_RTC_MONTH_NOVEMBER (0x11U)
#define LL_RTC_MONTH_DECEMBER (0x12U)
//===24小时制
#define LL_RTC_HOURFORMAT_24HOUR RTC_CR0_AM
//===12小时制
#define LL_RTC_HOURFORMAT_PM RTC_CR0_PM
//===12小时制
#define LL_RTC_HOURFORMAT_12HOUR RTC_CR0_PM
//===报警星期信息,依次是周日,周一,周二,周三,周四,周五,周六
#define LL_RTC_ALARM_WEEKDAY_SUNDAY (1<<0)
#define LL_RTC_ALARM_WEEKDAY_MONDAY (1<<1)
#define LL_RTC_ALARM_WEEKDAY_TUESDAY (1<<2)
#define LL_RTC_ALARM_WEEKDAY_WEDNESDAY (1<<3)
#define LL_RTC_ALARM_WEEKDAY_THURSDAY (1<<4)
#define LL_RTC_ALARM_WEEKDAY_FRIDAY (1<<5)
#define LL_RTC_ALARM_WEEKDAY_SATURDAY (1<<6)
#define LL_RTC_ALARM_WEEKDAY_ALL (LL_RTC_ALARM_WEEKDAY_SUNDAY|LL_RTC_ALARM_WEEKDAY_MONDAY| \
LL_RTC_ALARM_WEEKDAY_TUESDAY|LL_RTC_ALARM_WEEKDAY_WEDNESDAY| \
LL_RTC_ALARM_WEEKDAY_THURSDAY|LL_RTC_ALARM_WEEKDAY_FRIDAY| \
LL_RTC_ALARM_WEEKDAY_SATURDAY)
//===RTC时钟源
#define LL_RTC_CLK_SOURCE_XTL RTC_CR1_CKSEL_XTL
#define LL_RTC_CLK_SOURCE_RCL RTC_CR1_CKSEL_RCL
#define LL_RTC_CLK_SOURCE_XTH_DIV128 RTC_CR1_CKSEL_XTH_PRE128
#define LL_RTC_CLK_SOURCE_XTH_DIV256 RTC_CR1_CKSEL_XTH_PRE256
#define LL_RTC_CLK_SOURCE_XTH_DIV512 RTC_CR1_CKSEL_XTH_PRE512
#define LL_RTC_CLK_SOURCE_XTH_DIV1024 RTC_CR1_CKSEL_XTH_PRE1024
//===时间间隔
#define LL_RTC_CYCLE_SEC_0P5 (RTC_CR0_PRDX_SEC_0P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_1 (RTC_CR0_PRDX_SEC_1 +0x80000000U)
#define LL_RTC_CYCLE_SEC_1P5 (RTC_CR0_PRDX_SEC_1P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_2 (RTC_CR0_PRDX_SEC_2 +0x80000000U)
#define LL_RTC_CYCLE_SEC_2P5 (RTC_CR0_PRDX_SEC_2P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_3 (RTC_CR0_PRDX_SEC_3 +0x80000000U)
#define LL_RTC_CYCLE_SEC_3P5 (RTC_CR0_PRDX_SEC_3P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_4 (RTC_CR0_PRDX_SEC_4 +0x80000000U)
#define LL_RTC_CYCLE_SEC_4P5 (RTC_CR0_PRDX_SEC_4P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_5 (RTC_CR0_PRDX_SEC_5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_5P5 (RTC_CR0_PRDX_SEC_5P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_6 (RTC_CR0_PRDX_SEC_6 +0x80000000U)
#define LL_RTC_CYCLE_SEC_6P5 (RTC_CR0_PRDX_SEC_6P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_7 (RTC_CR0_PRDX_SEC_7 +0x80000000U)
#define LL_RTC_CYCLE_SEC_7P5 (RTC_CR0_PRDX_SEC_7P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_8 (RTC_CR0_PRDX_SEC_8 +0x80000000U)
#define LL_RTC_CYCLE_SEC_8P5 (RTC_CR0_PRDX_SEC_8P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_9 (RTC_CR0_PRDX_SEC_9 +0x80000000U)
#define LL_RTC_CYCLE_SEC_9P5 (RTC_CR0_PRDX_SEC_9P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_10 (RTC_CR0_PRDX_SEC_10 +0x80000000U)
#define LL_RTC_CYCLE_SEC_10P5 (RTC_CR0_PRDX_SEC_10P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_11 (RTC_CR0_PRDX_SEC_11 +0x80000000U)
#define LL_RTC_CYCLE_SEC_11P5 (RTC_CR0_PRDX_SEC_11P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_12 (RTC_CR0_PRDX_SEC_12 +0x80000000U)
#define LL_RTC_CYCLE_SEC_12P5 (RTC_CR0_PRDX_SEC_12P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_13 (RTC_CR0_PRDX_SEC_13 +0x80000000U)
#define LL_RTC_CYCLE_SEC_13P5 (RTC_CR0_PRDX_SEC_13P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_14 (RTC_CR0_PRDX_SEC_14 +0x80000000U)
#define LL_RTC_CYCLE_SEC_14P5 (RTC_CR0_PRDX_SEC_14P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_15 (RTC_CR0_PRDX_SEC_15 +0x80000000U)
#define LL_RTC_CYCLE_SEC_15P5 (RTC_CR0_PRDX_SEC_15P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_16 (RTC_CR0_PRDX_SEC_16 +0x80000000U)
#define LL_RTC_CYCLE_SEC_16P5 (RTC_CR0_PRDX_SEC_16P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_17 (RTC_CR0_PRDX_SEC_17 +0x80000000U)
#define LL_RTC_CYCLE_SEC_17P5 (RTC_CR0_PRDX_SEC_17P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_18 (RTC_CR0_PRDX_SEC_18 +0x80000000U)
#define LL_RTC_CYCLE_SEC_18P5 (RTC_CR0_PRDX_SEC_18P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_19 (RTC_CR0_PRDX_SEC_19 +0x80000000U)
#define LL_RTC_CYCLE_SEC_19P5 (RTC_CR0_PRDX_SEC_19P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_20 (RTC_CR0_PRDX_SEC_20 +0x80000000U)
#define LL_RTC_CYCLE_SEC_20P5 (RTC_CR0_PRDX_SEC_20P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_21 (RTC_CR0_PRDX_SEC_21 +0x80000000U)
#define LL_RTC_CYCLE_SEC_21P5 (RTC_CR0_PRDX_SEC_21P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_22 (RTC_CR0_PRDX_SEC_22 +0x80000000U)
#define LL_RTC_CYCLE_SEC_22P5 (RTC_CR0_PRDX_SEC_22P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_23 (RTC_CR0_PRDX_SEC_23 +0x80000000U)
#define LL_RTC_CYCLE_SEC_23P5 (RTC_CR0_PRDX_SEC_23P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_24 (RTC_CR0_PRDX_SEC_24 +0x80000000U)
#define LL_RTC_CYCLE_SEC_24P5 (RTC_CR0_PRDX_SEC_24P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_25 (RTC_CR0_PRDX_SEC_25 +0x80000000U)
#define LL_RTC_CYCLE_SEC_25P5 (RTC_CR0_PRDX_SEC_25P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_26 (RTC_CR0_PRDX_SEC_26 +0x80000000U)
#define LL_RTC_CYCLE_SEC_26P5 (RTC_CR0_PRDX_SEC_26P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_27 (RTC_CR0_PRDX_SEC_27 +0x80000000U)
#define LL_RTC_CYCLE_SEC_27P5 (RTC_CR0_PRDX_SEC_27P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_28 (RTC_CR0_PRDX_SEC_28 +0x80000000U)
#define LL_RTC_CYCLE_SEC_28P5 (RTC_CR0_PRDX_SEC_28P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_29 (RTC_CR0_PRDX_SEC_29 +0x80000000U)
#define LL_RTC_CYCLE_SEC_29P5 (RTC_CR0_PRDX_SEC_29P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_30 (RTC_CR0_PRDX_SEC_30 +0x80000000U)
#define LL_RTC_CYCLE_SEC_30P5 (RTC_CR0_PRDX_SEC_30P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_31 (RTC_CR0_PRDX_SEC_31 +0x80000000U)
#define LL_RTC_CYCLE_SEC_31P5 (RTC_CR0_PRDX_SEC_31P5 +0x80000000U)
#define LL_RTC_CYCLE_SEC_32 (RTC_CR0_PRDX_SEC_32 +0x80000000U)
#define LL_RTC_CYCLE_NONE RTC_CR0_PRDS_NONE
#define LL_RTC_CYCLE_SEC_P5 RTC_CR0_PRDS_SEC_0P5
#define LL_RTC_CYCLE_SEC_1P RTC_CR0_PRDS_SEC_1
#define LL_RTC_CYCLE_MIN_1 RTC_CR0_PRDS_MIN_1
#define LL_RTC_CYCLE_HOUR_1 RTC_CR0_PRDS_HOUR_1
#define LL_RTC_CYCLE_DAY_1 RTC_CR0_PRDS_DAY_1
#define LL_RTC_CYCLE_MON_1 RTC_CR0_PRDS_MON_1
///
//函 数:
//功 能: 启动RTC计数
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_Enable(RTC_TypeDef *RTCx)
{
SET_BIT(RTCx->CR0, RTC_CR0_START);
}
///
//函 数:
//功 能: 停止RTC计数
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_Disable(RTC_TypeDef *RTCx)
{
CLEAR_BIT(RTCx->CR0, RTC_CR0_START);
}
///
//函 数:
//功 能: 停止RTC计数
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_IsEnabled(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_BIT(RTCx->CR0, RTC_CR0_START));
}
///
//函 数:
//功 能: 使能闹钟中断
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_EnableIT_ALM(RTC_TypeDef *RTCx)
{
SET_BIT(RTCx->CR1, RTC_CR1_ALMIE);
}
///
//函 数:
//功 能: 不使能闹钟中断
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_DisableIT_ALM(RTC_TypeDef *RTCx)
{
CLEAR_BIT(RTCx->CR1, RTC_CR1_ALMIE);
}
///
//函 数:
//功 能:是否使能闹钟中断
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_IsEnabled_IT_ALM(RTC_TypeDef *RTCx)
{
return (READ_BIT(RTCx->CR1, RTC_CR1_ALMIE) == (RTC_CR1_ALMIE));
}
///
//函 数:
//功 能:闹钟中断标志
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_IsActiveFlag_ALM(RTC_TypeDef *RTCx)
{
return (READ_BIT(RTCx->CR1, RTC_CR1_ALMF) == (RTC_CR1_ALMF));
}
///
//函 数:
//功 能:周期中断标志
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_IsActiveFlag_Cycle(RTC_TypeDef *RTCx)
{
return (READ_BIT(RTCx->CR1, RTC_CR1_PRDF) == (RTC_CR1_PRDF));
}
///
//函 数:
//功 能:闹钟中断标志
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_ClearFlag_ALM(RTC_TypeDef *RTCx)
{
CLEAR_BIT(RTCx->CR1, RTC_CR1_ALMF);
}
///
//函 数:
//功 能:周期中断标志
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_ClearFlag_Cycle(RTC_TypeDef *RTCx)
{
CLEAR_BIT(RTCx->CR1, RTC_CR1_PRDF);
}
///
//函 数:
//功 能: 设置时间格式
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_TIME_SetFormat(RTC_TypeDef *RTCx, uint32_t TimeFormat)
{
MODIFY_REG(RTCx->CR0, RTC_CR0_AMPM, TimeFormat);
}
///
//函 数:
//功 能: 获取时间格式
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_TIME_GetFormat(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_BIT(RTCx->CR0, RTC_CR0_AMPM));
}
///
//函 数:
//功 能: 设置小时
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_TIME_SetHour(RTC_TypeDef *RTCx, uint32_t Hours)
{
WRITE_REG(RTCx->HOUR, Hours);
}
///
//函 数:
//功 能: 获取小时
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_TIME_GetHour(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->HOUR));
}
///
//函 数:
//功 能: 设置分钟
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_TIME_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes)
{
WRITE_REG(RTCx->MIN, Minutes);
}
///
//函 数:
//功 能: 获取分钟
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_TIME_GetMinute(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->MIN));
}
///
//函 数:
//功 能: 设置秒
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_TIME_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds)
{
WRITE_REG(RTCx->SEC, Seconds);
}
///
//函 数:
//功 能: 获取秒
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_TIME_GetSecond(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->SEC));
}
///
//函 数:
//功 能: 设置年
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_DATE_SetYear(RTC_TypeDef *RTCx, uint32_t Year)
{
WRITE_REG(RTCx->YEAR, Year);
}
///
//函 数:
//功 能: 获取年
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_DATE_GetYear(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->YEAR));
}
///
//函 数:
//功 能: 设置周
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_DATE_SetWeekDay(RTC_TypeDef *RTCx, uint32_t WeekDay)
{
WRITE_REG(RTCx->WEEKDAY, WeekDay);
}
///
//函 数:
//功 能: 获取周
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_DATE_GetWeekDay(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->WEEKDAY));
}
///
//函 数:
//功 能: 设置月信息
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_DATE_SetMonth(RTC_TypeDef *RTCx, uint32_t Month)
{
WRITE_REG(RTCx->MONTH, Month);
}
///
//函 数:
//功 能: 获取月信息
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_DATE_GetMonth(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->MONTH));
}
///
//函 数:
//功 能: 设置天信息
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_DATE_SetDay(RTC_TypeDef *RTCx, uint32_t Day)
{
WRITE_REG(RTCx->DAY,Day);
}
///
//函 数:
//功 能: 获取天信息
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_DATE_GetDay(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->DAY));
}
///
//函 数:
//功 能: 使能闹钟
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_ALM_Enable(RTC_TypeDef *RTCx)
{
SET_BIT(RTCx->CR1, RTC_CR1_ALMEN);
}
///
//函 数:
//功 能: 不使能闹钟
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_ALM_Disable(RTC_TypeDef *RTCx)
{
CLEAR_BIT(RTCx->CR1, RTC_CR1_ALMEN);
}
///
//函 数:
//功 能: 闹钟设置小时
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_ALM_SetHour(RTC_TypeDef *RTCx, uint32_t Hours)
{
WRITE_REG(RTCx->ALMHOUR, Hours);
}
///
//函 数:
//功 能: 闹钟获取小时
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_ALM_GetHour(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->ALMHOUR));
}
///
//函 数:
//功 能: 闹钟设置分钟
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_ALM_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes)
{
WRITE_REG(RTCx->ALMMIN, Minutes);
}
///
//函 数:
//功 能: 闹钟获取分钟
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_ALM_GetMinute(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->ALMMIN));
}
///
//函 数:
//功 能: 闹钟设置秒
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_ALM_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds)
{
#if defined(HC32L17xP)||\
defined(HC32L17xM)||\
defined(HC32L17xK)||\
defined(HC32L17xJ)
WRITE_REG(RTCx->ALMSEC, Seconds);
#endif
}
///
//函 数:
//功 能: 闹钟获取秒
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_ALM_GetSecond(RTC_TypeDef *RTCx)
{
#if defined(HC32L17xP)||\
defined(HC32L17xM)||\
defined(HC32L17xK)||\
defined(HC32L17xJ)
return (uint32_t)(READ_REG(RTCx->ALMSEC));
#else
return 0;
#endif
}
///
//函 数:
//功 能: 闹钟设置周
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_ALM_SetWeekDay(RTC_TypeDef *RTCx, uint32_t WeekDay)
{
WRITE_REG(RTCx->ALMWEEKDAY, WeekDay);
}
///
//函 数:
//功 能: 闹钟获取周
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_ALM_GetWeekDay(RTC_TypeDef *RTCx)
{
return (uint32_t)(READ_REG(RTCx->ALMWEEKDAY));
}
///
//函 数:
//功 能: 使能1HZ输出
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_Enable1Hz(RTC_TypeDef *RTCx)
{
SET_BIT(RTCx->CR0, RTC_CR0_1HZEN);
}
///
//函 数:
//功 能: 使能1HZ输出
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_Disable1Hz(RTC_TypeDef *RTCx)
{
CLEAR_BIT(RTCx->CR0, RTC_CR0_1HZEN);
}
///
//函 数:
//功 能: 设置RTC时钟选择项
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_SetClockSource(RTC_TypeDef *RTCx,uint32_t ClockSource)
{
MODIFY_REG(RTCx->CR1, RTC_CR1_CKSEL, ClockSource);
}
///
//函 数:
//功 能: 获取RTC时钟选择项
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint32_t LL_RTC_GetClockSource(RTC_TypeDef *RTCx)
{
return (uint32_t)READ_BIT(RTCx->CR1, RTC_CR1_CKSEL);
}
///
//函 数:
//功 能:
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_SetCycle(RTC_TypeDef *RTCx, uint32_t TimeInterval)
{
uint32_t mask = 0;
if ((TimeInterval& 0x80000000U)!=0)
{
mask |= RTC_CR0_PRDSEL;
mask &= ~RTC_CR0_PRDX;
TimeInterval |= RTC_CR0_PRDSEL;
TimeInterval -= 0x80000000U;
}
else if ((TimeInterval & (~RTC_CR0_PRDS_MASK)) == 0)
{
mask &= ~RTC_CR0_PRDSEL;
mask &= ~RTC_CR0_PRDS;
TimeInterval &= ~RTC_CR0_PRDSEL;
}
else
{
mask &= ~RTC_CR0_PRDSEL;
mask &= ~RTC_CR0_PRDS;
TimeInterval = LL_RTC_CYCLE_NONE;
TimeInterval &= ~RTC_CR0_PRDSEL;
}
uint32_t reg_temp = 0;
//switch (TimeInterval)
//{
// case LL_RTC_CYCLE_SEC_0P5 :
// case LL_RTC_CYCLE_SEC_1 :
// case LL_RTC_CYCLE_SEC_1P5 :
// case LL_RTC_CYCLE_SEC_2 :
// case LL_RTC_CYCLE_SEC_2P5 :
// case LL_RTC_CYCLE_SEC_3 :
// case LL_RTC_CYCLE_SEC_3P5 :
// case LL_RTC_CYCLE_SEC_4 :
// case LL_RTC_CYCLE_SEC_4P5 :
// case LL_RTC_CYCLE_SEC_5 :
// case LL_RTC_CYCLE_SEC_5P5 :
// case LL_RTC_CYCLE_SEC_6 :
// case LL_RTC_CYCLE_SEC_6P5 :
// case LL_RTC_CYCLE_SEC_7 :
// case LL_RTC_CYCLE_SEC_7P5 :
// case LL_RTC_CYCLE_SEC_8 :
// case LL_RTC_CYCLE_SEC_8P5 :
// case LL_RTC_CYCLE_SEC_9 :
// case LL_RTC_CYCLE_SEC_9P5 :
// case LL_RTC_CYCLE_SEC_10 :
// case LL_RTC_CYCLE_SEC_10P5 :
// case LL_RTC_CYCLE_SEC_11 :
// case LL_RTC_CYCLE_SEC_11P5 :
// case LL_RTC_CYCLE_SEC_12 :
// case LL_RTC_CYCLE_SEC_12P5 :
// case LL_RTC_CYCLE_SEC_13 :
// case LL_RTC_CYCLE_SEC_13P5 :
// case LL_RTC_CYCLE_SEC_14 :
// case LL_RTC_CYCLE_SEC_14P5 :
// case LL_RTC_CYCLE_SEC_15 :
// case LL_RTC_CYCLE_SEC_15P5 :
// case LL_RTC_CYCLE_SEC_16 :
// case LL_RTC_CYCLE_SEC_16P5 :
// case LL_RTC_CYCLE_SEC_17 :
// case LL_RTC_CYCLE_SEC_17P5 :
// case LL_RTC_CYCLE_SEC_18 :
// case LL_RTC_CYCLE_SEC_18P5 :
// case LL_RTC_CYCLE_SEC_19 :
// case LL_RTC_CYCLE_SEC_19P5 :
// case LL_RTC_CYCLE_SEC_20 :
// case LL_RTC_CYCLE_SEC_20P5 :
// case LL_RTC_CYCLE_SEC_21 :
// case LL_RTC_CYCLE_SEC_21P5 :
// case LL_RTC_CYCLE_SEC_22 :
// case LL_RTC_CYCLE_SEC_22P5 :
// case LL_RTC_CYCLE_SEC_23 :
// case LL_RTC_CYCLE_SEC_23P5 :
// case LL_RTC_CYCLE_SEC_24 :
// case LL_RTC_CYCLE_SEC_24P5 :
// case LL_RTC_CYCLE_SEC_25 :
// case LL_RTC_CYCLE_SEC_25P5 :
// case LL_RTC_CYCLE_SEC_26 :
// case LL_RTC_CYCLE_SEC_26P5 :
// case LL_RTC_CYCLE_SEC_27 :
// case LL_RTC_CYCLE_SEC_27P5 :
// case LL_RTC_CYCLE_SEC_28 :
// case LL_RTC_CYCLE_SEC_28P5 :
// case LL_RTC_CYCLE_SEC_29 :
// case LL_RTC_CYCLE_SEC_29P5 :
// case LL_RTC_CYCLE_SEC_30 :
// case LL_RTC_CYCLE_SEC_30P5 :
// case LL_RTC_CYCLE_SEC_31 :
// case LL_RTC_CYCLE_SEC_31P5 :
// case LL_RTC_CYCLE_SEC_32 :
// {
// mask |= RTC_CR0_PRDSEL;
// mask &= ~RTC_CR0_PRDX;
// TimeInterval|= RTC_CR0_PRDSEL;
// TimeInterval -= 0x80000000U;
// break;
// }
// case LL_RTC_CYCLE_NONE :
// case LL_RTC_CYCLE_SEC_P5 :
// case LL_RTC_CYCLE_SEC_1P :
// case LL_RTC_CYCLE_MIN_1 :
// case LL_RTC_CYCLE_HOUR_1 :
// case LL_RTC_CYCLE_DAY_1 :
// case LL_RTC_CYCLE_MON_1 :
// {
// mask &= ~RTC_CR0_PRDSEL;
// mask &= ~RTC_CR0_PRDS;
// TimeInterval &= ~RTC_CR0_PRDSEL;
// break;
// }
// default:
// {
// mask &= ~RTC_CR0_PRDSEL;
// mask &= ~RTC_CR0_PRDS;
// TimeInterval = LL_RTC_CYCLE_NONE;
// TimeInterval &= ~RTC_CR0_PRDSEL;
// break;
// }
//}
//---判断是否使能低功耗模式
LL_RCC_RTC_DisableLowPower();
//---不使能中断
NVIC_DisableIRQ(RTC_IRQn);
//---写入数据
MODIFY_REG(RTCx->CR0, mask, TimeInterval);
//---判断RTC是否使能
if (LL_RTC_IsEnabled(RTCx) != 0)
{
LL_RTC_ClearFlag_ALM(RTCx);
LL_RTC_ClearFlag_Cycle(RTCx);
//---使能中断
NVIC_EnableIRQ(RTC_IRQn);
}
//---使能低功耗模式
LL_RCC_RTC_EnableLowPower();
}
///
//函 数:
//功 能: 不使能闹钟中断
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_DisableIT_Cycle(RTC_TypeDef *RTCx)
{
LL_RTC_SetCycle(RTCx, LL_RTC_CYCLE_NONE);
}
///
//函 数:
//功 能: 使能时钟误差补偿
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_COMP_Enable(RTC_TypeDef* RTCx)
{
SET_BIT(RTCx->COMPEM, RTC_COMPEM_EN);
}
///
//函 数:
//功 能: 不使能时钟误差补偿
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_COMP_Disable(RTC_TypeDef* RTCx)
{
CLEAR_BIT(RTCx->COMPEM, RTC_COMPEM_EN);
}
///
//函 数:
//功 能: 设置时钟误差补偿
//输入参 数:
//输出参 数:
//说 明:
//
static inline void LL_RTC_COMP_SetAdj(RTC_TypeDef* RTCx,uint16_t adj)
{
MODIFY_REG(RTCx->COMPEM, RTC_COMPEM_VAL,adj);
}
///
//函 数:
//功 能: 获取时钟误差补偿
//输入参 数:
//输出参 数:
//说 明:
//
static inline uint16_t LL_RTC_COMP_GetAdj(RTC_TypeDef* RTCx, uint16_t adj)
{
return (uint16_t)READ_BIT(RTCx->COMPEM, RTC_COMPEM_VAL);
}
//===时间结构体
typedef struct
{
uint32_t TimeFormat; //---时间格式
uint32_t Hours; //---时
uint32_t Minutes; //---分
uint32_t Seconds; //---秒
} LL_RTC_TimeTypeDef;
//===日期信息
typedef struct
{
uint32_t WeekDay; //---周
uint32_t Month; //---月
uint32_t Day; //---日
uint32_t Year; //---年
} LL_RTC_DateTypeDef;
//===闹钟
typedef struct
{
LL_RTC_TimeTypeDef AlarmTime; //---闹钟时间
uint32_t AlarmWeekDay; //---闹钟周
} LL_RTC_AlarmTypeDef;
//===函数定义
uint8_t LL_RTC_DeInit(RTC_TypeDef *RTCx);
uint8_t LL_RTC_Lock(RTC_TypeDef *RTCx);
uint8_t LL_RTC_UnLock(RTC_TypeDef *RTCx);
uint8_t LL_RTC_SetTime(RTC_TypeDef *RTCx, uint8_t hour, uint8_t minute, uint8_t second);
uint8_t LL_RTC_TimeInit(RTC_TypeDef *RTCx, LL_RTC_TimeTypeDef *Timex);
uint8_t LL_RTC_SetDate(RTC_TypeDef *RTCx, uint8_t year, uint8_t month, uint8_t day, uint8_t weekday);
uint8_t LL_RTC_DateInit(RTC_TypeDef *RTCx, LL_RTC_DateTypeDef *Datex);
uint8_t LL_RTC_SetAlarm(RTC_TypeDef *RTCx, uint8_t hour, uint8_t minute, uint8_t second, uint8_t weekday);
uint8_t LL_RTC_AlarmInit(RTC_TypeDef *RTCx, LL_RTC_AlarmTypeDef *Alarmx);
uint8_t LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_TimeTypeDef *Timex, LL_RTC_DateTypeDef *Datex);
///
#ifdef __cplusplus
}
#endif
#endif /* HC32L1XX_LL_RTC_H */