DMA实现过程

/**  
 * @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);

image.png
变量放在SRAM区
const修饰的常量放在flash区
image.png
image.png
image.png

  1. 开启时钟
/*开启时钟*/
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);						//开启DMA的时钟
  1. 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)

  1. DMA使能
/*DMA使能*/
	DMA_Cmd(DMA1_Channel1, DISABLE);	//这里先不给使能,初始化后不会立刻工作,等后续调用Transfer后,再开始

  1. 启动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);						//清除工作完成标志位
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值