demo工程暂存 优化菜单界面UI和功能
This commit is contained in:
272
MCU/components/drivers/peripheral/Src/driver_pmu_rtc.c
Normal file
272
MCU/components/drivers/peripheral/Src/driver_pmu_rtc.c
Normal file
@ -0,0 +1,272 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
* @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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user