/********************************** (C) COPYRIGHT  *******************************
* File Name          : ch32f20x_bkp.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2021/08/08
* Description        : This file provides all the BKP firmware functions.
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************/
#include "ch32f20x_bkp.h"
#include "ch32f20x_rcc.h"

/* BKP registers bit mask */

/* OCTLR register bit mask */
#define OCTLR_CAL_MASK    ((uint16_t)0xFF80)
#define OCTLR_MASK        ((uint16_t)0xFC7F)

/*********************************************************************
 * @fn      BKP_DeInit
 *
 * @brief   Deinitializes the BKP peripheral registers to their default reset values.
 *
 * @return  none
 */
void BKP_DeInit( void )
{
    RCC_BackupResetCmd( ENABLE );
    RCC_BackupResetCmd( DISABLE );
}

/*********************************************************************
 * @fn      BKP_TamperPinLevelConfig
 *
 * @brief   Configures the Tamper Pin active level.
 *
 * @param   BKP_TamperPinLevel: specifies the Tamper Pin active level.
 *            BKP_TamperPinLevel_High - Tamper pin active on high level.
 *            BKP_TamperPinLevel_Low - Tamper pin active on low level.
 *
 * @return  none
 */
void BKP_TamperPinLevelConfig( uint16_t BKP_TamperPinLevel )
{
    if( BKP_TamperPinLevel )
    {
        BKP->TPCTLR |= ( ( uint32_t )1 << 1 );
    }
    else
    {
        BKP->TPCTLR &= ~( ( uint32_t )1 << 1 );
    }
}

/*********************************************************************
 * @fn      BKP_TamperPinCmd
 *
 * @brief   Enables or disables the Tamper Pin activation.
 *
 * @param   NewState - ENABLE or DISABLE.
 *
 * @return  none
 */
void BKP_TamperPinCmd( FunctionalState NewState )
{
    if( NewState )
    {
        BKP->TPCTLR |= ( ( uint32_t )1 << 0 );
    }
    else
    {
        BKP->TPCTLR &= ~( ( uint32_t )1 << 0 );
    }
}

/*********************************************************************
 * @fn      BKP_ITConfig
 *
 * @brief   Enables or disables the Tamper Pin Interrupt.
 *
 * @param   NewState - ENABLE or DISABLE.
 *
 * @return  none
 */
void BKP_ITConfig( FunctionalState NewState )
{
    if( NewState )
    {
        BKP->TPCSR |= ( ( uint32_t )1 << 2 );
    }
    else
    {
        BKP->TPCSR &= ~( ( uint32_t )1 << 2 );
    }
}

/*********************************************************************
 * @fn      BKP_RTCOutputConfig
 *
 * @brief   Select the RTC output source to output on the Tamper pin.
 *
 * @param   BKP_RTCOutputSource - specifies the RTC output source.
 *            BKP_RTCOutputSource_None - no RTC output on the Tamper pin.
 *            BKP_RTCOutputSource_CalibClock - output the RTC clock with
 *        frequency divided by 64 on the Tamper pin.
 *            BKP_RTCOutputSource_Alarm - output the RTC Alarm pulse signal
 *        on the Tamper pin.
 *            BKP_RTCOutputSource_Second - output the RTC Second pulse
 *        signal on the Tamper pin.
 *
 * @return  none
 */
void BKP_RTCOutputConfig( uint16_t BKP_RTCOutputSource )
{
    uint16_t tmpreg = 0;

    tmpreg = BKP->OCTLR;
    tmpreg &= OCTLR_MASK;
    tmpreg |= BKP_RTCOutputSource;
    BKP->OCTLR = tmpreg;
}

/*********************************************************************
 * @fn      BKP_SetRTCCalibrationValue
 *
 * @brief   Sets RTC Clock Calibration value.
 *
 * @param   CalibrationValue - specifies the RTC Clock Calibration value.
 *            This parameter must be a number between 0 and 0x1F.
 *
 * @return  none
 */
void BKP_SetRTCCalibrationValue( uint8_t CalibrationValue )
{
    uint16_t tmpreg = 0;

    tmpreg = BKP->OCTLR;
    tmpreg &= OCTLR_CAL_MASK;
    tmpreg |= CalibrationValue;
    BKP->OCTLR = tmpreg;
}

/*********************************************************************
 * @fn      BKP_WriteBackupRegister
 *
 * @brief   Writes user data to the specified Data Backup Register.
 *
 * @param   BKP_DR - specifies the Data Backup Register.
 *          Data - data to write.
 *
 * @return  none
 */
void BKP_WriteBackupRegister( uint16_t BKP_DR, uint16_t Data )
{
    __IO uint32_t tmp = 0;

    tmp = ( uint32_t )BKP_BASE;
    tmp += BKP_DR;
    *( __IO uint32_t * ) tmp = Data;
}

/*********************************************************************
 * @fn      BKP_ReadBackupRegister
 *
 * @brief   Reads data from the specified Data Backup Register.
 *
 * @param   BKP_DR - specifies the Data Backup Register.
 *            This parameter can be BKP_DRx where x=[1, 42].
 *
 * @return  none
 */
uint16_t BKP_ReadBackupRegister( uint16_t BKP_DR )
{
    __IO uint32_t tmp = 0;

    tmp = ( uint32_t )BKP_BASE;
    tmp += BKP_DR;

    return ( *( __IO uint16_t * ) tmp );
}

/*********************************************************************
 * @fn      BKP_GetFlagStatus
 *
 * @brief   Checks whether the Tamper Pin Event flag is set or not.
 *
 * @return  FlagStatus - SET or RESET.
 */
FlagStatus BKP_GetFlagStatus( void )
{
    if( BKP->TPCSR & ( 1 << 8 ) )
    {
        return SET;
    }
    else
    {
        return RESET;
    }
}

/*********************************************************************
 * @fn      BKP_ClearFlag
 *
 * @brief   Clears Tamper Pin Event pending flag.
 *
 * @return  none
 */
void BKP_ClearFlag( void )
{
    BKP->TPCSR |= BKP_CTE;
}

/*********************************************************************
 * @fn      BKP_GetITStatus
 *
 * @brief   Checks whether the Tamper Pin Interrupt has occurred or not.
 *
 * @return  ITStatus - SET or RESET.
 */
ITStatus BKP_GetITStatus( void )
{
    if( BKP->TPCSR & ( ( uint32_t )1 << 9 ) )
    {
        return SET;
    }
    else
    {
        return RESET;
    }
}

/*********************************************************************
 * @fn      BKP_ClearITPendingBit
 *
 * @brief   Clears Tamper Pin Interrupt pending bit.
 *
 * @return  none
 */
void BKP_ClearITPendingBit( void )
{
    BKP->TPCSR |= BKP_CTI;
}






