📄 stm32f10x_dma.c
字号:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* 文件名称: stm32f10x_dma.c
* 程序作者: MCD Application Team
* 程序版本: V2.0.2
* 编制日期: 07/11/2008
* 功能描述: 这个文件提供了所有DMA的固件函数.
* 本文汉化: 孙可 2008.08.15
********************************************************************************
* 目前的固件的目的是为客户提供关于他们的产品的编码信息以便于节省他们时间。
* 结果, 意法半导体将不会为此承担任何直接,间接或相应的损害赔偿方面的任何索赔要求,
* 例如固件或使用所作的客户编码中他涉嫌包含与他们的相关产品的信息。
*******************************************************************************/
/* 包涵的文件 ------------------------------------------------------------------*/
#include "stm32f10x_dma.h"
#include "stm32f10x_rcc.h"
/* 自用类型 -----------------------------------------------------------*/
/* 自用定义 ------------------------------------------------------------*/
/* DMA ENABLE mask */
#define CCR_ENABLE_Set ((u32)0x00000001)
#define CCR_ENABLE_Reset ((u32)0xFFFFFFFE)
/* DMA1 Channelx interrupt pending bit masks */
#define DMA1_Channel1_IT_Mask ((u32)0x0000000F)
#define DMA1_Channel2_IT_Mask ((u32)0x000000F0)
#define DMA1_Channel3_IT_Mask ((u32)0x00000F00)
#define DMA1_Channel4_IT_Mask ((u32)0x0000F000)
#define DMA1_Channel5_IT_Mask ((u32)0x000F0000)
#define DMA1_Channel6_IT_Mask ((u32)0x00F00000)
#define DMA1_Channel7_IT_Mask ((u32)0x0F000000)
/* DMA2 Channelx interrupt pending bit masks */
#define DMA2_Channel1_IT_Mask ((u32)0x0000000F)
#define DMA2_Channel2_IT_Mask ((u32)0x000000F0)
#define DMA2_Channel3_IT_Mask ((u32)0x00000F00)
#define DMA2_Channel4_IT_Mask ((u32)0x0000F000)
#define DMA2_Channel5_IT_Mask ((u32)0x000F0000)
/* DMA2 FLAG mask */
#define FLAG_Mask ((u32)0x10000000)
/* DMA registers Masks */
#define CCR_CLEAR_Mask ((u32)0xFFFF800F)
/* 自用宏 -------------------------------------------------------------*/
/* 自用变量 ---------------------------------------------------------*/
/* 自用函数原型 -----------------------------------------------*/
/* 自用函数 ---------------------------------------------------------*/
/*******************************************************************************
* 函数名称: DMA_DeInit
* 功能描述: 将DMA各通道寄存器复位为默认的复位值.
* 输入参数: DMAy_Channelx:y可以是1或者2,DMA1的x可以是1到7 和DMA2的x可以是1到5来选择各通道
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx)
{
/* Check the parameters [检查参数]*/
assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));
/* Disable the selected DMAy Channelx [禁止选择的DMAy 通道x]*/
DMAy_Channelx->CCR &= CCR_ENABLE_Reset;
/* Reset DMAy Channelx control register [复位DMAy Channelx的控制寄存器]*/
DMAy_Channelx->CCR = 0;
/* Reset DMAy Channelx remaining bytes register [复位DMAy Channelx的剩余字节寄存器]*/
DMAy_Channelx->CNDTR = 0;
/* Reset DMAy Channelx peripheral address register [复位DMAy Channelx外围设备地址寄存器]*/
DMAy_Channelx->CPAR = 0;
/* Reset DMAy Channelx memory address register [复位DMAy Channelx内存地址寄存器]*/
DMAy_Channelx->CMAR = 0;
switch (*(u32*)&DMAy_Channelx)
{
case DMA1_Channel1_BASE:
/* Reset interrupt pending bits for DMA1 Channel1 [复位DMA1 Channel1中断挂起位]*/
DMA1->IFCR |= DMA1_Channel1_IT_Mask;
break;
case DMA1_Channel2_BASE:
/* Reset interrupt pending bits for DMA1 Channel2 [复位DMA1 Channel2中断挂起位]*/
DMA1->IFCR |= DMA1_Channel2_IT_Mask;
break;
case DMA1_Channel3_BASE:
/* Reset interrupt pending bits for DMA1 Channel3 [复位DMA1 Channel3中断挂起位]*/
DMA1->IFCR |= DMA1_Channel3_IT_Mask;
break;
case DMA1_Channel4_BASE:
/* Reset interrupt pending bits for DMA1 Channel4 [复位DMA1 Channel4中断挂起位]*/
DMA1->IFCR |= DMA1_Channel4_IT_Mask;
break;
case DMA1_Channel5_BASE:
/* Reset interrupt pending bits for DMA1 Channel5 [复位DMA1 Channel5中断挂起位]*/
DMA1->IFCR |= DMA1_Channel5_IT_Mask;
break;
case DMA1_Channel6_BASE:
/* Reset interrupt pending bits for DMA1 Channel6 [复位DMA1 Channel6中断挂起位]*/
DMA1->IFCR |= DMA1_Channel6_IT_Mask;
break;
case DMA1_Channel7_BASE:
/* Reset interrupt pending bits for DMA1 Channel7 [复位DMA1 Channel7中断挂起位]*/
DMA1->IFCR |= DMA1_Channel7_IT_Mask;
break;
case DMA2_Channel1_BASE:
/* Reset interrupt pending bits for DMA2 Channel1 [复位DMA2 Channel1中断挂起位]*/
DMA2->IFCR |= DMA2_Channel1_IT_Mask;
break;
case DMA2_Channel2_BASE:
/* Reset interrupt pending bits for DMA2 Channel2 [复位DMA2 Channel2中断挂起位]*/
DMA2->IFCR |= DMA2_Channel2_IT_Mask;
break;
case DMA2_Channel3_BASE:
/* Reset interrupt pending bits for DMA2 Channel3 [复位DMA2 Channel3中断挂起位]*/
DMA2->IFCR |= DMA2_Channel3_IT_Mask;
break;
case DMA2_Channel4_BASE:
/* Reset interrupt pending bits for DMA2 Channel4 [复位DMA2 Channel4中断挂起位]*/
DMA2->IFCR |= DMA2_Channel4_IT_Mask;
break;
case DMA2_Channel5_BASE:
/* Reset interrupt pending bits for DMA2 Channel5 [复位DMA2 Channel5中断挂起位]*/
DMA2->IFCR |= DMA2_Channel5_IT_Mask;
break;
default:
break;
}
}
/*******************************************************************************
* 函数名称: DMA_Init
* 功能描述: 根据DMA_InitStruct指定的参数初始化DMA各通道.
* 输入参数: (1)DMAy_Channelx:y可以是1或者2,DMA1的x可以是1到7 和DMA2的x可以是1到5来选择各通道.
* (2)DMA_InitStruct:指向DMA_InitTypeDef,它包含特定DMA频道的配置信息。
* 输出参数: 无
* 返回参数: 无
******************************************************************************/
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct)
{
u32 tmpreg = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));
assert_param(IS_DMA_DIR(DMA_InitStruct->DMA_DIR));
assert_param(IS_DMA_BUFFER_SIZE(DMA_InitStruct->DMA_BufferSize));
assert_param(IS_DMA_PERIPHERAL_INC_STATE(DMA_InitStruct->DMA_PeripheralInc));
assert_param(IS_DMA_MEMORY_INC_STATE(DMA_InitStruct->DMA_MemoryInc));
assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(DMA_InitStruct->DMA_PeripheralDataSize));
assert_param(IS_DMA_MEMORY_DATA_SIZE(DMA_InitStruct->DMA_MemoryDataSize));
assert_param(IS_DMA_MODE(DMA_InitStruct->DMA_Mode));
assert_param(IS_DMA_PRIORITY(DMA_InitStruct->DMA_Priority));
assert_param(IS_DMA_M2M_STATE(DMA_InitStruct->DMA_M2M));
/*--------------------------- DMAy Channelx CCR Configuration [DMAy 通道x CCR配置]-----------------*/
/* Get the DMAy_Channelx CCR value [取得DMAy_Channelx CCR的值]*/
tmpreg = DMAy_Channelx->CCR;
/* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits [清MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC 和 DIR位]*/
tmpreg &= CCR_CLEAR_Mask;
/* Configure DMAy Channelx: data transfer, data size, priority level and mode [配置DMAy 通道x:数据传输,数据类型,优先级和模式]*/
/* Set DIR bit according to DMA_DIR value [依照DMA_DIR的值设置DIR位]*/
/* Set CIRC bit according to DMA_Mode value [依照DMA_Mode的值设置CIRC位]*/
/* Set PINC bit according to DMA_PeripheralInc value [依照DMA_PeripheralInc的值设置PINC位]*/
/* Set MINC bit according to DMA_MemoryInc value [依照DMA_MemoryInc的值设置MINC位]*/
/* Set PSIZE bits according to DMA_PeripheralDataSize value [依照DMA_PeripheralDataSize的值设置PSIZE位]*/
/* Set MSIZE bits according to DMA_MemoryDataSize value [依照DMA_MemoryDataSize的值设置MSIZE位]*/
/* Set PL bits according to DMA_Priority value [依照DMA_Priority的值设置PL位]*/
/* Set the MEM2MEM bit according to DMA_M2M value [依照DMA_M2M的值设置MEM2MEM位]*/
tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode |
DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc |
DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize |
DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M;
/* Write to DMAy Channelx CCR [写DMAy通道x CCR]*/
DMAy_Channelx->CCR = tmpreg;
/*--------------------------- DMAy Channelx CNDTR Configuration [DMAy 通道x CNDTR配置]---------------*/
/* Write to DMAy Channelx CNDTR [写DMAy通道x CNDTR]*/
DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize;
/*--------------------------- DMAy Channelx CPAR Configuration [DMAy 通道x CPAR配置]----------------*/
/* Write to DMAy Channelx CPAR [写DMAy通道x CPAR]*/
DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr;
/*--------------------------- DMAy Channelx CMAR Configuration [DMAy 通道x CMAR配置]----------------*/
/* Write to DMAy Channelx CMAR [写DMAy通道x CMAR]*/
DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr;
}
/*******************************************************************************
* 函数名称: DMA_StructInit
* 功能描述: 将DMA_InitStruct的每个成员复位为默认值.
* 输入参数: DMA_InitStruc:指向需要初始化的DMA_InitTypeDef结构。
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct)
{
/*-------------- Reset DMA init structure parameters values ------------------*/
/* Initialize the DMA_PeripheralBaseAddr member [初始化DMA_PeripheralBaseAddr成员]*/
DMA_InitStruct->DMA_PeripheralBaseAddr = 0;
/* Initialize the DMA_MemoryBaseAddr member [初始化DMA_MemoryBaseAddr成员]*/
DMA_InitStruct->DMA_MemoryBaseAddr = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -