MXC-A36-Demo/MCU/components/drivers/peripheral/Src/driver_pmu_rtc.c

273 lines
6.9 KiB
C
Raw Normal View History

/*
******************************************************************************
* @file driver_pmu_rtc.c
* @author FreqChip Firmware Team
* @version V1.0.0
* @date 2023
* @brief rtc module driver.
* This file provides firmware functions to manage the
* Real Time Clock (RTC) peripheral
******************************************************************************
* @attention
*
* Copyright (c) 2023 FreqChip.
* All rights reserved.
******************************************************************************
*/
#include "fr30xx.h"
static str_Time_t AlarmTime_A;
static str_Time_t AlarmTime_B;
/*********************************************************************
* @fn rtc_AlarmA_Handler
*
* @brief Alarm interrupt handler
*/
__WEAK void rtc_AlarmA_Handler(void)
{
/* Update according to the periodic period in the rtc_AlarmConfig function. */
rtc_AlarmUpdate(AlARM_A);
}
/*********************************************************************
* @fn rtc_AlarmB_Handler
*
* @brief Alarm interrupt handler
*/
__WEAK void rtc_AlarmB_Handler(void)
{
/* Update according to the periodic period in the rtc_AlarmConfig function. */
rtc_AlarmUpdate(AlARM_B);
}
/*********************************************************************
* @fn rtc_init
*
* @brief rtc init
*
* @param InitValue: RTC init value.
*/
void rtc_init(uint32_t InitValue)
{
/* RTC clock enable */
ool_write(PMU_REG_CLK_EN, ool_read(PMU_REG_CLK_EN) | PMU_RTC_CLK_EN_BIT);
/* config init value */
ool_write32(PMU_REG_RTC_COUNTER_0, InitValue);
/* load init into cnt register */
ool_write(PMU_REG_RTC_CTRL, ool_read(PMU_REG_RTC_CTRL) | PMU_RTC_UPD_EN_BIT);
AlarmTime_A.UnitBackup = 0;
AlarmTime_B.UnitBackup = 0;
}
/*********************************************************************
* @fn rtc_CountEnable
*
* @brief RTC count enable
*/
void rtc_CountEnable(void)
{
ool_write(PMU_REG_CLK_EN, ool_read(PMU_REG_CLK_EN) | PMU_RTC_CLK_EN_BIT);
}
/*********************************************************************
* @fn rtc_CountDisable
*
* @brief RTC count disable
*/
void rtc_CountDisable(void)
{
ool_write(PMU_REG_CLK_EN, ool_read(PMU_REG_CLK_EN) & ~PMU_RTC_CLK_EN_BIT);
}
/*********************************************************************
* @fn rtc_AlarmConfig
*
* @brief rtc alarm config
*
* @param fe_Alarm: alarm select.
* @param lu8_hour: hour
* @param lu8_Minute: minute
* @param lu8_Second: second
*/
void rtc_AlarmConfig(enum_Alarm_t fe_Alarm, uint32_t fu32_hour, uint32_t fu32_Minute, uint32_t fu32_Second)
{
uint32_t lu32_Second;
lu32_Second = fu32_hour * 3600;
lu32_Second += fu32_Minute * 60;
lu32_Second += fu32_Second;
switch (fe_Alarm)
{
case AlARM_A:
{
/* Timing unit backup */
AlarmTime_A.UnitBackup = lu32_Second;
/* Convert to count value */
lu32_Second *= pmu_lp_rc_get();
lu32_Second += rtc_GetCount();
rtc_AlarmSet(AlARM_A, lu32_Second);
rtc_AlarmEnable(AlARM_A);
pmu_enable_isr(PMU_RTC_A_INT_MSK_BIT);
}break;
case AlARM_B:
{
/* Timing backup */
AlarmTime_B.UnitBackup = lu32_Second;
/* Convert to count value */
lu32_Second *= pmu_lp_rc_get();
lu32_Second += rtc_GetCount();
rtc_AlarmSet(AlARM_B, lu32_Second);
rtc_AlarmEnable(AlARM_B);
pmu_enable_isr(PMU_RTC_B_INT_MSK_BIT);
}break;
default: break;
}
}
/*********************************************************************
* @fn rtc_GetCount
*
* @brief Get rtc current counter value
*
* @param None.
* @return lu32_CountValue: rtc current counter value.
*/
uint32_t rtc_GetCount(void)
{
uint32_t lu32_CountValue;
/* get current RTC counter */
ool_write(PMU_REG_RTC_CTRL, ool_read(PMU_REG_RTC_CTRL) | PMU_RTC_SAMPLE_BIT);
while ( ool_read(PMU_REG_RTC_CTRL) & PMU_RTC_SAMPLE_BIT);
lu32_CountValue = ool_read32(PMU_REG_RTC_COUNTER_0);
return lu32_CountValue;
}
/*********************************************************************
* @fn rtc_CountUpdate
*
* @brief Update RTC counter
*
* @param fu32_CountValue: update value.
* @return None.
*/
void rtc_CountUpdate(uint32_t fu32_CountValue)
{
/* config init value */
ool_write32(PMU_REG_RTC_COUNTER_0, fu32_CountValue);
/* load init into cnt register */
ool_write(PMU_REG_RTC_CTRL, ool_read(PMU_REG_RTC_CTRL) | PMU_RTC_UPD_EN_BIT);
}
/*********************************************************************
* @fn rtc_AlarmUpdate
*
* @brief rtc alarm Update.
* Update according to the periodic period in the rtc_AlarmConfig function.
*
* @param fe_Alarm: alarm select.
*/
void rtc_AlarmUpdate(enum_Alarm_t fe_Alarm)
{
uint32_t lu32_AddValue;
uint32_t lu32_AlarmValue;
/* Convert to count value */
if (fe_Alarm == AlARM_A)
lu32_AddValue = AlarmTime_A.UnitBackup * pmu_lp_rc_get();
else
lu32_AddValue = AlarmTime_B.UnitBackup * pmu_lp_rc_get();
lu32_AlarmValue = rtc_AlarmRead(fe_Alarm);
lu32_AlarmValue += lu32_AddValue;
rtc_AlarmSet(fe_Alarm, lu32_AlarmValue);
}
/*********************************************************************
* @fn rtc_AlarmEnable
*
* @brief Alarm Enable
*/
void rtc_AlarmEnable(enum_Alarm_t fe_Alarm)
{
ool_write(PMU_REG_RTC_CTRL, ool_read(PMU_REG_RTC_CTRL) | fe_Alarm);
}
/*********************************************************************
* @fn rtc_ALarmDisable
*
* @brief Alarm Disable
*/
void rtc_AlarmDisable(enum_Alarm_t fe_Alarm)
{
ool_write(PMU_REG_RTC_CTRL, ool_read(PMU_REG_RTC_CTRL) & ~fe_Alarm);
}
/*********************************************************************
* @fn rtc_AlarmRead
*
* @brief read rtc alarm config value
*
* @return lu32_ConfigValue: alarm config value.
*/
uint32_t rtc_AlarmRead(enum_Alarm_t fe_Alarm)
{
uint32_t fu32_AlarmValue;
switch (fe_Alarm)
{
case AlARM_A:
{
fu32_AlarmValue = ool_read32(PMU_REG_ALARM_A_COUNTER_0);
}break;
case AlARM_B:
{
fu32_AlarmValue = ool_read32(PMU_REG_ALARM_B_COUNTER_0);
}break;
default: break;
}
return fu32_AlarmValue;
}
/*********************************************************************
* @fn rtc_AlarmSet
*
* @brief Set rtc alarm config value
*
* @param fu32_AlarmValue: alarm config value.
*/
void rtc_AlarmSet(enum_Alarm_t fe_Alarm, uint32_t fu32_AlarmValue)
{
switch (fe_Alarm)
{
case AlARM_A:
{
ool_write32(PMU_REG_ALARM_A_COUNTER_0, fu32_AlarmValue);
}break;
case AlARM_B:
{
ool_write32(PMU_REG_ALARM_B_COUNTER_0, fu32_AlarmValue);
}break;
}
}