268 lines
6.3 KiB
C
268 lines
6.3 KiB
C
|
/************************************************************************************************/
|
|||
|
/**
|
|||
|
* @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 */
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|