HC32L17x的LL驱动库之rtc

#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 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值