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

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

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

/**
* @defgroup DMA DMA
* @brief 直接存储器访问控制器的STD库驱动
* @{
*/
/************************************************************************************************/



#ifdef __cplusplus
 extern "C" {
#endif

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

/*-----------------------------------------type define------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup DMA_Types DMA Types
* @brief  DMA数据类型定义
* @{
*
*/
/************************************************************************************************/

/**
* @brief  DMA初始化配置结构体定义
*/
typedef struct 
{
    uint32_t dma_channel;         /**< DMA通道
                                           @arg DMA_CHANNEL_0
                                           @arg DMA_CHANNEL_1                                   
                                           @arg DMA_CHANNEL_2                                   */
       
    uint32_t transfer_type;       /**< DMA传输控制，Block传输或Burst传输
                                           @arg DMA_BLOCK_TRANSFER                              
                                           @arg DMA_BURST_TRANSFER                              */
    
    uint32_t dma_req_id;          /**< DMA请求源ID
                                           @arg DMA_REQUEST_SOFTWARE                            
                                           @arg DMA_REQUEST_ADC...                              */
    
    uint32_t src_addr_inc;        /**< DMA源地址自增使能或禁止
                                           @arg DMA_SRC_INC_DISABLE                             
                                           @arg DMA_SRC_INC_ENABLE                              */

    uint32_t dst_addr_inc;        /**< DMA目的地址自增使能或禁止
                                           @arg DMA_DST_INC_DISABLE                             
                                           @arg DMA_DST_INC_ENABLE                              */

    uint32_t data_size;           /**< DMA传输数据宽度，字节、半字或字
                                           @arg DMA_DATA_SIZE_BYTE                              
                                           @arg DMA_DATA_SIZE_HALFWORD
                                           @arg DMA_DATA_SIZE_WORD                              */
                                                                                     
    uint32_t mode;                /**< DMA工作模式，正常模式或循环模式
                                           @arg DMA_MODE_NORMAL 
                                           @arg DMA_MODE_CIRCULAR
                                           @note 存储器到存储器传输方向不能配置为循环模式       */

    uint32_t priority;            /**< DMA通道软件优先级，低、中、高和超高
                                           @arg DMA_PRIORITY_LOW                                
                                           @arg DMA_PRIORITY_MEDIUM                             
                                           @arg DMA_PRIORITY_HIGH                               
                                           @arg DMA_PRIORITY_VERY_HIGH                          */
} std_dma_init_t;


/**
* @brief  DMA传输参数配置结构体定义
*/
typedef struct
{
    uint32_t dma_channel;         /**< DMA通道
                                           @arg DMA_CHANNEL_0
                                           @arg DMA_CHANNEL_1                    
                                           @arg DMA_CHANNEL_2                    */
    
    uint32_t src_addr;            /**< DMA传输源地址                             */
    
    uint32_t dst_addr;            /**< DMA传输目的地址                           */
    
    uint32_t data_number;         /**< DMA传输次数                               */

} std_dma_config_t;


/**
* @}
*/

/*--------------------------------------------define--------------------------------------------*/
/************************************************************************************************/
/** 
* @defgroup DMA_Constants DMA Constants
* @brief DMA常量定义及宏定义
* @{
*/
/************************************************************************************************/

/* DMA通道 */
#define DMA_CHANNEL_0                    (0x00U)                    /**< DMA通道0  */
#define DMA_CHANNEL_1                    (0x01U)                    /**< DMA通道1  */
#define DMA_CHANNEL_2                    (0x02U)                    /**< DMA通道2  */

/* DMA传输控制 */
#define DMA_BLOCK_TRANSFER               (0x00000000U)              /**< DMA BLOCK传输类型 */
#define DMA_BURST_TRANSFER               (DMA_CC_TYPE)              /**< DMA BURST传输类型 */

/* DMA源地址自增模式 */
#define DMA_SRC_INC_DISABLE              (0x00000000U)              /**< 源地址自增禁止    */
#define DMA_SRC_INC_ENABLE               (DMA_CC_SINC)              /**< 源地址自增使能    */

/* DMA目的地址自增模式 */
#define DMA_DST_INC_DISABLE              (0x00000000U)              /**< 目的地址自增禁止  */
#define DMA_DST_INC_ENABLE               (DMA_CC_DINC)              /**< 目的地址自增使能  */

/* DMA传输数据宽度 */
#define DMA_DATA_SIZE_BYTE               (DMA_CC_SIZE_BYTE)         /**< 传输数据为字节    */
#define DMA_DATA_SIZE_HALFWORD           (DMA_CC_SIZE_HALFWORD)     /**< 传输数据为半字    */
#define DMA_DATA_SIZE_WORD               (DMA_CC_SIZE_WORD)         /**< 传输数据为字      */

/* DMA模式 */
#define DMA_MODE_NORMAL                  (0x00000000U)              /**< 正常模式  */
#define DMA_MODE_CIRCULAR                (DMA_CC_CIRC)              /**< 循环模式  */

/* DMA传输优先级 */
#define DMA_PRIORITY_LOW                 (DMA_CC_PL_LOW)            /**< 优先级低   */
#define DMA_PRIORITY_MEDIUM              (DMA_CC_PL_MEDIUM)         /**< 优先级中   */
#define DMA_PRIORITY_HIGH                (DMA_CC_PL_HIGH)           /**< 优先级高   */
#define DMA_PRIORITY_VERY_HIGH           (DMA_CC_PL_VERY_HIGH)      /**< 优先级超高 */

/* DMA请求源ID */
#define DMA_REQUEST_SOFTWARE             (0U)                       /**< DMA请求为软件触发              */
#define DMA_REQUEST_ADC                  (1U)                       /**< DMA请求为ADC                   */
#define DMA_REQUEST_SPI1_RX              (2U)                       /**< DMA请求为SPI1接收              */
#define DMA_REQUEST_SPI1_TX              (3U)                       /**< DMA请求为SPI1发送              */
#define DMA_REQUEST_SPI2_RX              (4U)                       /**< DMA请求为SPI2接收              */
#define DMA_REQUEST_SPI2_TX              (5U)                       /**< DMA请求为SPI2发送              */
#define DMA_REQUEST_I2C1_RX              (6U)                       /**< DMA请求为I2C1接收              */
#define DMA_REQUEST_I2C1_TX              (7U)                       /**< DMA请求为I2C1发送              */
#define DMA_REQUEST_UART1_RX             (8U)                       /**< DMA请求为UART1接收             */
#define DMA_REQUEST_UART1_TX             (9U)                       /**< DMA请求为UART1发送             */
#define DMA_REQUEST_UART2_RX             (10U)                      /**< DMA请求为UART2接收             */
#define DMA_REQUEST_UART2_TX             (11U)                      /**< DMA请求为UART2发送             */
#define DMA_REQUEST_LPUART1_RX           (12U)                      /**< DMA请求为LPUART1接收           */
#define DMA_REQUEST_LPUART1_TX           (13U)                      /**< DMA请求为LPUART1发送           */
#define DMA_REQUEST_TIM1_CC1             (14U)                      /**< DMA请求为TIM1通道1比较/匹配    */
#define DMA_REQUEST_TIM1_CC2             (15U)                      /**< DMA请求为TIM1通道2比较/匹配    */
#define DMA_REQUEST_TIM1_CC3             (16U)                      /**< DMA请求为TIM1通道3比较/匹配    */
#define DMA_REQUEST_TIM1_CC4             (17U)                      /**< DMA请求为TIM1通道4比较/匹配    */
#define DMA_REQUEST_TIM1_TRIG_COM        (20U)                      /**< DMA请求为TIM1触发              */
#define DMA_REQUEST_TIM1_UP              (21U)                      /**< DMA请求为TIM1更新              */
#define DMA_REQUEST_TIM3_CC1             (22U)                      /**< DMA请求为TIM3通道1比较/匹配    */
#define DMA_REQUEST_TIM3_CC2             (23U)                      /**< DMA请求为TIM3通道2比较/匹配    */
#define DMA_REQUEST_TIM3_CC3             (24U)                      /**< DMA请求为TIM3通道3比较/匹配    */
#define DMA_REQUEST_TIM3_CC4             (25U)                      /**< DMA请求为TIM3通道4比较/匹配    */
#define DMA_REQUEST_TIM3_TRIG            (26U)                      /**< DMA请求为TIM3触发              */
#define DMA_REQUEST_TIM3_UP              (27U)                      /**< DMA请求为TIM3更新              */
#define DMA_REQUEST_TIM8_UP              (28U)                      /**< DMA请求为TIM8更新              */
#define DMA_REQUEST_LPTIM1_ARRM          (29U)                      /**< DMA请求为LPTIM1更新            */

/* DMA中断状态 */
#define DMA_FLAG_G0                      (DMA_ISR_G0)            /**< DMA通道0全局状态      */
#define DMA_FLAG_TF0                     (DMA_ISR_TF0)           /**< DMA通道0传输完成状态  */
#define DMA_FLAG_TH0                     (DMA_ISR_TH0)           /**< DMA通道0传输一半状态  */
#define DMA_FLAG_TE0                     (DMA_ISR_TE0)           /**< DMA通道0传输错误状态  */
#define DMA_FLAG_G1                      (DMA_ISR_G1)            /**< DMA通道1全局状态      */
#define DMA_FLAG_TF1                     (DMA_ISR_TF1)           /**< DMA通道1传输完成状态  */
#define DMA_FLAG_TH1                     (DMA_ISR_TH1)           /**< DMA通道1传输一半状态  */
#define DMA_FLAG_TE1                     (DMA_ISR_TE1)           /**< DMA通道1传输错误状态  */
#define DMA_FLAG_G2                      (DMA_ISR_G2)            /**< DMA通道2全局状态      */
#define DMA_FLAG_TF2                     (DMA_ISR_TF2)           /**< DMA通道2传输完成状态  */
#define DMA_FLAG_TH2                     (DMA_ISR_TH2)           /**< DMA通道2传输一半状态  */
#define DMA_FLAG_TE2                     (DMA_ISR_TE2)           /**< DMA通道2传输错误状态  */

/* DMA中断源 */
#define DMA_INTERRUPT_TF                 (DMA_CC_TFIE)           /**< DMA传输完成中断  */
#define DMA_INTERRUPT_TH                 (DMA_CC_THIE)           /**< DMA传输一半中断  */
#define DMA_INTERRUPT_TE                 (DMA_CC_TEIE)           /**< DMA传输错误中断  */

/* DMA中断状态清除 */
#define DMA_CLEAR_G0                      (DMA_ICR_GCF0)         /**< DMA通道0全局状态清除      */
#define DMA_CLEAR_TF0                     (DMA_ICR_TFCF0)        /**< DMA通道0传输完成状态清除  */
#define DMA_CLEAR_TH0                     (DMA_ICR_THCF0)        /**< DMA通道0传输一半状态清除  */
#define DMA_CLEAR_TE0                     (DMA_ICR_TECF0)        /**< DMA通道0传输错误状态清除  */
#define DMA_CLEAR_G1                      (DMA_ICR_GCF1)         /**< DMA通道1全局状态清除      */
#define DMA_CLEAR_TF1                     (DMA_ICR_TFCF1)        /**< DMA通道1传输完成状态清除  */
#define DMA_CLEAR_TH1                     (DMA_ICR_THCF1)        /**< DMA通道1传输一半状态清除  */
#define DMA_CLEAR_TE1                     (DMA_ICR_TECF1)        /**< DMA通道1传输错误状态清除  */
#define DMA_CLEAR_G2                      (DMA_ICR_GCF2)         /**< DMA通道2全局状态清除      */
#define DMA_CLEAR_TF2                     (DMA_ICR_TFCF2)        /**< DMA通道2传输完成状态清除  */
#define DMA_CLEAR_TH2                     (DMA_ICR_THCF2)        /**< DMA通道2传输一半状态清除  */
#define DMA_CLEAR_TE2                     (DMA_ICR_TECF2)        /**< DMA通道2传输错误状态清除  */


/**
* @}
*/

/*-------------------------------------------functions------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup DMA_External_Functions DMA External Functions
* @brief    DMA对外函数
* @{
*
*/
/************************************************************************************************/

/** 
* @brief  使能DMA通道
* @param  channel DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_enable(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC |= (DMA_CC_EN);
}


/** 
* @brief  禁止DMA通道
* @param  channel DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_disable(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC &= (~DMA_CC_EN);
}


/** 
* @brief  配置DMA传输类型
* @param  channel DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  transfer_type DMA传输类型
*             @arg DMA_BLOCK_TRANSFER
*             @arg DMA_BURST_TRANSFER
* @retval 无
*/
__STATIC_INLINE void std_dma_transfer_type_config(uint32_t channel, uint32_t transfer_type)
{
    MODIFY_REG((&(DMA->channel[channel]))->CC, DMA_CC_TYPE, transfer_type);
}


/** 
* @brief  获取DMA传输类型
* @param  channel DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval uint32_t DMA传输类型
*             @arg DMA_BLOCK_TRANSFER
*             @arg DMA_BURST_TRANSFER
*/
__STATIC_INLINE uint32_t std_dma_get_transfer_type(uint32_t channel)
{
    return ((&(DMA->channel[channel]))->CC & DMA_CC_TYPE);
}


/** 
* @brief  使能DMA源地址递增
* @param  channel  DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_src_addr_inc_enable(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC |= (DMA_CC_SINC);    
}


/** 
* @brief  禁止DMA源地址递增
* @param  channel  DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_src_addr_inc_disable(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC &= (~DMA_CC_SINC);    
}


/** 
* @brief  使能DMA目的地址递增
* @param  channel  DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_dst_addr_inc_enable(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC |= (DMA_CC_DINC);    
}


/** 
* @brief  禁止DMA目的地址递增
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_dst_addr_inc_disable(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC &= (~DMA_CC_DINC);    
}


/** 
* @brief  配置DMA传输数据大小，为字节、半字或字
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  data_size  DMA传输数据大小
*             @arg DMA_DATA_SIZE_BYTE
*             @arg DMA_DATA_SIZE_HALFWORD
*             @arg DMA_DATA_SIZE_WORD
* @retval 无
*/
__STATIC_INLINE void std_dma_set_transfer_data_size(uint32_t channel, uint32_t data_size)
{
    MODIFY_REG((&(DMA->channel[channel]))->CC, (DMA_CC_SIZE), (data_size & DMA_CC_SIZE));
}


/** 
* @brief  获取DMA传输数据大小，为字节、半字或字
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval uint32_t DMA传输数据大小
*             @arg DMA_DATA_SIZE_BYTE
*             @arg DMA_DATA_SIZE_HALFWORD
*             @arg DMA_DATA_SIZE_WORD
*/
__STATIC_INLINE uint32_t std_dma_get_transfer_data_size(uint32_t channel)
{
    return ((&(DMA->channel[channel]))->CC & (DMA_CC_SIZE));
}


/** 
* @brief  使能DMA循环模式
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_circular_mode_enable(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC |= DMA_MODE_CIRCULAR;
}


/** 
* @brief  禁止DMA循环模式
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_circular_mode_disable(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC &= (~DMA_MODE_CIRCULAR);
}


/** 
* @brief  获取DMA循环模式使能状态
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval bool DMA循环模式使能状态
*             @arg true  使能
*             @arg false 禁止
*/
__STATIC_INLINE bool std_dma_get_circular_mode_status(uint32_t channel)
{
    return (((&(DMA->channel[channel]))->CC & DMA_MODE_CIRCULAR) == DMA_MODE_CIRCULAR);     
}


/** 
* @brief   配置DMA优先级
* @param   channel  DMA通道
*              @arg DMA_CHANNEL_0
*              @arg DMA_CHANNEL_1
*              @arg DMA_CHANNEL_2
* @param   priority 优先级，低、中、高和超高
*              @arg DMA_PRIORITY_LOW       
*              @arg DMA_PRIORITY_MEDIUM    
*              @arg DMA_PRIORITY_HIGH      
*              @arg DMA_PRIORITY_VERY_HIGH    
* @retval 无
*/
__STATIC_INLINE void std_dma_set_priority(uint32_t channel, uint32_t priority)
{
    MODIFY_REG((&(DMA->channel[channel]))->CC, DMA_CC_PL, priority);
}


/** 
* @brief  获取DMA优先级
* @param  channel DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval uint32_t  DMA优先级
*             @arg DMA_PRIORITY_LOW       
*             @arg DMA_PRIORITY_MEDIUM    
*             @arg DMA_PRIORITY_HIGH      
*             @arg DMA_PRIORITY_VERY_HIGH   
*/
__STATIC_INLINE uint32_t std_dma_get_priority(uint32_t channel)
{
    return ((&(DMA->channel[channel]))->CC & (DMA_CC_PL));
}


/** 
* @brief  使能DMA中断
* @param  channel  DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  dma_interrupt DMA中断，包括错误中断、传输完成中断，传输一半中断
*             @arg DMA_INTERRUPT_TE
*             @arg DMA_INTERRUPT_TF
*             @arg DMA_INTERRUPT_TH
* @retval 无
*/
__STATIC_INLINE void std_dma_interrupt_enable(uint32_t channel, uint32_t dma_interrupt)
{
    (&(DMA->channel[channel]))->CC |= (dma_interrupt);
}


/** 
* @brief  禁止DMA中断
* @param  channel  DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  dma_interrupt DMA中断，包括错误中断、传输完成中断，传输一半中断
*             @arg DMA_INTERRUPT_TE
*             @arg DMA_INTERRUPT_TF
*             @arg DMA_INTERRUPT_TH
* @retval 无
*/
__STATIC_INLINE void std_dma_interrupt_disable(uint32_t channel, uint32_t dma_interrupt)
{
    (&(DMA->channel[channel]))->CC &= (~dma_interrupt);
}


/** 
* @brief  获取DMA中断使能状态
* @param  channel  DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  dma_interrupt DMA中断，包括错误中断、传输完成中断，传输一半中断
*             @arg DMA_INTERRUPT_TE
*             @arg DMA_INTERRUPT_TF
*             @arg DMA_INTERRUPT_TH
* @retval bool DMA中断使能状态
*             @arg true  DMA中断使能
*             @arg false DMA中断禁止
*/
__STATIC_INLINE bool std_dma_get_interrupt_enable(uint32_t channel, uint32_t dma_interrupt)
{
    return (((&(DMA->channel[channel]))->CC & (dma_interrupt)) == (dma_interrupt));
}


/** 
* @brief  获取DMA标志位状态
* @param  flag DMA状态,包括全局中断、传输完成中断、传输一半中断、错误中断
*             @arg DMA_FLAG_G0  
*             @arg DMA_FLAG_TF0 
*             @arg ...
*             @arg DMA_FLAG_TE2 
* @retval bool DMA标志位状态
*             @arg true   DMA标志位置起
*             @arg false  DMA标志位未置起
*/
__STATIC_INLINE bool std_dma_get_flag(uint32_t flag)
{
    return ((DMA->ISR & (flag)) == (flag));
}


/** 
* @brief  清除DMA标志位
* @param  flag DMA状态,包括全局中断、传输完成中断、传输一半中断、错误中断
*             @arg DMA_CLEAR_G0  
*             @arg DMA_CLEAR_TF0 
*             @arg ... 
*             @arg DMA_CLEAR_TE2
* @retval 无
*/
__STATIC_INLINE void std_dma_clear_flag(uint32_t flag)
{
    DMA->ICR = (flag);
}


/** 
* @brief  DMA请求信号源配置
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  req_id   DMA请求信号源
*             @arg DMA_REQUEST_SOFTWARE
*             @arg DMA_REQUEST_ADC
*             @arg ...
*             @arg DMA_REQUEST_LPTIM1_ARRM
* @retval 无
*/
__STATIC_INLINE void std_dma_set_req_id(uint32_t channel, uint32_t req_id)
{
    MODIFY_REG((&(DMA->channel[channel]))->CC, (DMA_CC_REQ_ID), (req_id << DMA_CC_REQ_ID_POS));
}


/** 
* @brief  获取DMA请求信号源配置
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval uint32_t DMA请求信号源
*             @arg DMA_REQUEST_SOFTWARE
*             @arg DMA_REQUEST_ADC
*             @arg ...
*             @arg DMA_REQUEST_LPTIM1_ARRM
*/
__STATIC_INLINE uint32_t std_dma_get_req_id(uint32_t channel)
{
    return (((&(DMA->channel[channel]))->CC & (DMA_CC_REQ_ID)) >> DMA_CC_REQ_ID_POS);
}


/** 
* @brief  DMA通道控制参数配置
* @param  channel DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  config_value DMA配置
*             @arg DMA_MODE_NORMAL     or DMA_MODE_CIRCULAR
*             @arg DMA_BLOCK_TRANSFER  or DMA_BURST_TRANSFER
*             @arg DMA_DATA_SIZE_BYTE  or DMA_DATA_SIZE_HALFWORD or DMA_DATA_SIZE_WORD
*             @arg DMA_SRC_INC_DISABLE or DMA_SRC_INC_ENABLE
*             @arg DMA_DST_INC_DISABLE or DMA_DST_INC_ENABLE
*             @arg DMA_PRIORITY_LOW    or DMA_PRIORITY_MEDIUM    or DMA_PRIORITY_HIGH or DMA_PRIORITY_VERY_HIGH
* @retval 无
*/
__STATIC_INLINE void std_dma_channel_config(uint32_t channel, uint32_t config_value)
{
    MODIFY_REG((&(DMA->channel[channel]))->CC, (DMA_CC_CIRC | DMA_CC_TYPE | DMA_CC_SIZE | DMA_CC_SINC | DMA_CC_DINC | DMA_CC_PL), (config_value));
}


/** 
* @brief  复位DMA通道控制器
* @param  channel DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval 无
*/
__STATIC_INLINE void std_dma_reset_control(uint32_t channel)
{
    (&(DMA->channel[channel]))->CC &= (~DMA_CC_EN);
    (&(DMA->channel[channel]))->CC = 0U;
}


/** 
* @brief  配置DMA源地址
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  src_addr DMA源地址
* @retval 无
*/
__STATIC_INLINE void std_dma_set_src_address(uint32_t channel, uint32_t src_addr)
{
    (&(DMA->channel[channel]))->CSAR = src_addr;
}


/** 
* @brief  获取DMA源地址
* @param  channel  DMA通道 
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval uint32_t DMA源地址
*/
__STATIC_INLINE uint32_t std_dma_get_src_address(uint32_t channel)
{
    return ((&(DMA->channel[channel]))->CSAR);
}


/** 
* @brief  配置DMA目的地址
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  dst_addr DMA目的地址
* @retval 无
*/
__STATIC_INLINE void std_dma_set_dst_address(uint32_t channel, uint32_t dst_addr)
{
    (&(DMA->channel[channel]))->CDAR = dst_addr;   
}


/** 
* @brief  获取DMA目的地址
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval uint32_t DMA目的地址
*/
__STATIC_INLINE uint32_t std_dma_get_dts_address(uint32_t channel)
{
    return ((&(DMA->channel[channel]))->CDAR);
}


/** 
* @brief  配置DMA传输次数
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @param  data_number 传输次数 
* @retval 无
*/
__STATIC_INLINE void std_dma_set_transfer_data_number(uint32_t channel, uint32_t data_number)
{
    (&(DMA->channel[channel]))->CNDTR = data_number;
}


/** 
* @brief  获取DMA传输次数
* @param  channel  DMA通道
*             @arg DMA_CHANNEL_0
*             @arg DMA_CHANNEL_1
*             @arg DMA_CHANNEL_2
* @retval uint32_t DMA传输次数
*/
__STATIC_INLINE uint32_t std_dma_get_transfer_data_number(uint32_t channel)
{
    return ((&(DMA->channel[channel]))->CNDTR);
}


void std_dma_init(std_dma_init_t *dma_init_param);
void std_dma_deinit(std_dma_init_t *dma_init_param);
void std_dma_struct_init(std_dma_init_t *dma_init_struct);
void std_dma_start_transmit(std_dma_config_t *dma_config);

/**
* @}
*/


#ifdef __cplusplus
}
#endif

/**
* @} 
*/  

/**
* @}
*/

#endif /* STD_DMA_H */
