STM32 DMA通道一览及其配置

DMA通道一览

DMA1通道

DMA1通道

DMA2通道

DMA2通道

DMA内容详解

DMA的定义

直接存储器存取(Direct Memory
Access,DMA)是计算机科学中的一种内存访问技术。它允许某些电脑内部的硬体子系统(电脑外设),可以独立地直接读写系统存储器,而不需绕道
CPU。在同等程度的CPU负担下,DMA是一种快速的数据传送方式。它允许不同速度的硬件装置来沟通,而不需要依于 CPU的大量中断请求。

DMA有什么用?

直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

有多少个DMA资源?

有两个DMA控制器,DMA1有7个通道,DMA2有5个通道。

数据从什么地方送到什么地方?

1.外设到SRAM(I2C/UART等获取数据并送入SRAM);
2.SRAM的两个区域之间;
3.外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比);
4.SRAM到外设(SRAM中预先保存的数据送入DAC产生各种波形);

DMA可以传递多少数据?

传统的DMA的概念是用于大批量数据的传输,但是我理解,在STM32中,它的概念被扩展了,也许更多的时候快速是其应用的重点。数据可以从1~65535个。

DMA在stm32中的配置

使用DMA需配置的重要参数:
*1、源地址和目的地址;
2、传输数据个数;
3、传输完成中断(可选);
4、传输方向

DMA的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改
从存储器->外设模式/8位数据宽度/存储器增量模式
选择通道DMA1_Channel5为接收通道, DMA1_Channel4 为发送通道
外设地址 (uint32_t)&USART1->DR 串口1的地址
发送内存的地址 (uint32_t)SendBuff
发送模式DMA_DIR_PeripheralDST,接收模式 DMA_DIR_PeripheralSRC //数据大小
缓存的容量SEND_BUF_SIZE

void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,
	u32 PeripheralAddr,
u32 MemoryAddr,
u32 TranDir,
u16 BufferSize)
{
	DMA_InitTypeDef DMA_InitStructure; 
 	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1|RCC_AHBPeriph_DMA2, ENABLE);	//使能DMA传输
	
  DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值

	DMA1_MEM_LEN=BufferSize;
	DMA_InitStructure.DMA_PeripheralBaseAddr = PeripheralAddr;  //DMA外设基地址
	DMA_InitStructure.DMA_MemoryBaseAddr = MemoryAddr;  //DMA内存基地址
	DMA_InitStructure.DMA_DIR = TranDir;  //数据传输方向,从内存读取发送到外设
	DMA_InitStructure.DMA_BufferSize = BufferSize;  //DMA通道的DMA缓存的大小
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
	DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
	  	
} 

以上程序仅仅是打开DMA通道,如果要使用DMA,还要针对所用外设进行相对应的配置。

STM32 DMA通道配置一般需要以下几个步骤: 1. 选择DMA通道:根据所需的外设和DMA传输方向,选择对应的DMA通道。不同的外设和方向可能对应不同的DMA通道,需要根据具体情况进行选择。 2. 配置DMA控制器:包括DMA通道、源地址、目的地址、数据长度、传输模式等参数的配置。这些参数的配置需要根据具体的应用场景进行选择,以满足传输的需求。 3. 配置DMA中断:可以选择是否开启DMA传输完成中断,以便及时处理DMA传输完成的事件。 下面是一个简单的DMA通道配置的示例代码,以USART1为例: ``` // 选择DMA通道 #define DMA_USART1_TX_CHANNEL 4 // 配置DMA控制器 DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_Channel = DMA_USART1_TX_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &USART1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) tx_buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_MEMORY_TO_PERIPH; DMA_InitStructure.DMA_BufferSize = tx_size; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA_USART1_TX_CHANNEL, &DMA_InitStructure); // 配置DMA中断 DMA_ITConfig(DMA_USART1_TX_CHANNEL, DMA_IT_TC, ENABLE); ``` 在这个示例代码中,我们选择了USART1的第4个DMA通道进行配置,将数据从内存中的tx_buffer传输到USART1的DR寄存器中。其中,tx_size表示要传输的数据长度,DMA_Mode_Normal表示传输模式为非循环传输。我们还开启了DMA传输完成中断,以便在传输完成时及时处理相关事件。 希望这些信息能够帮到您,如果您还有其他问题,请继续提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值