CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Include/ciu32l051_std_rtc.h

1037 lines
33 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************************************/
/**
* @file ciu32l051_std_rtc.h
* @author MCU Ecosystem Development Team
* @brief RTC STD库驱动头文件。
* 提供RTC的STD库操作函数声明、数据类型以及常量的定义。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/
/* 避免头文件重复引用 */
#ifndef CIU32L051_STD_RTC_H
#define CIU32L051_STD_RTC_H
/************************************************************************************************/
/**
* @addtogroup CIU32L051_STD_Driver
* @{
*/
/**
* @defgroup RTC RTC
* @brief 实时时钟的STD库驱动
* @{
*
*/
/************************************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/*------------------------------------------includes--------------------------------------------*/
#include "ciu32l051_std_common.h"
/*-----------------------------------------type define------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup RTC_Types RTC Types
* @brief RTC数据类型定义
* @{
*/
/************************************************************************************************/
/**
* @brief RTC日历时间参数结构体定义
*/
typedef struct
{
uint8_t hours; /**< RTC 日历小时BCD格式24小时制取值0~23 */
uint8_t minutes; /**< RTC 日历分钟BCD格式取值0~59 */
uint8_t seconds; /**< RTC 日历秒BCD格式取值0~59 */
} std_rtc_time_t;
/**
* @brief RTC日历日期参数结构体定义
*/
typedef struct
{
uint8_t weekday; /**< RTC 日历星期
@arg RTC_WEEKDAY_MONDAY ... */
uint8_t month; /**< RTC 日历月份BCD格式
@arg RTC_MONTH_JANUARY ... */
uint8_t day; /**< RTC 日历日期BCD格式 */
uint8_t year; /**< RTC 日历年份BCD格式 */
} std_rtc_date_t;
/**
* @brief RTC闹钟参数结构体定义
*/
typedef struct
{
std_rtc_time_t time; /**< RTC 闹钟设定时间 */
uint32_t time_mask; /**< RTC 闹钟屏蔽
@arg RTC_ALARM_MASK_NONE ...*/
} std_rtc_alarm_t;
/**
* @}
*/
/*--------------------------------------------define--------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup RTC_Constants RTC Constants
* @brief RTC常量定义及宏定义
* @{
*
*/
/************************************************************************************************/
/* RTC超时等待时间 */
#define RTC_INITMODE_TIMEOUT (1000U)
/* RTC模式 */
#define RTC_MODE_RUNNING (0x00000000U) /**< 正常运行模式 */
#define RTC_MODE_INIT RTC_CSR_MODSTA /**< 初始化模式 */
/* RTC_OUT输出信号 */
#define RTC_OUTPUT_APRE_256HZ RTC_CR_OUT_SEL_APRE /**< 输出异步预分频器输出时钟256Hz */
#define RTC_OUTPUT_SPRE_1HZ RTC_CR_OUT_SEL_SPRE /**< 输出同步预分频器输出时钟1Hz */
#define RTC_OUTPUT_ALARM RTC_CR_OUT_SEL_ALARMF /**< 输出闹钟匹配状态 */
#define RTC_OUTPUT_MINUTE RTC_CR_OUT_SEL_MIN /**< 输出日历分钟进位信号 */
#define RTC_OUTPUT_HOUR RTC_CR_OUT_SEL_HOUR /**< 输出日历小时进位信号 */
#define RTC_OUTPUT_DAY RTC_CR_OUT_SEL_DAY /**< 输出日历天进位信号 */
#define RTC_OUTPUT_CALIB_CYCLE RTC_CR_OUT_SEL_CAL /**< 输出校准周期信号 */
/* RTC_OUT信号输出极性 */
#define RTC_OUT_POLARITY_NORMAL (0x00000000U) /**< 有标志置起输出高电平 */
#define RTC_OUT_POLARITY_REVERSE RTC_CR_POL /**< 有标志置起输出低电平 */
/* RTC_OUT信号输出使能控制 */
#define RTC_OUT_DISABLE (0x00000000U) /**< RTC_OUT输出禁止 */
#define RTC_OUT_ENABLE RTC_CR_OUTEN /**< RTC_OUT输出使能 */
/* RTC日历月份BCD格式 */
#define RTC_MONTH_JANUARY ((uint8_t)0x01U) /**< 1月 */
#define RTC_MONTH_FEBRUARY ((uint8_t)0x02U) /**< 2月 */
#define RTC_MONTH_MARCH ((uint8_t)0x03U) /**< 3月 */
#define RTC_MONTH_APRIL ((uint8_t)0x04U) /**< 4月 */
#define RTC_MONTH_MAY ((uint8_t)0x05U) /**< 5月 */
#define RTC_MONTH_JUNE ((uint8_t)0x06U) /**< 6月 */
#define RTC_MONTH_JULY ((uint8_t)0x07U) /**< 7月 */
#define RTC_MONTH_AUGUST ((uint8_t)0x08U) /**< 8月 */
#define RTC_MONTH_SEPTEMBER ((uint8_t)0x09U) /**< 9月 */
#define RTC_MONTH_OCTOBER ((uint8_t)0x10U) /**< 10月 */
#define RTC_MONTH_NOVEMBER ((uint8_t)0x11U) /**< 11月 */
#define RTC_MONTH_DECEMBER ((uint8_t)0x12U) /**< 12月 */
/* RTC日历星期 */
#define RTC_WEEKDAY_MONDAY ((uint8_t)0x01U) /**< 星期一 */
#define RTC_WEEKDAY_TUESDAY ((uint8_t)0x02U) /**< 星期二 */
#define RTC_WEEKDAY_WEDNESDAY ((uint8_t)0x03U) /**< 星期三 */
#define RTC_WEEKDAY_THURSDAY ((uint8_t)0x04U) /**< 星期四 */
#define RTC_WEEKDAY_FRIDAY ((uint8_t)0x05U) /**< 星期五 */
#define RTC_WEEKDAY_SATURDAY ((uint8_t)0x06U) /**< 星期六 */
#define RTC_WEEKDAY_SUNDAY ((uint8_t)0x07U) /**< 星期日 */
/* 日期/时间偏移量 */
#define RTC_OFFSET_YEAR ((uint32_t)16U)
#define RTC_OFFSET_MONTH ((uint32_t)8U)
#define RTC_OFFSET_HOUR ((uint32_t)16U)
#define RTC_OFFSET_MINUTE ((uint32_t)8U)
/* 日期/时间 */
#define RTC_DAY_MASK (RTC_DR_DT | RTC_DR_DU) /**< 日期 */
#define RTC_MONTH_MASK (RTC_DR_MT | RTC_DR_MU) /**< 月份 */
#define RTC_YEAR_MASK (RTC_DR_YT | RTC_DR_YU) /**< 年份 */
#define RTC_HOUR_MASK (RTC_TR_HT | RTC_TR_HU) /**< 小时 */
#define RTC_MINUTE_MASK (RTC_TR_MNT | RTC_TR_MNU) /**< 分钟 */
#define RTC_SECOND_MASK (RTC_TR_ST | RTC_TR_SU) /**< 秒钟 */
/* 闹钟时间 */
#define RTC_ALARM_HOUR_MASK (RTC_ALARMR_HT | RTC_ALARMR_HU) /**< 闹钟小时 */
#define RTC_ALARM_MINUTE_MASK (RTC_ALARMR_MNT | RTC_ALARMR_MNU) /**< 闹钟分钟 */
#define RTC_ALARM_SECOND_MASK (RTC_ALARMR_ST | RTC_ALARMR_SU) /**< 闹钟秒钟 */
/* RTC闹钟时间域屏蔽配置 */
#define RTC_ALARM_MASK_NONE (0x00000000U) /**< 闹钟所有域未屏蔽,均参与日历比较 */
#define RTC_ALARM_MASK_HOURS RTC_ALARMR_MSK3 /**< 闹钟小时域被屏蔽,不参与日历比较 */
#define RTC_ALARM_MASK_MINUTES RTC_ALARMR_MSK2 /**< 闹钟分钟域被屏蔽,不参与日历比较 */
#define RTC_ALARM_MASK_SECONDS RTC_ALARMR_MSK1 /**< 闹钟秒钟域被屏蔽,不参与日历比较 */
#define RTC_ALARM_MASK_ALL RTC_ALARMR_MSKALL /**< 闹钟所有域均被屏蔽,不参与日历比较 */
#define RTC_ALARM_MASK_HOURMIN (RTC_ALARM_MASK_HOURS \
| RTC_ALARM_MASK_MINUTES) /**< 闹钟小时与分钟域被屏蔽,不参与日历比较 */
#define RTC_ALARM_MASK_HOURSEC (RTC_ALARM_MASK_HOURS \
| RTC_ALARM_MASK_SECONDS) /**< 闹钟小时与秒钟域被屏蔽,不参与日历比较 */
#define RTC_ALARM_MASK_MINSEC (RTC_ALARM_MASK_MINUTES \
| RTC_ALARM_MASK_SECONDS) /**< 闹钟分钟域秒钟域被屏蔽,不参与日历比较 */
/* RTC周期定时器中断使能 */
#define RTC_WUT_INTERRUPT_DAY RTC_WUT_DAYIE /**< 天进位中断使能 */
#define RTC_WUT_INTERRUPT_HOUR RTC_WUT_HOURIE /**< 小时进位中断使能 */
#define RTC_WUT_INTERRUPT_MIN RTC_WUT_MINIE /**< 分钟进位中断使能 */
#define RTC_WUT_INTERRUPT_SEC RTC_WUT_SECIE /**< 秒进位中断使能 */
#define RTC_WUT_INTERRUPT_2HZ RTC_WUT_2HZIE /**< 2Hz周期定时中断使能 */
#define RTC_WUT_INTERRUPT_4HZ RTC_WUT_4HZIE /**< 4Hz周期定时中断使能 */
#define RTC_WUT_INTERRUPT_8HZ RTC_WUT_8HZIE /**< 8Hz周期定时中断使能 */
#define RTC_WUT_INTERRUPT_16HZ RTC_WUT_16HZIE /**< 16Hz周期定时中断使能 */
#define RTC_WUT_INTERRUPT_64HZ RTC_WUT_64HZIE /**< 64Hz周期定时中断使能 */
#define RTC_WUT_INTERRUPT_256HZ RTC_WUT_256HZIE /**< 256Hz周期定时中断使能 */
#define RTC_WUT_INTERRUPT_1024HZ RTC_WUT_1024HZIE /**< 1024Hz周期定时中断使能 */
/* RTC中断标志 */
#define RTC_INTERRUPT_FLAG_ALARM RTC_ISR_ALARMIF /**< 闹钟中断标志 */
#define RTC_INTERRUPT_FLAG_CALIBRATION RTC_ISR_CALIIF /**< 校准周期中断标志 */
#define RTC_INTERRUPT_FLAG_DAY RTC_ISR_DAYIF /**< 天进位中断标志 */
#define RTC_INTERRUPT_FLAG_HOUR RTC_ISR_HOURIF /**< 小时进位中断标志 */
#define RTC_INTERRUPT_FLAG_MIN RTC_ISR_MINIF /**< 分钟进位中断标志 */
#define RTC_INTERRUPT_FLAG_SEC RTC_ISR_SECIF /**< 秒进位中断标志 */
#define RTC_INTERRUPT_FLAG_2HZ RTC_ISR_2HZIF /**< 2Hz周期定时中断标志 */
#define RTC_INTERRUPT_FLAG_4HZ RTC_ISR_4HZIF /**< 4Hz周期定时中断标志 */
#define RTC_INTERRUPT_FLAG_8HZ RTC_ISR_8HZIF /**< 8Hz周期定时中断标志 */
#define RTC_INTERRUPT_FLAG_16HZ RTC_ISR_16HZIF /**< 16Hz周期定时中断标志 */
#define RTC_INTERRUPT_FLAG_64HZ RTC_ISR_64HZIF /**< 64Hz周期定时中断标志 */
#define RTC_INTERRUPT_FLAG_256HZ RTC_ISR_256HZIF /**< 256Hz周期定时中断标志 */
#define RTC_INTERRUPT_FLAG_1024HZ RTC_ISR_1024HZIF /**< 1024Hz周期定时中断标志 */
/* RTC标志 */
#define RTC_FLAG_ALARM RTC_SR_ALARMF /**< 闹钟标志 */
#define RTC_FLAG_CALIBRATION RTC_SR_CALF /**< 校准周期标志 */
#define RTC_FLAG_TIMESTAMP RTC_SR_TSF /**< 时间戳标志 */
#define RTC_FLAG_DAY RTC_SR_DAYF /**< 天进位标志 */
#define RTC_FLAG_HOUR RTC_SR_HOURF /**< 小时进位标志 */
#define RTC_FLAG_MIN RTC_SR_MINF /**< 分钟进位标志 */
#define RTC_FLAG_SEC RTC_SR_SECF /**< 秒进位标志 */
#define RTC_FLAG_2HZ RTC_SR_2HZF /**< 2Hz周期定时标志 */
#define RTC_FLAG_4HZ RTC_SR_4HZF /**< 4Hz周期定时标志 */
#define RTC_FLAG_8HZ RTC_SR_8HZF /**< 8Hz周期定时标志 */
#define RTC_FLAG_16HZ RTC_SR_16HZF /**< 16Hz周期定时标志 */
#define RTC_FLAG_64HZ RTC_SR_64HZF /**< 64Hz周期定时标志 */
#define RTC_FLAG_256HZ RTC_SR_256HZF /**< 256Hz周期定时标志 */
#define RTC_FLAG_1024HZ RTC_SR_1024HZF /**< 1024Hz周期定时标志 */
/* RTC标志清除位 */
#define RTC_CLEAR_ALARM RTC_CLR_CALARMF /**< 清除闹钟标志 */
#define RTC_CLEAR_CALIBRATION RTC_CLR_CCALF /**< 清除校准周期标志 */
#define RTC_CLEAR_TIMESTAMP RTC_CLR_CTSF /**< 清除时间戳标志 */
#define RTC_CLEAR_DAY RTC_CLR_CDAYF /**< 清除天进位标志 */
#define RTC_CLEAR_HOUR RTC_CLR_CHOURF /**< 清除小时进位标志 */
#define RTC_CLEAR_MIN RTC_CLR_CMINF /**< 清除分钟进位标志 */
#define RTC_CLEAR_SEC RTC_CLR_CSECF /**< 清除秒进位标志 */
#define RTC_CLEAR_2HZ RTC_CLR_C2HZF /**< 清除2Hz进位标志 */
#define RTC_CLEAR_4HZ RTC_CLR_C4HZF /**< 清除4Hz进位标志 */
#define RTC_CLEAR_8HZ RTC_CLR_C8HZF /**< 清除8Hz进位标志 */
#define RTC_CLEAR_16HZ RTC_CLR_C16HZF /**< 清除16Hz进位标志 */
#define RTC_CLEAR_64HZ RTC_CLR_C64HZF /**< 清除64Hz进位标志 */
#define RTC_CLEAR_256HZ RTC_CLR_C256HZF /**< 清除256Hz进位标志 */
#define RTC_CLEAR_1024HZ RTC_CLR_C1024HZF /**< 清除1024Hz进位标志 */
/* RTC平滑校准脉冲增加配置 */
#define RTC_SMOOTH_CALIB_PLUS_PULSES_RESET (0x00000000U) /**< 不增加脉冲 */
#define RTC_SMOOTH_CALIB_PLUS_PULSES_SET RTC_CALR_CALP /**< 每隔2^11个RTCLK增加1个脉冲 */
/**
* @}
*/
/*-------------------------------------------functions------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup RTC_External_Functions RTC External Functions
* @brief RTC对外函数
* @{
*
*/
/************************************************************************************************/
/**
*@brief BIN转BCD
*@param value BIN格式数字
*@retval uint8_t BCD格式数字
*/
__STATIC_INLINE uint8_t std_rtc_convert_bin2bcd(uint8_t value)
{
return (uint8_t)((((value) / 10U) << 4U) | ((value) % 10U));
}
/**
*@brief BCD转BIN
*@param value BCD格式数字
*@retval uint8_t BIN格式数字
*/
__STATIC_INLINE uint8_t std_rtc_convert_bcd2bin(uint8_t value)
{
return (uint8_t)(((((value) & 0xF0U) >> 0x4U) * 10U ) + ((value) & 0x0FU));
}
/**
* @brief 使能RTC寄存器写保护
* @retval 无
*/
__STATIC_INLINE void std_rtc_write_protection_enable(void)
{
RTC->WPR = 0x00U;
}
/**
* @brief 禁止RTC寄存器写保护
* @retval 无
*/
__STATIC_INLINE void std_rtc_write_protection_disable(void)
{
RTC->WPR = 0xCAU;
RTC->WPR = 0x53U;
}
/**
* @brief 使能RTC初始化
* @retval 无
*/
__STATIC_INLINE void std_rtc_init_mode_enable(void)
{
RTC->CSR |= RTC_CSR_MODSEL;
}
/**
* @brief 禁止RTC初始化
* @retval 无
*/
__STATIC_INLINE void std_rtc_init_mode_disable(void)
{
RTC->CSR &= (~RTC_CSR_MODSEL);
}
/**
* @brief 读取RTC模式状态
* @retval uint32_t RTC模式状态
* @arg RTC_MODE_RUNNING
* @arg RTC_MODE_INIT
*/
__STATIC_INLINE uint32_t std_rtc_get_mode(void)
{
return (RTC->CSR & RTC_CSR_MODSTA);
}
/**
* @brief 配置日历日期BCD格式
* @param weekday 星期
* @arg RTC_WEEKDAY_MONDAY
* @arg RTC_WEEKDAY_TUESDAY
* @arg ...
* @arg RTC_WEEKDAY_SUNDAY
* @param day 日期最小0x01最大0x31
* @param month 月份
* @arg RTC_MONTH_JANUARY
* @arg RTC_MONTH_FEBRUARY
* @arg ...
* @arg RTC_MONTH_DECEMBER
* @param year 年份最小0x00最大0x99
* @retval 无
*/
__STATIC_INLINE void std_rtc_date_config(uint32_t weekday, uint32_t day, uint32_t month, uint32_t year)
{
uint32_t temp;
temp = (weekday << RTC_DR_WDU_POS) \
| (((year & 0xF0U) << (RTC_DR_YT_POS - 4U)) | ((year & 0x0FU) << RTC_DR_YU_POS)) \
| (((month & 0xF0U) << (RTC_DR_MT_POS - 4U)) | ((month & 0x0FU) << RTC_DR_MU_POS)) \
| (((day & 0xF0U) << (RTC_DR_DT_POS - 4U)) | ((day & 0x0FU) << RTC_DR_DU_POS));
RTC->DR = temp;
}
/**
* @brief 读取日历日期BCD格式
* @retval uint32_t 日期(星期+年+月+日)
*/
__STATIC_INLINE uint32_t std_rtc_date_get_date(void)
{
uint32_t temp;
temp = RTC->DR;
return (uint32_t)((temp & (~RTC_DR_WDU)) | ((temp & RTC_DR_WDU) << 11));
}
/**
* @brief 设置日历日期BCD格式
* @param day 日期最小0x01最大0x31
* @retval 无
*/
__STATIC_INLINE void std_rtc_date_set_day(uint32_t day)
{
MODIFY_REG(RTC->DR, RTC_DAY_MASK,
(((day & 0xF0U) << (RTC_DR_DT_POS - 4U)) | ((day & 0x0FU) << RTC_DR_DU_POS)));
}
/**
* @brief 读取日历日期BCD格式
* @retval uint32_t 日期 最小0x01最大0x31
*/
__STATIC_INLINE uint32_t std_rtc_date_get_day(void)
{
return ((RTC->DR & RTC_DAY_MASK) >> RTC_DR_DU_POS);
}
/**
* @brief 设置日历月份BCD格式
* @param month 月份
* @arg RTC_MONTH_JANUARY
* @arg RTC_MONTH_FEBRUARY
* @arg ...
* @arg RTC_MONTH_DECEMBER
* @retval 无
*/
__STATIC_INLINE void std_rtc_date_set_month(uint32_t month)
{
MODIFY_REG(RTC->DR, RTC_MONTH_MASK,
(((month & 0xF0U) << (RTC_DR_MT_POS - 4U)) | ((month & 0x0FU) << RTC_DR_MU_POS)));
}
/**
* @brief 读取日历月份BCD格式
* @retval uint32_t 月份
* @arg RTC_MONTH_JANUARY
* @arg RTC_MONTH_FEBRUARY
* @arg ...
* @arg RTC_MONTH_DECEMBER
*/
__STATIC_INLINE uint32_t std_rtc_date_get_month(void)
{
return ((RTC->DR & RTC_MONTH_MASK) >> RTC_DR_MU_POS);
}
/**
* @brief 设置日历星期BCD格式
* @param weekday 星期
* @arg RTC_WEEKDAY_MONDAY
* @arg RTC_WEEKDAY_TUESDAY
* @arg ...
* @arg RTC_WEEKDAY_SUNDAY
* @retval 无
*/
__STATIC_INLINE void std_rtc_date_set_weekday(uint32_t weekday)
{
MODIFY_REG(RTC->DR, RTC_DR_WDU, (weekday << RTC_DR_WDU_POS));
}
/**
* @brief 读取日历星期BCD格式
* @retval uint32_t 星期
* @arg RTC_WEEKDAY_MONDAY
* @arg RTC_WEEKDAY_TUESDAY
* @arg ...
* @arg RTC_WEEKDAY_SUNDAY
*/
__STATIC_INLINE uint32_t std_rtc_date_get_weekday(void)
{
return ((RTC->DR & RTC_DR_WDU) >> RTC_DR_WDU_POS);
}
/**
* @brief 设置日历年份BCD格式
* @param year 年份最小0x00最大0x99
* @retval 无
*/
__STATIC_INLINE void std_rtc_date_set_year(uint32_t year)
{
MODIFY_REG(RTC->DR, RTC_YEAR_MASK,
(((year & 0xF0U) << (RTC_DR_YT_POS - 4U)) | ((year & 0x0FU) << RTC_DR_YU_POS)));
}
/**
* @brief 读取日历年份BCD格式
* @retval uint32_t 年份最小0x00最大0x99
*/
__STATIC_INLINE uint32_t std_rtc_date_get_year(void)
{
return ((RTC->DR & RTC_YEAR_MASK) >> RTC_DR_YU_POS);
}
/**
* @brief 配置日历时间BCD格式
* @param hours 小时最小0x00最大0x23
* @param minutes 分钟最小0x00最大0x59
* @param seconds 秒钟最小0x00最大0x59
* @retval 无
*/
__STATIC_INLINE void std_rtc_time_config(uint32_t hours, uint32_t minutes, uint32_t seconds)
{
uint32_t temp;
temp = (((hours & 0xF0U) << (RTC_TR_HT_POS - 4U)) | ((hours & 0x0FU) << RTC_TR_HU_POS)) \
| (((minutes & 0xF0U) << (RTC_TR_MNT_POS - 4U)) | ((minutes & 0x0FU) << RTC_TR_MNU_POS)) \
| (((seconds & 0xF0U) << (RTC_TR_ST_POS - 4U)) | ((seconds & 0x0FU) << RTC_TR_SU_POS));
RTC->TR = temp;
}
/**
* @brief 读取日历时间BCD格式
* @retval uint32_t 时间(时钟+分钟+秒钟)
*/
__STATIC_INLINE uint32_t std_rtc_time_get_time(void)
{
return (RTC->TR);
}
/**
* @brief 设置日历小时BCD格式
* @param hours 小时最小0x00最大0x23
* @retval 无
*/
__STATIC_INLINE void std_rtc_time_set_hour(uint32_t hours)
{
MODIFY_REG(RTC->TR, RTC_HOUR_MASK,
(((hours & 0xF0U) << (RTC_TR_HT_POS - 4U)) | ((hours & 0x0FU) << RTC_TR_HU_POS)));
}
/**
* @brief 设置日历分钟BCD格式
* @param minutes 分钟最小0x00最大0x59
* @retval 无
*/
__STATIC_INLINE void std_rtc_time_set_minute(uint32_t minutes)
{
MODIFY_REG(RTC->TR, RTC_MINUTE_MASK,
(((minutes & 0xF0U) << (RTC_TR_MNT_POS - 4U)) | ((minutes & 0x0FU) << RTC_TR_MNU_POS)));
}
/**
* @brief 设置日历秒钟BCD格式
* @param seconds 秒钟最小0x00最大0x59
* @retval 无
*/
__STATIC_INLINE void std_rtc_time_set_second(uint32_t seconds)
{
MODIFY_REG(RTC->TR, RTC_SECOND_MASK,
(((seconds & 0xF0U) << (RTC_TR_ST_POS - 4U)) | ((seconds & 0x0FU) << RTC_TR_SU_POS)));
}
/**
* @brief 设置日历亚秒
* @param subseconds 亚秒最小0x00最大0xff单位1/256 s
* @retval 无
*/
__STATIC_INLINE void std_rtc_time_set_subsecond(uint32_t subseconds)
{
RTC->SSR = subseconds;
}
/**
* @brief 读取日历亚秒BCD格式
* @retval uint32_t 亚秒
*/
__STATIC_INLINE uint32_t std_rtc_time_get_subsecond(void)
{
return (RTC->SSR);
}
/**
* @brief 选择RTC时钟输出信号
* @param rtc_out 校准时钟输出信号
* @arg RTC_OUTPUT_APRE_256HZ
* @arg RTC_OUTPUT_SPRE_1HZ
* @arg ...
* @arg RTC_OUTPUT_CALIB_CYCLE
* @retval 无
*/
__STATIC_INLINE void std_rtc_out_config(uint32_t rtc_out)
{
MODIFY_REG(RTC->CR, RTC_CR_OUT_SEL, rtc_out);
}
/**
* @brief 读取RTC时钟输出信号
* @retval uint32_t 校准时钟输出信号
* @arg RTC_OUTPUT_APRE_256HZ
* @arg RTC_OUTPUT_SPRE_1HZ
* @arg ...
* @arg RTC_OUTPUT_CALIB_CYCLE
*/
__STATIC_INLINE uint32_t std_rtc_get_rtc_out(void)
{
return (RTC->CR & RTC_CR_OUT_SEL);
}
/**
* @brief 设置RTC OUT信号输出极性
* @param polarity 输出极性
* @arg RTC_OUT_POLARITY_NORMAL
* @arg RTC_OUT_POLARITY_REVERSE
* @retval 无
*/
__STATIC_INLINE void std_rtc_set_output_polarity(uint32_t polarity)
{
MODIFY_REG(RTC->CR, RTC_CR_POL, polarity);
}
/**
* @brief 读取RTC OUT信号输出极性
* @retval uint32_t 输出极性
* @arg RTC_OUT_POLARITY_NORMAL
* @arg RTC_OUT_POLARITY_REVERSE
*/
__STATIC_INLINE uint32_t std_rtc_get_output_polarity(void)
{
return (RTC->CR & RTC_CR_POL);
}
/**
* @brief 使能RTC OUT信号输出
* @retval 无
*/
__STATIC_INLINE void std_rtc_output_enable(void)
{
RTC->CR |= RTC_CR_OUTEN;
}
/**
* @brief 关闭RTC OUT信号输出
* @retval 无
*/
__STATIC_INLINE void std_rtc_output_disable(void)
{
RTC->CR &= (~RTC_CR_OUTEN);
}
/**
* @brief 使能RTC周期定时中断
* @param wut_interrupt_sel
* @arg RTC_WUT_INTERRUPT_DAY
* @arg RTC_WUT_INTERRUPT_HOUR
* @arg ...
* @arg RTC_WUT_INTERRUPT_1024HZ
* @retval 无
*/
__STATIC_INLINE void std_rtc_wut_interrupt_enable(uint32_t wut_interrupt_sel)
{
RTC->WUT |= wut_interrupt_sel;
}
/**
* @brief 禁止RTC周期定时中断
* @param wut_interrupt_sel
* @arg RTC_WUT_INTERRUPT_DAY
* @arg RTC_WUT_INTERRUPT_HOUR
* @arg ...
* @arg RTC_WUT_INTERRUPT_1024HZ
* @retval 无
*/
__STATIC_INLINE void std_rtc_wut_interrupt_disable(uint32_t wut_interrupt_sel)
{
RTC->WUT &= (~wut_interrupt_sel);
}
/**
* @brief 读取RTC周期定时中断使能状态
* @param wut_interrupt_sel
* @arg RTC_WUT_INTERRUPT_DAY
* @arg RTC_WUT_INTERRUPT_HOUR
* @arg ...
* @arg RTC_WUT_INTERRUPT_1024HZ
* @retval bool 标志状态
* @arg true 表示定时中断使能
* @arg false 表示定时中断关闭
*/
__STATIC_INLINE bool std_rtc_get_wut_interrupt_enable(uint32_t wut_interrupt_sel)
{
return ((RTC->WUT & wut_interrupt_sel) == wut_interrupt_sel);
}
/**
* @brief 使能闹钟
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_enable(void)
{
RTC->CR |= RTC_CR_ALARME;
}
/**
* @brief 禁止闹钟
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_disable(void)
{
RTC->CR &= (~RTC_CR_ALARME);
}
/**
* @brief 配置闹钟时间BCD格式
* @param hours 小时最小0x00最大0x23
* @param minutes 分钟最小0x00最大0x59
* @param seconds 秒钟最小0x00最大0x59
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_config(uint32_t hours, uint32_t minutes, uint32_t seconds)
{
register uint32_t temp;
temp = (((hours & 0xF0U) << (RTC_ALARMR_HT_POS - 4U)) | ((hours & 0x0FU) << RTC_ALARMR_HU_POS))
| (((minutes & 0xF0U) << (RTC_ALARMR_MNT_POS - 4U)) | ((minutes & 0x0FU) << RTC_ALARMR_MNU_POS))
| (((seconds & 0xF0U) << (RTC_ALARMR_ST_POS - 4U)) | ((seconds & 0x0FU) << RTC_ALARMR_SU_POS));
MODIFY_REG(RTC->ALARMR, (RTC_ALARM_HOUR_MASK | RTC_ALARM_MINUTE_MASK | RTC_ALARM_SECOND_MASK), temp);
}
/**
* @brief 读取闹钟时间BCD格式
* @retval uint32_t 时间(时+分+秒)
*/
__STATIC_INLINE uint32_t std_rtc_alarm_get_time(void)
{
return (uint32_t)(RTC->ALARMR & (RTC_ALARM_HOUR_MASK | RTC_ALARM_MINUTE_MASK | RTC_ALARM_SECOND_MASK));
}
/**
* @brief 设置闹钟小时BCD格式
* @param hours 小时最小0x00最大0x23
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_set_hour(uint32_t hours)
{
MODIFY_REG(RTC->ALARMR, RTC_ALARM_HOUR_MASK,
(((hours & 0xF0U) << (RTC_ALARMR_HT_POS - 4U)) | ((hours & 0x0FU) << RTC_ALARMR_HU_POS)));
}
/**
* @brief 读取闹钟小时BCD格式
* @retval uint32_t 小时最小0x00最大0x23
*/
__STATIC_INLINE uint32_t std_rtc_alarm_get_hour(void)
{
return ((RTC->ALARMR & RTC_ALARM_HOUR_MASK) >> RTC_ALARMR_HU_POS);
}
/**
* @brief 设置闹钟分钟BCD格式
* @param minutes 分钟最小0x00最大0x59
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_set_minute(uint32_t minutes)
{
MODIFY_REG(RTC->ALARMR, RTC_ALARM_MINUTE_MASK,
(((minutes & 0xF0U) << (RTC_ALARMR_MNT_POS - 4U)) | ((minutes & 0x0FU) << RTC_ALARMR_MNU_POS)));
}
/**
* @brief 读取闹钟分钟BCD格式
* @retval uint32_t 分钟最小0x00最大0x59
*/
__STATIC_INLINE uint32_t std_rtc_alarm_get_minute(void)
{
return ((RTC->ALARMR & RTC_ALARM_MINUTE_MASK) >> RTC_ALARMR_MNU_POS);
}
/**
* @brief 设置闹钟秒钟BCD格式
* @param seconds 秒钟最小0x00最大0x59
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_set_second(uint32_t seconds)
{
MODIFY_REG(RTC->ALARMR, RTC_ALARM_SECOND_MASK,
(((seconds & 0xF0U) << (RTC_ALARMR_ST_POS - 4U)) | ((seconds & 0x0FU) << RTC_ALARMR_SU_POS)));
}
/**
* @brief 读取闹钟秒钟BCD格式
* @retval uint32_t 秒钟最小0x00最大0x59
*/
__STATIC_INLINE uint32_t std_rtc_alarm_get_second(void)
{
return ((RTC->ALARMR & RTC_ALARM_SECOND_MASK) >> RTC_ALARMR_SU_POS);
}
/**
* @brief 使能闹钟中断
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_interrupt_enable(void)
{
RTC->CR |= RTC_CR_ALARMIE;
}
/**
* @brief 禁止闹钟中断
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_interrupt_disable(void)
{
RTC->CR &= (~RTC_CR_ALARMIE);
}
/**
* @brief 读取RTC闹钟中断使能状态
* @retval bool 标志状态
* @arg true 表示闹钟中断使能
* @arg false 表示闹钟中断关闭
*/
__STATIC_INLINE bool std_rtc_get_alarm_interrupt_enable()
{
return ((RTC->CR & RTC_CR_ALARMIE) == RTC_CR_ALARMIE);
}
/**
* @brief 设置闹钟时间屏蔽
* @param alarm_mask 时间屏蔽位组合
* @arg RTC_ALARM_MASK_NONE
* @arg RTC_ALARM_MASK_HOURS
* @arg ...
* @arg RTC_ALARM_MASK_MINSEC
* @retval 无
*/
__STATIC_INLINE void std_rtc_alarm_set_mask(uint32_t alarm_mask)
{
MODIFY_REG(RTC->ALARMR, RTC_ALARMR_MSKALL, alarm_mask);
}
/**
* @brief 读取闹钟时间屏蔽
* @retval uint32_t 时间屏蔽位
* @arg RTC_ALARM_MASK_NONE
* @arg RTC_ALARM_MASK_HOURS
* @arg ...
* @arg RTC_ALARM_MASK_MINSEC
*/
__STATIC_INLINE uint32_t std_rtc_alarm_get_mask(void)
{
return (RTC->ALARMR & RTC_ALARM_MASK_ALL);
}
/**
* @brief 读取时钟数字平滑校准状态
* @retval bool 时钟数字平滑校准状态
* @arg true 表示校准参数已写入,尚未生效
* @arg false 表示校准参数已生效,可写入新值
*/
__STATIC_INLINE bool std_rtc_cal_get_status(void)
{
return ((RTC->CSR & RTC_CSR_CALSTA) == RTC_CSR_CALSTA);
}
/**
* @brief 配置数字平滑校准参数
* @param calib_plus 插入时钟脉冲控制
* @arg RTC_SMOOTH_CALIB_PLUS_PULSES_RESET
* @arg RTC_SMOOTH_CALIB_PLUS_PULSES_SET
* @param calib_minus 屏蔽时钟脉冲个数
* @retval 无
*/
__STATIC_INLINE void std_rtc_cal_config(uint32_t calib_plus, uint32_t calib_minus)
{
RTC->CALR = (uint32_t)(calib_plus | calib_minus);
}
/**
* @brief 读取数字平滑校准插入时钟脉冲
* @retval uint32_t 数字平滑校准插入时钟脉冲
* @arg RTC_SMOOTH_CALIB_PLUS_PULSES_RESET
* @arg RTC_SMOOTH_CALIB_PLUS_PULSES_SET
*/
__STATIC_INLINE uint32_t std_rtc_cal_get_plus(void)
{
return (RTC->CALR & RTC_CALR_CALP);
}
/**
* @brief 读取数字平滑校准脉冲屏蔽个数
* @retval uint32_t 数字平滑校准脉冲屏蔽个数最小0x00最大0x1FF
*/
__STATIC_INLINE uint32_t std_rtc_cal_get_minus(void)
{
return (RTC->CALR & RTC_CALR_CALM);
}
/**
* @brief 使能校准周期中断
* @retval 无
*/
__STATIC_INLINE void std_rtc_calib_interrupt_enable(void)
{
RTC->CR |= RTC_CR_CALIE;
}
/**
* @brief 禁止校准周期中断
* @retval 无
*/
__STATIC_INLINE void std_rtc_calib_interrupt_disable(void)
{
RTC->CR &= (~RTC_CR_CALIE);
}
/**
* @brief 读取RTC校准周期中断使能状态
* @retval bool 标志状态
* @arg true 表示RTC校准周期中断使能
* @arg false 表示RTC校准周期中断关闭
*/
__STATIC_INLINE bool std_rtc_get_calib_interrupt_enable()
{
return ((RTC->CR & RTC_CR_CALIE) == RTC_CR_CALIE);
}
/**
* @brief 读取时间戳日期BCD格式
* @retval uint32_t 日期
*/
__STATIC_INLINE uint32_t std_rtc_timestamp_get_day(void)
{
return (RTC->TSDR & (RTC_TSDR_DT | RTC_TSDR_DU));
}
/**
* @brief 读取时间戳月份BCD格式
* @retval uint32_t 月份
* @arg RTC_MONTH_JANUARY
* @arg RTC_MONTH_FEBRUARY
* @arg ...
* @arg RTC_MONTH_DECEMBER
*/
__STATIC_INLINE uint32_t std_rtc_timestamp_get_month(void)
{
return ((RTC->TSDR & (RTC_TSDR_MT | RTC_TSDR_MU)) >> RTC_TSDR_MU_POS);
}
/**
* @brief 读取时间戳日期BCD格式
* @retval uint32_t 日期(月份+日期)
*/
__STATIC_INLINE uint32_t std_rtc_timestamp_get_date(void)
{
return (RTC->TSDR);
}
/**
* @brief 读取时间戳小时BCD格式
* @retval uint32_t 小时最小0x00最大0x23
*/
__STATIC_INLINE uint32_t std_rtc_timestamp_get_hour(void)
{
return ((RTC->TSTR & (RTC_TSTR_HT | RTC_TSTR_HU)) >> RTC_TSTR_HU_POS);
}
/**
* @brief 读取时间戳分钟BCD格式
* @retval uint32_t 分钟最小0x00最大0x59
*/
__STATIC_INLINE uint32_t std_rtc_timestamp_get_minute(void)
{
return ((RTC->TSTR & (RTC_TSTR_MNT | RTC_TSTR_MNU)) >> RTC_TSTR_MNU_POS);
}
/**
* @brief 读取时间戳秒钟BCD格式
* @retval uint32_t 秒钟最小0x00最大0x59
*/
__STATIC_INLINE uint32_t std_rtc_timestamp_get_second(void)
{
return (RTC->TSTR & (RTC_TSTR_ST | RTC_TSTR_SU));
}
/**
* @brief 读取时间戳时间BCD格式
* @retval uint32_t 时间(时钟+分钟+秒钟)
*/
__STATIC_INLINE uint32_t std_rtc_timestamp_get_time(void)
{
return (RTC->TSTR);
}
/**
* @brief 读取状态标志
* @param flag 标志
* @arg RTC_FLAG_ALARM
* @arg RTC_FLAG_CALIBRATION
* @arg ...
* @arg RTC_FLAG_1024HZ
* @retval bool 标志状态
* @arg true 表示标志置1
* @arg false 表示标志清0
*/
__STATIC_INLINE bool std_rtc_get_flag(uint32_t flag)
{
return ((RTC->SR & flag) == flag);
}
/**
* @brief 读取中断状态标志
* @param interrupt 标志
* @arg RTC_INTERRUPT_FLAG_ALARM
* @arg RTC_INTERRUPT_FLAG_CALIBRATION
* @arg ...
* @arg RTC_INTERRUPT_FLAG_1024HZ
* @retval bool 中断状态
* @arg true 表示中断已发生
* @arg false 表示中断未发生
*/
__STATIC_INLINE bool std_rtc_get_interrupt_flag(uint32_t interrupt)
{
return ((RTC->ISR & interrupt) == interrupt);
}
/**
* @brief 清除状态标志
* @param flag 标志
* @arg RTC_CLEAR_ALARM
* @arg RTC_CLEAR_CALIBRATION
* @arg ...
* @arg RTC_CLEAR_1024HZ
* @retval 无
*/
__STATIC_INLINE void std_rtc_clear_flag(uint32_t flag)
{
RTC->CLR = flag;
}
void std_rtc_deinit(void);
std_status_t std_rtc_date_init(std_rtc_date_t *rtc_date_init_param);
void std_rtc_date_struct_init(std_rtc_date_t *rtc_date_init_struct);
std_status_t std_rtc_time_init(std_rtc_time_t *rtc_time_init_param);
void std_rtc_time_struct_init(std_rtc_time_t *rtc_time_init_struct);
void std_rtc_alarm_init(std_rtc_alarm_t *rtc_alarm_init_param);
void std_rtc_alarm_struct_init(std_rtc_alarm_t *rtc_alarm_init_struct);
std_status_t std_rtc_init_mode_enter(void);
std_status_t std_rtc_init_mode_exit(void);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
/**
* @}
*/
/**
* @}
*/
#endif /* CIU32L051_STD_RTC_H */