/************************************************************************************************/
/**
* @file               ciu32l071_std_adc.c
* @author             MCU Ecosystem Development Team
* @brief              ADC STD库驱动。
*                     实现ADC初始化配置等功能API。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

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

/**
* @addtogroup ADC 
* @{
*
*/
/************************************************************************************************/


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

#ifdef STD_ADC_PERIPHERAL_USED

/*-------------------------------------------functions------------------------------------------*/

/************************************************************************************************/
/**
* @addtogroup ADC_External_Functions 
* @{
*
*/
/************************************************************************************************/


/** 
* @brief  ADC初始化
* @param  adc_init_param ADC初始化结构体
* @note   若ADC时钟源配置为异步时钟，则需要在std_adc_init外部配置ADC异步时钟源
* @retval 无
*/
void std_adc_init(std_adc_init_t *adc_init_param)
{
    /* 时钟源配置 */
    std_adc_clock_source_config(adc_init_param->clock_src);
    /* 异步时钟分频配置 */
    if(adc_init_param->clock_src == ADC_ASYNC_CLK_KCLK)
    {
        std_adc_asynchronous_clock_config(adc_init_param->clock_presc);
    }
    
    if(adc_init_param->trigger_edge != ADC_TRIG_SW)
    {
        /* 配置外部触发源 */
        std_adc_external_trig_source_config(adc_init_param->trigger_source);
        /* 触发方式和极性配置 */
        std_adc_trig_edge_config(adc_init_param->trigger_edge);
    }
    else
    {
        /* 配置软件触发方式 */
        std_adc_trig_edge_config(adc_init_param->trigger_edge);
    }
    /* 转换模式配置 */
    std_adc_conversion_mode_config(adc_init_param->conver_mode);
    /* 采样时间参数1配置 */
    std_adc_sampt1_time_config(adc_init_param->sampt1);
    /* 采样时间参数2配置 */
    std_adc_sampt2_time_config(adc_init_param->sampt2);
    /* 数据溢出管理 */
    std_adc_ovrn_mode_config(adc_init_param->overrun_mode);
    /* 扫描方向配置 */
    std_adc_scan_direction_config(adc_init_param->scan_dir);
}


/** 
* @brief  ADC结构体初始化
* @param  adc_init_struct ADC初始化结构体
* @retval 无
*/
void std_adc_struct_init(std_adc_init_t *adc_init_struct)
{
    adc_init_struct->clock_src = ADC_SYNC_CLK_PCLK_DIV1;
    adc_init_struct->clock_presc = ADC_ASYNC_CLK_DIV1;
    adc_init_struct->conver_mode = ADC_SINGLE_CONVER_MODE;
    adc_init_struct->overrun_mode = ADC_OVRN_MODE_OVERWRITTEN;
    adc_init_struct->sampt1 = ADC_SAMPTIME_3CYCLES;
    adc_init_struct->sampt2 = ADC_SAMPTIME_3CYCLES;
    adc_init_struct->scan_dir = ADC_SCAN_DIR_FORWARD;
    adc_init_struct->trigger_edge = ADC_TRIG_SW;
    adc_init_struct->trigger_source = ADC_EXTRIG_EXTI11;
}


/** 
* @brief  ADC去初始化
* @note   执行去初始化前应停止转换
* @retval 无
*/
void std_adc_deinit(void)
{
    /* 禁止ADC */
    std_adc_disable();
    /* 复位ADC外设 */
    std_rcc_apb2_reset(RCC_PERIPH_RESET_ADC);
    
    /* 禁止ADC外设时钟 */
    std_rcc_apb2_clk_disable(RCC_PERIPH_CLK_ADC);  
}


/** 
* @} 
*/

#endif /* STD_ADC_PERIPHERAL_USED */

/** 
* @} 
*/

/** 
* @} 
*/
