免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

STM32 DMA学习

STM32 DMA学习 一. DMA介绍DMADirect Memory Access 直接内存访问用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预数据可以通过DMA快速地移动这就节省了CPU的资源来做其他操作。STM32具体DMA数量完全取决于你用的是哪个系列和型号这里以大容量型号STM32F103Z8T6为例2个DMA控制器有12个通道(DMA1有7个通道DMA2有5个通道)每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。DMA控制器和CortexT~-M3核心共享系统数据总线执行直接存储器数据传输。当CPU和DMA时访问相同的目标(RAM或外设)时DMA请求会暂停CPU访问系统总线达若干个周期总线仲裁器执行循环调度以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。要注意的是DMA2只存在于大容量产品和互联型产品中。二. DMA框图这里的DMA接在AHB总线上1) DMA请求如果外设要想通过DMA来传输数据必须先给DMA控制器发送DMA请求DMA控制器收到请求信号之后控制器会给外设一个应答信号当外设得到控制器的应答信号后外设会立即释放它的请求。2)通道DMA具有12个独立可编程的通道其中 DMA1有7个通道DMA2有5个通道每个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求但是同一时间只能接收一个不能同时接收多个。从外设(TIMx[x1、 2、 3、 4]、 ADC1、 SPI1、 SPI/I2S2、 I2Cx[x1、 2]和USARTx[x1、 2、 3])产生的7个请求通过逻辑或输入到DMA1控制器这意味着同时只能有一个请求有效。参见下图的DMA1请求映像。外设的DMA请求可以通过设置相应外设寄存器中的控制位被独立地开启或关闭。3)仲裁器当发生多个DMA通道请求时就意味着有先后响应处理的顺序问题这个就由仲裁器管理。仲裁器管理DMA通道请求分为两个阶段。第一阶段属于软件阶段可以在DMA_CCRx寄存器中设置有4个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段如果两个或以上的DMA通道请求设置的优先级一样则他们优先级取决于通道编号编号越低优先权越高比如通道1高于通道2。在大容量产品和互联型产品中DMA1控制器拥有高于DMA2控制器的优先级。4)传输方向存储器到外设外设到存储器存储器到存储器。这里的存储器指的是ROM和RAM。注意DMA没有办法把数据从RAM传输到ROM(flash)。案例实现ROM---RAM数据传输关键寄存器将DMA_CCRx寄存器的MEM2MEM位置1即可以打开对应ROM到RAM的通道。在此案例中将ROM当作外设从ROM里读数据。外设和存储器宽度设置在DMA_CCRx寄存器的这俩位可以配置。配置地址自增若数据位宽为8地址自增1位宽16自增2。数据传输长度设置DMA_CNDTRx该寄存器自减为0则表示数据传输结束同时产生TC(transfer completion)事件。TCIE:开启此位可以产生传输完成中断,TCIF:传输完成事件标志位。HTIE:传输过半中断使能位HTIF:传输过半事件标志位。TEIE:传输错误使能位HEIF:传输错误事件标志位。将要传输数据的地址给到CPAR外设地址寄存器。将目标地址给到CMAR存储器地址寄存器。
返回列表