/************************************************************************************************/
/**
* @file               ciu32l071_std_syscfg.h
* @author             MCU Ecosystem Development Team
* @brief              SYSCFG STD库驱动头文件。
*                     提供SYSCFG相关的STD库操作函数声明、数据类型以及常量的定义。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

/* 避免头文件重复引用 */
#ifndef CIU32L071_STD_SYSCFG_H
#define CIU32L071_STD_SYSCFG_H

/************************************************************************************************/
/**
* @addtogroup CIU32L071_STD_Driver
* @{
*/

/**
* @defgroup SYSCFG SYSCFG
* @brief 系统配置控制器的STD库驱动 
* @{
*
*/
/************************************************************************************************/

#ifdef __cplusplus
extern "C" {
#endif

/*------------------------------------includes--------------------------------------------------*/
#include "ciu32l071_std_common.h"

/*-------------------------------------define---------------------------------------------------*/

/************************************************************************************************/
/**
* @defgroup SYSCFG_Constants SYSCFG Constants
* @brief SYSCFG常量定义及宏定义
* @{
*
*/
/************************************************************************************************/
/* IRTIM调制信号选择 */
#define SYSCFG_IRMODE_TIM5_OC1                               SYSCFG_CR_IR_MODE_TIM5_OC1       /**< 调制信号源于TIM5_OC1  */
#define SYSCFG_IRMODE_USART1_TX                              SYSCFG_CR_IR_MODE_USART1_TX      /**< 调制信号源于USART1_TX */
#define SYSCFG_IRMODE_UART4_TX                               SYSCFG_CR_IR_MODE_UART4_TX       /**< 调制信号源于UART4_TX  */

/* IR_OUT输出信号极性选择 */
#define SYSCFG_IRPOLARITY_DIRECT                             (0x00000000U)                    /**< IRTIM 输出信号未反相  */
#define SYSCFG_IRPOLARITY_INVERSE                            SYSCFG_CR_IR_POL                 /**< IRTIM 输出信号反相    */

/* 存储器映射选择位 */
#define SYSCFG_MEM_MODE_USER_FLASH                           SYSCFG_CR_MEM_MODE_USER_FLASH    /**< 将User flash映射到地址0x0000 0000    */
#define SYSCFG_MEM_MODE_SYS_MEM                              SYSCFG_CR_MEM_MODE_SYS_MEM       /**< 将System memory映射到地址0x0000 0000 */
#define SYSCFG_MEM_MODE_SRAM                                 SYSCFG_CR_MEM_MODE_SRAM          /**< 将SRAM映射到地址0x0000 0000          */

/* 6bit DAC输入参考电压源 */
#define SYSCFG_6BIT_DAC_VREFBUF                              (0x00000000U)                    /**< 选择VREFBUF作为输入电压源            */
#define SYSCFG_6BIT_DAC_VREFP                                (0x00000000U)                    /**< 选择VREF+引脚输入作为输入电压源      */
#define SYSCFG_6BIT_DAC_VDDA                                 SYSCFG_CR_6BIT_DAC_REF           /**< 选择内部VDDA电压作为输入电压源       */

/* 6bit DAC输出稳定时间 */
#define SYSCFG_6BIT_DAC_EN_DELAY                             (16U)                            /**<  6bit DAC输出稳定时间                */

/* PVD锁定控制位 */
#define SYSCFG_PVD_LOCK_ENABLE                               SYSCFG_SECCR_PVD_LOCK            /**< 写保护锁定PMU_CR2寄存器              */

/** 
* @}
*/

/*-------------------------------------------functions------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup SYSCFG_External_Functions SYSCFG External Functions
* @brief    SYSCFG对外函数
* @{
*
*/
/************************************************************************************************/
/** 
* @brief  配置IRTIM调制信号源
* @param  ir_source 调制信号源选择
*             @arg SYSCFG_IRMODE_TIM5_OC1： 调制信号源为TIM5的0C1
*             @arg SYSCFG_IRMODE_USART1_TX：调制信号源为USART1
*             @arg SYSCFG_IRMODE_UART4_TX： 调制信号源为UART4
* @retval 无
*/
__STATIC_INLINE void std_syscfg_set_ir_signal_source(uint32_t ir_source)
{
    MODIFY_REG(SYSCFG->CR, SYSCFG_CR_IR_MODE, ir_source);
}

/**
* @brief  获取IRTIM调制信号源
* @retval uint32_t 调制信号源
*             @arg SYSCFG_IRMODE_TIM5_OC1： 调制信号源为TIM5的0C1
*             @arg SYSCFG_IRMODE_USART1_TX：调制信号源为USART1
*             @arg SYSCFG_IRMODE_UART4_TX： 调制信号源为UART4
*/
__STATIC_INLINE uint32_t std_syscfg_get_ir_signal_source(void)
{
    return(SYSCFG->CR & SYSCFG_CR_IR_MODE);
}

/**
* @brief  IR_OUT输出信号极性选择
* @param  irpolarity 输出信号极性
*             @arg SYSCFG_IRPOLARITY_DIRECT:  输出信号未反相
*             @arg SYSCFG_IRPOLARITY_INVERSE: 输出信号反相
* @retval 无
*/
__STATIC_INLINE void std_syscfg_set_ir_polarity(uint32_t irpolarity)
{
    MODIFY_REG(SYSCFG->CR, SYSCFG_CR_IR_POL, irpolarity);
}

/**
* @brief  获取IR_OUT输出信号极性状态
* @retval bool 返回逻辑表达式的判断结果
*             @arg true： 表示IRTIM输出信号反相
*             @arg false：表示IRTIM输出信号未相反
*/
__STATIC_INLINE bool std_syscfg_get_ir_polarity(void)
{
    return((SYSCFG->CR & SYSCFG_CR_IR_POL) == SYSCFG_CR_IR_POL);
}

/** 
* @brief  配置存储器映射
* @param  memory_mapping 存储器映射选择
*             @arg SYSCFG_MEM_MODE_USER_FLASH：存储器映射到USER FLASH
*             @arg SYSCFG_MEM_MODE_SYS_MEM：存储器映射到SYSTEM MEMORY
*             @arg SYSCFG_MEM_MODE_SRAM：存储器映射到SRAM
* @retval 无
*/
__STATIC_INLINE void std_syscfg_set_memory_mapping(uint32_t memory_mapping)
{
    MODIFY_REG(SYSCFG->CR, SYSCFG_CR_MEM_MODE, memory_mapping);
}

/**
* @brief  获取存储器映射
* @retval uint32_t 存储器映射选择
*             @arg SYSCFG_MEM_MODE_USER_FLASH：存储器映射到USER FLASH
*             @arg SYSCFG_MEM_MODE_SYS_MEM：存储器映射到SYSTEM MEMORY
*             @arg SYSCFG_MEM_MODE_SRAM：存储器映射到SRAM
*/
__STATIC_INLINE uint32_t std_syscfg_get_memory_mapping(void)
{
    return(SYSCFG->CR & SYSCFG_CR_MEM_MODE);
}

/**
* @brief  使能6bit DAC
* @retval 无
*/
__STATIC_INLINE void std_syscfg_6bit_dac_enable(void)
{
    SYSCFG->CR |= SYSCFG_CR_6BIT_DAC_EN;
}

/**
* @brief  禁止6bit DAC
* @retval 无
*/
__STATIC_INLINE void std_syscfg_6bit_dac_disable(void)
{
    SYSCFG->CR &= (~SYSCFG_CR_6BIT_DAC_EN);
}

/**
* @brief  获取6bit DAC使能状态
* @retval bool 返回逻辑表达式的判断结果
*             @arg true： 表示使能6bit DAC
*             @arg false：表示未使能6bit DAC
*/
__STATIC_INLINE bool std_syscfg_get_6bit_dac_enable(void)
{
    return((SYSCFG->CR & SYSCFG_CR_6BIT_DAC_EN) == SYSCFG_CR_6BIT_DAC_EN);
}

/**
* @brief  配置6bit DAC输入参考电压源分压
* @param  divide_voltage 输入参考电压源分压，范围为：0x00-0x3F
* @retval 无
*/
__STATIC_INLINE void std_syscfg_set_6bit_dac_divide_voltage (uint32_t divide_voltage)
{
    MODIFY_REG(SYSCFG->CR, SYSCFG_CR_6BIT_DAC_DIV, divide_voltage << SYSCFG_CR_6BIT_DAC_DIV_POS);
}

/**
* @brief  获取6bit DAC输入参考电压源分压
* @retval uint32_t 输入参考电压源分压，范围为：0x00-0x3F
*/
__STATIC_INLINE uint32_t std_syscfg_get_6bit_dac_divide_voltage (void)
{
    return((SYSCFG->CR & SYSCFG_CR_6BIT_DAC_DIV) >> SYSCFG_CR_6BIT_DAC_DIV_POS);
}

/**
* @brief  配置6bit DAC输入参考电压源
* @param  source 输入参考电压源选择
*             @arg SYSCFG_6BIT_DAC_VREFBUF: 选择VREFBUF作为输入电压源
*             @arg SYSCFG_6BIT_DAC_VREFP: 选择VREF+引脚输入作为输入电压源
*             @arg SYSCFG_6BIT_DAC_VDDA: 选择VDDA电压
* @retval 无
*/
__STATIC_INLINE void std_syscfg_set_6bit_dac_reference_voltage(uint32_t source)
{
    MODIFY_REG(SYSCFG->CR, SYSCFG_CR_6BIT_DAC_REF, source);
}

/**
* @brief  获取6bit DAC输入参考电压源
* @retval uint32_t 输入参考电压源选择
*             @arg SYSCFG_6BIT_DAC_VREFBUF: 选择VREFBUF作为输入电压源
*             @arg SYSCFG_6BIT_DAC_VREFP: 选择VREF+引脚输入作为输入电压源
*             @arg SYSCFG_6BIT_DAC_VDDA: 选择VDDA电压
*/
__STATIC_INLINE uint32_t std_syscfg_get_6bit_dac_reference_voltage(void)
{
    return(SYSCFG->CR & SYSCFG_CR_6BIT_DAC_REF);
}

/**
* @brief  使能PVD锁定
* @retval 无
*/
__STATIC_INLINE void std_syscfg_pvd_lock_enable(void)
{
    SYSCFG->SECCR |= SYSCFG_SECCR_PVD_LOCK;
}

/**
* @}
*/

#ifdef __cplusplus
}
#endif

/**
* @}
*/

/**
* @}
*/

#endif /* CIU32L071_STD_SYSCFG_H */
