/**
* @brief DMA去初始化
*
* 将指定的DMA通道恢复到默认状态。
*
* @param DMAy_Channelx DMA通道指针,指定要去初始化的DMA通道
*/
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);
/**
* @brief DMA初始化
*
* 根据指定的初始化结构体配置DMA通道。
*
* @param DMAy_Channelx DMA通道指针,指定要初始化的DMA通道
* @param DMA_InitStruct 指向DMA初始化结构体的指针,用于配置DMA通道
*/
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);
/**
* @brief DMA结构体初始化
*
* 将DMA初始化结构体设置为默认状态。
*
* @param DMA_InitStruct 指向DMA初始化结构体的指针,该结构体将被设置为默认状态
*/
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);
/**
* @brief DMA使能/失能
*
* 启用或禁用指定的DMA通道。
*
* @param DMAy_Channelx DMA通道指针,指定要操作的DMA通道
* @param NewState 新的状态,ENABLE表示启用DMA通道,DISABLE表示禁用DMA通道
*/
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);
/**
* @brief DMA中断配置
*
* 启用或禁用指定的DMA通道的中断。
*
* @param DMAy_Channelx DMA通道指针,指定要操作的DMA通道
* @param DMA_IT 要配置的中断类型
* @param NewState 新的状态,ENABLE表示启用中断,DISABLE表示禁用中断
*/
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);
/**
* @brief 设置DMA当前数据传输计数器
*
* 设置DMA通道要传输的数据量。
*
* @param DMAy_Channelx DMA通道指针,指定要操作的DMA通道
* @param DataNumber 要传输的数据量
*/
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);
/**
* @brief 获取DMA当前数据传输计数器
*
* 获取DMA通道当前已传输的数据量。
*
* @param DMAy_Channelx DMA通道指针,指定要查询的DMA通道
* @return 当前已传输的数据量
*/
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);
/**
* @brief 获取DMA标志状态
*
* 检查指定的DMA标志是否被设置。
*
* @param DMAy_FLAG 要检查的DMA标志
* @return 标志状态,SET表示标志被设置,RESET表示标志未设置
*/
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
/**
* @brief 清除DMA标志
*
* 清除指定的DMA标志。
*
* @param DMAy_FLAG 要清除的DMA标志
*/
void DMA_ClearFlag(uint32_t DMAy_FLAG);
/**
* @brief 获取DMA中断状态
*
* 检查指定的DMA中断是否被触发。
*
* @param DMAy_IT 要检查的DMA中断
* @return 中断状态,SET表示中断被触发,RESET表示中断未触发
*/
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);
/**
* @brief 清除DMA待处理中断位
*
* 清除指定的DMA待处理中断位。
*
* @param DMAy_IT 要清除的DMA中断
*/
void DMA_ClearITPendingBit(uint32_t DMAy_IT);
变量放在SRAM区
const修饰的常量放在flash区
- 开启时钟
/*开启时钟*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA的时钟
- DMA初始化
/*DMA初始化*/
DMA_InitTypeDef DMA_InitStructure; //定义结构体变量
DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA; //外设基地址,给定形参AddrA
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度,选择字节
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; //外设地址自增,选择使能
DMA_InitStructure.DMA_MemoryBaseAddr = AddrB; //存储器基地址,给定形参AddrB
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //存储器数据宽度,选择字节
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器地址自增,选择使能
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,选择由外设到存储器
DMA_InitStructure.DMA_BufferSize = Size; //转运的数据大小(转运次数)
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //模式,选择正常模式
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable; //存储器到存储器,选择使能
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //优先级,选择中等
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //将结构体变量交给DMA_Init,配置DMA1的通道1
#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000)
#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100)
#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200)
#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040)
#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000)
#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010)
#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000)
#define DMA_Mode_Circular ((uint32_t)0x00000020)
#define DMA_Mode_Normal ((uint32_t)0x00000000)
#define DMA_M2M_Enable ((uint32_t)0x00004000)
#define DMA_M2M_Disable ((uint32_t)0x00000000)
#define DMA_Priority_VeryHigh ((uint32_t)0x00003000)
#define DMA_Priority_High ((uint32_t)0x00002000)
#define DMA_Priority_Medium ((uint32_t)0x00001000)
#define DMA_Priority_Low ((uint32_t)0x00000000)
- DMA使能
/*DMA使能*/
DMA_Cmd(DMA1_Channel1, DISABLE); //这里先不给使能,初始化后不会立刻工作,等后续调用Transfer后,再开始
- 启动DMA数据转运
/**
* 函 数:启动DMA数据转运
* 参 数:无
* 返 回 值:无
*/
void MyDMA_Transfer(void)
{
DMA_Cmd(DMA1_Channel1, DISABLE); //DMA失能,在写入传输计数器之前,需要DMA暂停工作
DMA_SetCurrDataCounter(DMA1_Channel1, MyDMA_Size); //写入传输计数器,指定将要转运的次数
DMA_Cmd(DMA1_Channel1, ENABLE); //DMA使能,开始工作
while (DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET); //等待DMA工作完成
DMA_ClearFlag(DMA1_FLAG_TC1); //清除工作完成标志位
}