电机控制 stm32f4-dma
usart dma - jamaal555 - 博客园 (cnblogs.com)
【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)_Z小旋的博客-CSDN博客_stm32cubemx 串口dma
一、DMA基本介绍
绕过cpu,直接从外设->存储器。
定义:
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
传输方向:
外设到内存
内存到外设
内存到内存
外设到外设
DMA传输参数:
我们知道,数据传输,首先需要的是:1 数据的源地址, 2 数据传输位置的目标地址 ,3 传递数据多少的数据传输量 ,4 进行多少次传输的传输模式. DMA所需要的核心参数,便
是这四个. 当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循
环传输模式 当到达传输终点时会重新启动DMA传输。 也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。
DMA主要特征:
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置:
优先级:在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);
数据宽度:独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。但是源和目标地址必须按数据传输宽度对齐;
循环:支持循环的缓冲器管理;
产生事件:每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
方向:存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;
数据传输数目:可编程的数据传输数目:最大为65535。
二、stm32的DMA资源
对于大容量的STM32芯片有2个DMA控制器 ,DMA1有7个通道,DMA2有5个通道。
每个通道都可以配置一些外设的地址。
1. DMA1 控制器
从外设(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])产生的7个DMA请求,通过逻辑或输入到DMA1控制器 其中每个通道都对应着具体的外设:


2. DMA2 控制器
从外设(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,其中每个通道都对应着具体的外设:


电机中AD想用dma的话,最好设置成ADC1 ADC3,这样可以同时设置两个DMA。
3.DMA 工作框图

(1)在没有dma的情况下,adc的数据怎么存放到sram中:
如果没有DMA,CPU传输数据还要以内核作为中转站,比如要将ADC采集的数据转移到到SRAM中,这个过程是这样的:
内核通过DCode经过总线矩阵协调,从获取AHB存储的外设ADC采集的数据,
然后内核再通过DCode经过总线矩阵协调把数据存放到内存SRAM中。

(2)有dma下,ad的数据传到sram中:

1:DMA传输时外设对DMA控制器发出请求。
2:DMA控制器收到请求,触发DMA工作。
3:DMA控制器从AHB外设获取ADC采集的数据,存储到DMA通道中
4:DMA控制器的DMA总线与总线矩阵协调,使用AHB把外设ADC采集的数据经由DMA通道存放到SRAM中,这个数据的传输过程中,完全不需要内核的参与,也就是不需要CPU的参与。
我们把上面的步骤专业一点介绍:
在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。
当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。DMA传输结束,如果有更多的请求时,外设可以启动下一个周期。
总之,每次DMA传送由3个操作组成:
· 从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
· 存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
· 执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。
4.DMA传输方式
方法1:DMA_Mode_Normal,正常模式,
当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
方法2:DMA_Mode_Circular ,循环传输模式
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式
5. DMA仲裁器
判断各通道的优先级。
注意: 在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。
6.指针递增模式
根据 DMA_SxCR 寄存器中 PINC 和 MINC 位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值。
通过单个寄存器访问外设源或目标数据时,禁止递增模式十分有用。
如果使能了递增模式,则根据在 DMA_SxCR 寄存器 PSIZE 或 MSIZE 位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增 1个数据宽度、2个数据宽度或 4个数据宽度。
7.DMA中断
每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。

使能没开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 TCIFx位,即数据流 x 的 DMA 传输完成与否标志。
8.DMA库函数配置过程
1、使能DMA时钟:RCC_AHBPeriphClockCmd(); 2、初始化DMA通道:DMA_Init(); //设置通道;传输地址;传输方向;传输数据的数目;传输数据宽度;传输模式(正常/单次模式、循环模式);优先级;是否开启存储器到存储器。 3、使能外设DMA; 4、使能DMA通道传输; 5、查询DMA传输状态。 ————————————————
三、cubemx usart dma实例
1.usart设置
略。
2.dma设置

1: 通道、传输方向、传输速度 2:正常模式/循环模式(正常模式就是单次模式) 3:是否指针递增,图中是存储器打开了指针递增,外设没有(因为只有一个外设) 4:数据宽度,源和目的的数宽要一致。
3 内核中DMA选项卡的设置

可以设置选择通道、优先级。

浙公网安备 33010602011771号