CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Source/ciu32l051_std_rtc.c

268 lines
6.3 KiB
C
Raw Normal View History

/************************************************************************************************/
/**
* @file ciu32l051_std_rtc.c
* @author MCU Ecosystem Development Team
* @brief RTC STD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTCģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>API<EFBFBD><EFBFBD>
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/
/************************************************************************************************/
/**
* @addtogroup CIU32L051_STD_Driver
* @{
*/
/**
* @addtogroup RTC
* @{
*
*/
/************************************************************************************************/
/*------------------------------------------includes--------------------------------------------*/
#include "ciu32l051_std.h"
#ifdef STD_RTC_PERIPHERAL_USED
/*---------------------------------------- functions-------------------------------------------*/
/************************************************************************************************/
/**
* @addtogroup RTC_External_Functions
* @{
*
*/
/************************************************************************************************/
/**
* @brief RTCȥ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_rtc_deinit(void)
{
/* <20>ر<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
std_rtc_write_protection_disable();
RTC->WUT = 0;
RTC->CR = 0;
while(std_rtc_cal_get_status())
{
}
RTC->CALR = 0;
RTC->ALARMR = 0;
/* <20><><EFBFBD><EFBFBD>RTC<54><43>ʼ<EFBFBD><CABC>ģʽ */
if (std_rtc_init_mode_enter() == STD_OK)
{
/* <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ֵ */
RTC->TR = 0;
RTC->DR = 0x00002101;
RTC->SSR = 0;
}
/* <20>˳<EFBFBD>RTC<54><43>ʼ<EFBFBD><CABC>ģʽ */
std_rtc_init_mode_exit();
/* RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> */
std_rtc_write_protection_enable();
/* <20><><EFBFBD><EFBFBD>SR<53><52>ISR<53>б<EFBFBD>־ */
RTC->CLR = 0xFFFFFFFF;
}
/**
* @brief RTC<EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param rtc_date_init_param RTC<EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
*/
std_status_t std_rtc_date_init(std_rtc_date_t *rtc_date_init_param)
{
std_status_t status = STD_ERR_TIMEOUT;
/* <20>ر<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
std_rtc_write_protection_disable();
/* <20><><EFBFBD><EFBFBD>RTC<54><43>ʼ<EFBFBD><CABC>ģʽ */
if (std_rtc_init_mode_enter() == STD_OK)
{
std_rtc_date_config(rtc_date_init_param->weekday, rtc_date_init_param->day,
rtc_date_init_param->month, rtc_date_init_param->year);
/* <20>˳<EFBFBD>RTC<54><43>ʼ<EFBFBD><CABC>ģʽ */
status = std_rtc_init_mode_exit();
}
/* RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> */
std_rtc_write_protection_enable();
return status;
}
/**
* @brief RTC<EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param rtc_date_init_struct RTC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_rtc_date_struct_init(std_rtc_date_t *rtc_date_init_struct)
{
/* <20><><EFBFBD><EFBFBD>һ/1<><31>/1<><31>/00<30><30> */
rtc_date_init_struct->weekday = RTC_WEEKDAY_MONDAY;
rtc_date_init_struct->month = RTC_MONTH_JANUARY;
rtc_date_init_struct->day = 1U;
rtc_date_init_struct->year = 0U;
}
/**
* @brief RTCʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param rtc_time_init_param RTCʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
*/
std_status_t std_rtc_time_init(std_rtc_time_t *rtc_time_init_param)
{
std_status_t status = STD_ERR_TIMEOUT;
/* <20>ر<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
std_rtc_write_protection_disable();
/* <20><><EFBFBD><EFBFBD>RTC<54><43>ʼ<EFBFBD><CABC>ģʽ */
if (std_rtc_init_mode_enter() == STD_OK)
{
std_rtc_time_config(rtc_time_init_param->hours,
rtc_time_init_param->minutes,
rtc_time_init_param->seconds);
/* <20>˳<EFBFBD>RTC<54><43>ʼ<EFBFBD><CABC>ģʽ */
status = std_rtc_init_mode_exit();
}
/* RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> */
std_rtc_write_protection_enable();
return status;
}
/**
* @brief RTCʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param rtc_time_init_struct RTC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_rtc_time_struct_init(std_rtc_time_t *rtc_time_init_struct)
{
/* 00ʱ:00<30><30>:00<30><30> */
rtc_time_init_struct->hours = 0U;
rtc_time_init_struct->minutes = 0U;
rtc_time_init_struct->seconds = 0U;
}
/**
* @brief RTC<EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param rtc_alarm_init_param RTC<EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_rtc_alarm_init(std_rtc_alarm_t *rtc_alarm_init_param)
{
/* <20>ر<EFBFBD>RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
std_rtc_write_protection_disable();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
std_rtc_alarm_config(rtc_alarm_init_param->time.hours,
rtc_alarm_init_param->time.minutes,
rtc_alarm_init_param->time.seconds);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ*/
std_rtc_alarm_set_mask(rtc_alarm_init_param->time_mask);
/* RTC<54>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> */
std_rtc_write_protection_enable();
}
/**
* @brief RTC<EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param rtc_alarm_init_struct RTC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_rtc_alarm_struct_init(std_rtc_alarm_t *rtc_alarm_init_struct)
{
rtc_alarm_init_struct->time_mask = RTC_ALARM_MASK_NONE;
/* <20><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><E1B9B9> */
std_rtc_time_struct_init(&rtc_alarm_init_struct->time);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ģʽ
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
*/
std_status_t std_rtc_init_mode_enter(void)
{
uint32_t timeout = RTC_INITMODE_TIMEOUT *(SystemCoreClock / 1000U);
std_status_t status = STD_OK;
/* <20><>ѯRTC<54><43>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ģʽ */
if (std_rtc_get_mode() == RTC_MODE_RUNNING)
{
/* <20><>ʼ<EFBFBD><CABC>ģʽʹ<CABD><CAB9> */
std_rtc_init_mode_enable();
/* <20>ȴ<EFBFBD>RTC<54><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ģʽ */
while (std_rtc_get_mode() == RTC_MODE_RUNNING)
{
if (timeout == 0U)
{
status = STD_ERR_TIMEOUT;
break;
}
timeout--;
}
}
return (status);
}
/**
* @brief <EFBFBD>˳<EFBFBD>RTC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ģʽ
* @retval std_status_t APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
*/
std_status_t std_rtc_init_mode_exit(void)
{
uint32_t timeout = RTC_INITMODE_TIMEOUT *(SystemCoreClock / 1000U);
std_status_t status = STD_OK;
/* <20><>ʼ<EFBFBD><CABC>ģʽ<C4A3><CABD>ֹ */
std_rtc_init_mode_disable();
/* <20>ȴ<EFBFBD>RTC<54>˳<EFBFBD><CBB3><EFBFBD>ʼ<EFBFBD><CABC>ģʽ */
while (std_rtc_get_mode() == RTC_MODE_INIT)
{
if (timeout == 0U)
{
status = STD_ERR_TIMEOUT;
break;
}
timeout--;
}
return (status);
}
/**
* @}
*/
#endif /* STD_RTC_PERIPHERAL_USED */
/**
* @}
*/
/**
* @}
*/