/**
 *******************************************************************************
 * @file  hc32_ll_ctc.h
 * @brief This file contains all the functions prototypes of the Clock Trimming
 *        Controller(CTC) driver library.
 @verbatim
   Change Logs:
   Date             Author          Notes
   2022-12-31       CDT             First version
 @endverbatim
 *******************************************************************************
 * Copyright (C) 2022, Xiaohua Semiconductor Co., Ltd. All rights reserved.
 *
 * This software component is licensed by XHSC under BSD 3-Clause license
 * (the "License"); You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                    opensource.org/licenses/BSD-3-Clause
 *
 *******************************************************************************
 */
#ifndef __HC32_LL_CTC_H__
#define __HC32_LL_CTC_H__

/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif

/*******************************************************************************
 * Include files
 ******************************************************************************/
#include "hc32_ll_def.h"

#include "hc32f4xx.h"
#include "hc32f4xx_conf.h"

/**
 * @addtogroup LL_Driver
 * @{
 */

/**
 * @addtogroup LL_CTC
 * @{
 */

#if (LL_CTC_ENABLE == DDL_ON)

/*******************************************************************************
 * Global type definitions ('typedef')
 ******************************************************************************/
/**
 * @defgroup CTC_Global_Types CTC Global Types
 * @{
 */

/**
 * @brief CTC continuous trim initialization structure definition
 */
typedef struct {
    uint32_t  u32HrcClockDiv;       /*!< HRC clock division
                                         This parameter can be a value of @ref CTC_HRC_Clock_Division */
    uint32_t  u32RefClockFreq;      /*!< Reference clock frequency
                                         This parameter should refer user manual recommended values */
    uint32_t  u32RefClockSrc;       /*!< Reference clock source selection
                                         This parameter can be a value of @ref CTC_Continuous_Trim_Reference_Clock_Source */
    uint32_t  u32RefClockDiv;       /*!< Reference clock division
                                         This parameter can be a value of @ref CTC_Reference_Clock_Division */
    float32_t f32TolerantErrRate;   /*!< CTC tolerance deviation
                                         This parameter can be a value between Min_Data=0.0 and Max_Data=1.0(100%) */
    uint8_t   u8TrimValue;          /*!< CTC TRMVAL value
                                         This parameter can be a value between Min_Data=0 and Max_Data=0x3F */
} stc_ctc_ct_init_t;

/**
 * @brief CTC single trim initialization structure definition
 */
typedef struct {
    uint32_t  u32HrcClockDiv;       /*!< HRC clock division
                                         This parameter can be a value of @ref CTC_HRC_Clock_Division */
    uint32_t  u32CtcRefEdge;        /*!< CTCREF edge
                                         This parameter can be a value of @ref CTC_Single_Trim_CTCREF_Edge */
    float32_t f32CtcRefEdgeTime;    /*!< CTCREF edge time(unit:S)
                                         This parameter should refer user actual CTCREF edge time */
    float32_t f32TolerantErrRate;   /*!< CTC tolerance deviation
                                         This parameter can be a value between Min_Data=0.0 and Max_Data=1.0(100%) */
    uint8_t  u8TrimValue;           /*!< CTC TRMVAL value
                                         This parameter can be a value between Min_Data=0 and Max_Data=0x3F */
} stc_ctc_st_init_t;

/**
 * @}
 */

/*******************************************************************************
 * Global pre-processor symbols/macros ('#define')
 ******************************************************************************/
/**
 * @defgroup CTC_Global_Macros CTC Global Macros
 * @{
 */

/**
 * @defgroup CTC_Continuous_Trim_Reference_Clock_Source CTC Continuous Trim Reference Clock Source
 * @{
 */
#define CTC_REF_CLK_SRC_CTCREF          (0UL)               /*!< Clock source: CTCREF */
#define CTC_REF_CLK_SRC_XTAL            (CTC_CR1_REFCKS)    /*!< Clock source: XTAL */
#define CTC_REF_CLK_SRC_XTAL32          (CTC_CR1_REFCKS_1)  /*!< Clock source: XTAL32 */
/**
 * @}
 */

/**
 * @defgroup CTC_Flag CTC Flag
 * @{
 */
#define CTC_FLAG_TRIM_OK                (CTC_STR_TRIMOK)    /*!< Trimming OK flag */
#define CTC_FLAG_TRIM_OVF               (CTC_STR_TRMOVF)    /*!< Trimming overflow flag */
#define CTC_FLAG_TRIM_UDF               (CTC_STR_TRMUDF)    /*!< Trimming underflow flag */
#define CTC_FLAG_BUSY                   (CTC_STR_CTCBSY)    /*!< CTC busy flag */
#define CTC_FLAG_ALL                    (CTC_FLAG_TRIM_OVF | CTC_FLAG_TRIM_UDF | \
                                         CTC_FLAG_TRIM_OK  | CTC_FLAG_BUSY)
/**
 * @}
 */

/**
 * @defgroup CTC_Reference_Clock_Division CTC Reference Clock Division
 * @{
 */
#define CTC_REF_CLK_DIV2                (0UL)   /*!< REFCLK/2 */
#define CTC_REF_CLK_DIV4                (1UL)   /*!< REFCLK/4 */
#define CTC_REF_CLK_DIV8                (2UL)   /*!< REFCLK/8 */
#define CTC_REF_CLK_DIV16               (3UL)   /*!< REFCLK/16 */
#define CTC_REF_CLK_DIV64               (4UL)   /*!< REFCLK/64 */
#define CTC_REF_CLK_DIV256              (5UL)   /*!< REFCLK/256 */
#define CTC_REF_CLK_DIV1024             (6UL)   /*!< REFCLK/1024 */
#define CTC_REF_CLK_DIV4096             (7UL)   /*!< REFCLK/4096 */
/**
 * @}
 */

/**
 * @defgroup CTC_HRC_Clock_Division CTC HRC Clock Division
 * @{
 */
#define CTC_HRC_CLK_DIV1                (0UL)   /*!< HRCCLK/1 */
#define CTC_HRC_CLK_DIV2                (1UL)   /*!< HRCCLK/2 */
#define CTC_HRC_CLK_DIV4                (2UL)   /*!< HRCCLK/4 */
#define CTC_HRC_CLK_DIV8                (3UL)   /*!< HRCCLK/8 */
#define CTC_HRC_CLK_DIV32               (4UL)   /*!< HRCCLK/32 */
#define CTC_HRC_CLK_DIV128              (5UL)   /*!< HRCCLK/128 */
#define CTC_HRC_CLK_DIV512              (6UL)   /*!< HRCCLK/512 */
#define CTC_HRC_CLK_DIV2048             (7UL)   /*!< HRCCLK/2048 */
/**
 * @}
 */

/**
 * @defgroup CTC_Single_Trim_CTCREF_Edge CTC Single Trim CTCREF Edge
 * @{
 */
#define CTC_CTCREF_RISING_RISING        (0UL)               /*!< CTC trim between CTCREF rising and CTCREF rising */
#define CTC_CTCREF_RISING_FALLING       (CTC_CR1_REFEDG_0)  /*!< CTC trim between CTCREF rising and CTCREF failing */
#define CTC_CTCREF_FALLING_RISING       (CTC_CR1_REFEDG_1)  /*!< CTC trim between CTCREF failing and CTCREF rising */
#define CTC_CTCREF_FALLING_FALLING      (CTC_CR1_REFEDG)    /*!< CTC trim between CTCREF failing and CTCREF failing */
/**
 * @}
 */

/**
 * @}
 */

/*******************************************************************************
 * Global variable definitions ('extern')
 ******************************************************************************/

/*******************************************************************************
  Global function prototypes (definition in C source)
 ******************************************************************************/
/**
 * @addtogroup CTC_Global_Functions
 * @{
 */

/**
 * @brief  Start CTC trimming.
 * @param  None
 * @retval None
 */
__STATIC_INLINE void CTC_Start(void)
{
    SET_REG32_BIT(CM_CTC->CR1, CTC_CR1_CTCEN);
}

/**
 * @brief  Stop CTC trimming.
 * @param  None
 * @retval None
 */
__STATIC_INLINE void CTC_Stop(void)
{
    CLR_REG32_BIT(CM_CTC->CR1, CTC_CR1_CTCEN);
}

int32_t CTC_CT_StructInit(stc_ctc_ct_init_t *pstcCtcInit);
int32_t CTC_CT_Init(const stc_ctc_ct_init_t *pstcCtcInit);

int32_t CTC_ST_StructInit(stc_ctc_st_init_t *pstcCtcInit);
int32_t CTC_ST_Init(const stc_ctc_st_init_t *pstcCtcInit);

int32_t CTC_DeInit(void);
void CTC_IntCmd(en_functional_state_t enNewState);
en_flag_status_t CTC_GetStatus(uint32_t u32Flag);
void CTC_SetTrimValue(uint8_t u8TrimValue);
uint8_t CTC_GetTrimValue(void);
void CTC_SetReloadValue(uint16_t u16ReloadValue);
uint16_t CTC_GetReloadValue(void);
void CTC_SetOffsetValue(uint8_t u8OffsetValue);
uint8_t CTC_GetOffsetValue(void);

uint16_t CTC_GetCountValue(void);

/**
 * @}
 */

#endif /* LL_CTC_ENABLE */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* __HC32_LL_CTC_H__ */

/*******************************************************************************
 * EOF (not truncated)
 ******************************************************************************/
