/************************************************************************************************/
/**
* @file               std_dma.c
* @author             MCU Ecosystem Development Team
* @brief              DMA STD库驱动。
*                     实现DMA初始化和启动等API。
*
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

/************************************************************************************************/
/**
* @addtogroup STD_Driver
* @{
*/

/**
* @addtogroup DMA 
* @{
*
*/
/************************************************************************************************/


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

#ifdef STD_DMA_PERIPHERAL_USED

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

/************************************************************************************************/
/**
* @addtogroup DMA_External_Functions 
* @{
*
*/
/************************************************************************************************/ 

/**
* @brief  DMA通道初始化
* @param  dma_init_param  DMA初始化结构体
* @retval 无
*/
void std_dma_init(std_dma_init_t *dma_init_param)
{
    /* 设置DMA配置寄存器 */
    std_dma_channel_config(dma_init_param->dma_channel, dma_init_param->transfer_type     \
                                                      | dma_init_param->src_addr_inc      \
                                                      | dma_init_param->dst_addr_inc      \
                                                      | dma_init_param->data_size         \
                                                      | dma_init_param->mode              \
                                                      | dma_init_param->priority);
    
    /* 设置DMA请求源ID */
    std_dma_set_req_id(dma_init_param->dma_channel, dma_init_param->dma_req_id);
}


/**
* @brief  DMA通道去初始化
* @param  dma_init_param dma初始化结构体
* @retval 无
*/
void std_dma_deinit(std_dma_init_t *dma_init_param)
{   
    /* 清除DMA通道的所有状态 */
    DMA->ICR = (DMA_CLEAR_G0 << (dma_init_param->dma_channel << 2U));
    
    /* 复位DMA通道的控制寄存器 */
    std_dma_reset_control(dma_init_param->dma_channel);
    
    /* DMA传输数量清零 */
    std_dma_set_transfer_data_number(dma_init_param->dma_channel, 0U);

    /* DMA传输源地址清零 */
    std_dma_set_src_address(dma_init_param->dma_channel, 0U);
    
    /* DMA传目的地址清零 */
    std_dma_set_dst_address(dma_init_param->dma_channel, 0U);
}


/**
* @brief  初始化std_dma_init_t结构体
* @param  dma_init_struct dma初始化结构体
* @note   源地址、目的地址、DMA传输数的配置不在该函数
* @retval 无
*/
void std_dma_struct_init(std_dma_init_t *dma_init_struct)
{
    dma_init_struct->dma_channel = DMA_CHANNEL_0;
    dma_init_struct->transfer_type = DMA_BLOCK_TRANSFER;
    dma_init_struct->dma_req_id = DMA_REQUEST_SOFTWARE;
    dma_init_struct->src_addr_inc = DMA_SRC_INC_DISABLE;
    dma_init_struct->dst_addr_inc = DMA_DST_INC_DISABLE;
    dma_init_struct->data_size = DMA_DATA_SIZE_BYTE;
    dma_init_struct->mode = DMA_MODE_NORMAL;
    dma_init_struct->priority = DMA_PRIORITY_LOW;
}


/**
* @brief  配置DMA源地址、目的地址、DMA传输数，使能DMA
* @param  dma_config 配置寄存器
* @note   当DMA通道配置软件触发DMA请求，立即启动DMA传输
* @retval 无
*/
void std_dma_start_transmit(std_dma_config_t *dma_config)
{
    /* 设置DMA传输数量 */
    std_dma_set_transfer_data_number(dma_config->dma_channel,dma_config->data_number);

    /* 设置DMA传输源地址 */
    std_dma_set_src_address(dma_config->dma_channel,dma_config->src_addr);
    
    /* 设置DMA传目的地址 */
    std_dma_set_dst_address(dma_config->dma_channel,dma_config->dst_addr);

    /* 使能DMA传输 */
    std_dma_enable(dma_config->dma_channel);  
}


/**
* @} 
*/

#endif /* STD_DMA_PERIPHERAL_USED */

/**
* @} 
*/

/**
* @} 
*/

