680 lines
23 KiB
C
680 lines
23 KiB
C
/************************************************************************************************/
|
||
/**
|
||
* @file ciu32l051_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 CIU32L051_STD_DMA_H
|
||
#define CIU32L051_STD_DMA_H
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @addtogroup CIU32L051_STD_Driver
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @defgroup DMA DMA
|
||
* @brief 直接存储器访问控制器的STD库驱动
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*------------------------------------------includes--------------------------------------------*/
|
||
|
||
#include "ciu32l051_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 */
|
||
|
||
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 存储器到存储器传输方向不能配置为循环模式 */
|
||
} std_dma_init_t;
|
||
|
||
|
||
/**
|
||
* @brief DMA传输参数配置结构体定义
|
||
*/
|
||
typedef struct
|
||
{
|
||
uint32_t dma_channel; /**< DMA通道
|
||
@arg DMA_CHANNEL_0
|
||
@arg DMA_CHANNEL_1 */
|
||
|
||
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 */
|
||
|
||
/* 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请求源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 (2U) /**< DMA请求为SPI1发送 */
|
||
#define DMA_REQUEST_SPI2_RX (3U) /**< DMA请求为SPI2接收 */
|
||
#define DMA_REQUEST_SPI2_TX (3U) /**< DMA请求为SPI2发送 */
|
||
#define DMA_REQUEST_I2C1_RX (4U) /**< DMA请求为I2C1接收 */
|
||
#define DMA_REQUEST_I2C1_TX (4U) /**< DMA请求为I2C1发送 */
|
||
#define DMA_REQUEST_USART1_RX (6U) /**< DMA请求为USART1接收 */
|
||
#define DMA_REQUEST_USART1_TX (6U) /**< DMA请求为USART1发送 */
|
||
#define DMA_REQUEST_UART2_RX (7U) /**< DMA请求为UART2接收 */
|
||
#define DMA_REQUEST_UART2_TX (7U) /**< DMA请求为UART2发送 */
|
||
#define DMA_REQUEST_UART3_RX (8U) /**< DMA请求为UART3接收 */
|
||
#define DMA_REQUEST_UART3_TX (8U) /**< DMA请求为UART3发送 */
|
||
#define DMA_REQUEST_UART4_RX (9U) /**< DMA请求为UART4接收 */
|
||
#define DMA_REQUEST_UART4_TX (9U) /**< DMA请求为UART4发送 */
|
||
#define DMA_REQUEST_LPUART1_RX (10U) /**< DMA请求为LPUART1接收 */
|
||
#define DMA_REQUEST_LPUART1_TX (10U) /**< DMA请求为LPUART1发送 */
|
||
#define DMA_REQUEST_LPUART2_RX (11U) /**< DMA请求为LPUART2接收 */
|
||
#define DMA_REQUEST_LPUART2_TX (11U) /**< DMA请求为LPUART2发送 */
|
||
#define DMA_REQUEST_TIM3_CC1 (15U) /**< DMA请求为TIM3通道1比较/匹配 */
|
||
#define DMA_REQUEST_TIM3_CC2 (15U) /**< DMA请求为TIM3通道2比较/匹配 */
|
||
#define DMA_REQUEST_TIM3_CC3 (16U) /**< DMA请求为TIM3通道3比较/匹配 */
|
||
#define DMA_REQUEST_TIM3_CC4 (16U) /**< DMA请求为TIM3通道4比较/匹配 */
|
||
#define DMA_REQUEST_TIM3_TRIG (17U) /**< DMA请求为TIM3触发 */
|
||
#define DMA_REQUEST_TIM3_UP (17U) /**< DMA请求为TIM3更新 */
|
||
#define DMA_REQUEST_TIM4_CC1 (18U) /**< DMA请求为TIM4通道1比较/匹配 */
|
||
#define DMA_REQUEST_TIM4_CC2 (18U) /**< DMA请求为TIM4通道2比较/匹配 */
|
||
#define DMA_REQUEST_TIM4_CC3 (19U) /**< DMA请求为TIM4通道3比较/匹配 */
|
||
#define DMA_REQUEST_TIM4_CC4 (19U) /**< DMA请求为TIM4通道4比较/匹配 */
|
||
#define DMA_REQUEST_TIM4_TRIG (20U) /**< DMA请求为TIM4触发 */
|
||
#define DMA_REQUEST_TIM4_UP (20U) /**< DMA请求为TIM4更新 */
|
||
#define DMA_REQUEST_TIM5_CC1 (21U) /**< DMA请求为TIM5通道1比较/匹配 */
|
||
#define DMA_REQUEST_TIM5_CC2 (21U) /**< DMA请求为TIM5通道2比较/匹配 */
|
||
#define DMA_REQUEST_TIM5_CC3 (22U) /**< DMA请求为TIM5通道3比较/匹配 */
|
||
#define DMA_REQUEST_TIM5_CC4 (22U) /**< DMA请求为TIM5通道4比较/匹配 */
|
||
#define DMA_REQUEST_TIM5_TRIG (23U) /**< DMA请求为TIM5触发 */
|
||
#define DMA_REQUEST_TIM5_UP (23U) /**< DMA请求为TIM5更新 */
|
||
#define DMA_REQUEST_TIM8_UP (24U) /**< DMA请求为TIM8更新 */
|
||
#define DMA_REQUEST_AES_IN (26U) /**< DMA请求为AES数据输入 */
|
||
#define DMA_REQUEST_AES_OUT (26U) /**< DMA请求为AES数据输出 */
|
||
#define DMA_REQUEST_LPTIM1_CMPM (27U) /**< DMA请求为LPTIM1比较/匹配 */
|
||
#define DMA_REQUEST_LPTIM1_ARRM (27U) /**< DMA请求为LPTIM1自动重载 */
|
||
#define DMA_REQUEST_LPTIM2_CMPM (28U) /**< DMA请求为LPTIM2比较/匹配 */
|
||
#define DMA_REQUEST_LPTIM2_ARRM (28U) /**< DMA请求为LPTIM2自动重载 */
|
||
|
||
/* 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传输错误状态 */
|
||
|
||
/* 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传输错误状态清除 */
|
||
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*-------------------------------------------functions------------------------------------------*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup DMA_External_Functions DMA External Functions
|
||
* @brief DMA对外函数
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
/**
|
||
* @brief 使能DMA通道
|
||
* @param channel DMA通道
|
||
* @arg DMA_CHANNEL_0
|
||
* @arg DMA_CHANNEL_1
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @retval bool DMA循环模式使能状态
|
||
* @arg true DMA循环模式使能
|
||
* @arg false DMA循环模式禁止
|
||
*/
|
||
__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
|
||
* @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
|
||
* @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
|
||
* @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 DMA_FLAG_TH0
|
||
* @arg DMA_FLAG_TE0
|
||
* @arg DMA_FLAG_G1
|
||
* @arg DMA_FLAG_TF1
|
||
* @arg DMA_FLAG_TH1
|
||
* @arg DMA_FLAG_TE1
|
||
* @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 DMA_CLEAR_TH0
|
||
* @arg DMA_CLEAR_TE0
|
||
* @arg DMA_CLEAR_G1
|
||
* @arg DMA_CLEAR_TF1
|
||
* @arg DMA_CLEAR_TH1
|
||
* @arg DMA_CLEAR_TE1
|
||
* @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
|
||
* @param req_id DMA请求信号源
|
||
* @arg DMA_REQUEST_SOFTWARE
|
||
* @arg DMA_REQUEST_ADC
|
||
* @arg ...
|
||
* @arg DMA_REQUEST_LPTIM2_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
|
||
* @retval uint32_t DMA请求信号源
|
||
* @arg DMA_REQUEST_SOFTWARE
|
||
* @arg DMA_REQUEST_ADC
|
||
* @arg ...
|
||
* @arg DMA_REQUEST_LPTIM2_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通道
|
||
* @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
|
||
* @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), (config_value));
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 复位DMA通道控制器
|
||
* @param channel DMA通道
|
||
* @arg DMA_CHANNEL_0
|
||
* @arg DMA_CHANNEL_1
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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
|
||
* @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 /* CIU32L051_STD_DMA_H */
|