欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32中的DMA机制(以STM32F103为例)

程序员文章站 2024-02-26 18:02:40
...

1.作用

DMA(直接存储器访问)用来在外设和存储器之间或者存储器和存储器之间进行高速数据传输。并且该过程不需要cpu进行干预,节省cpu资源,从而提cpu的执行效率。

2.资源

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

每个通道专门用来管理一个或者多个外设对存储器访问请求

一个仲裁器用来协调各个DMA请求的优先权。

3.DMA框图

STM32中的DMA机制(以STM32F103为例)

  

4.特性

1)每个通道都直接连接专用的硬件DMA请求,并且每一个通道都支持软件触发。

2)在同一个DMA模块上,多个请求之间的优先权可以通过软件编程设置(很高、高、中、低),在优先权设置相等时由硬件决定(0优先于1)。

3)支持循环的缓冲器管理。

4)独立数据源和目标数据区的传输宽度(字节:8位、半字:16位、全字:32位),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。

5)每个通道都有3个事件标志(DMA半传输、 DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。

6)存储器和存储器之间,外设和存储器之间、存储器和外设之间的传输。

7)可编程最大的数据传输数目是65535。

 

DMA处理数据:取数据->存数据->任务量-1

 

指针增量:(可选的)

源:外设寄存器地址宽度:8

目标:存储器地址(val)宽度:8

 

5.配置过程

 

配置DMA通道x的过程(x代表通道号):外设  存储
1DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。
2DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址。
3DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。
4DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。

5DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。

6设置DMA_CCRx寄存器的ENABLE位,启动该通道。

void DMA_confi(void)
{
	RCC->AHBENR |= (0X01);
	DMA1_Channel1->CPAR = (uint32_t )&(ADC1->DR);
	DMA1_Channel1->CMAR =(uint32_t )adc_str ;
	DMA1_Channel1->CNDTR =9;
	DMA1_Channel1->CCR |=(0x03<<12);
	DMA1_Channel1->CCR &=~(0x01<<4);//从外设读取数据
	
	DMA1_Channel1->CCR |= (0x01<<5);//循环模式
	DMA1_Channel1->CCR |= (0x01<<7);

	DMA1_Channel1->CCR |= (0x01<<8);

	DMA1_Channel1->CCR |= (0x01<<10);
	DMA1_Channel1	->CCR |=(0x01<<1);
	DMA1_Channel1->CCR |= (0x01);
	
	ADC1->CR2 |=(0x01<<8);
}

 

相关标签: stm32 嵌入式