STM32f103--DMA配置

简介:

直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传
输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自
于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权

DMA主要特性
● 12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过
软件来配置。
● 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、
中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 。
● 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目
标地址必须按数据传输宽度对齐。
● 支持循环的缓冲器管理
● 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志
逻辑或成为一个单独的中断请求。
● 存储器和存储器间的传输
● 外设和存储器、存储器和外设之间的传输
● 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
● 可编程的数据传输数目:最大为65535

 1.DMA2仅存在于大容量产品和互联型产品。
2.SPI/I2S3、UART4、TIM5、TIM6、TIM7和DAC的DMA请求仅存在于大容量产品和互联型产品。
3.ADC3、SDIO和TIM8的DMA请求仅存在于大容量产品。

功能描述:

DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA
同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线
仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。

DMA处理
在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理
请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当
从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制
器同时撤销应答信号。如果有更多的请求时,外设可以启动下一个周期。
总之,每次DMA传送由3个操作组成:
● 从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传
输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。
● 存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输
时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。
● 执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

仲裁器
仲裁器根据通道请求的优先级来启动外设/存储器的访问。
优先权管理分2个阶段:
● 软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:
最高优先级
高优先级
中等优先级
低优先级
● 硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优
先权。举个例子,通道2优先于通道4。
注意: 在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级

DMA 通道:

每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。DMA传输的数据
量是可编程的,最大达到65535。包含要传输的数据项数量的寄存器,在每次传输后递减。

可编程的数据量:外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程。

指针增量:

通过设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后可以
有选择地完成自动增量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量
值,增量值取决与所选的数据宽度为1、2或4。第一个传输的地址是存放在DMA_CPARx
/DMA_CMARx寄存器中地址。在传输过程中,这些寄存器保持它们初始的数值,软件不能改变
和读出当前正在传输的地址
(它在内部的当前外设/存储器地址寄存器中)。
当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的
DMA传输,需要在关闭DMA通道的情况下,在DMA_CNDTRx寄存器中重新写入传输数目。

在循环模式下,最后一次传输结束时,DMA_CNDTRx寄存器的内容会自动地被重新加载为其初
始数值,内部的当前外设/存储器地址寄存器也被重新加载为DMA_CPARx/DMA_CMARx寄存器
设定的初始基地址。

循环模式:

循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中
的CIRC位用于开启这一功能。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢
复成配置通道时设置的初值,DMA操作将会继续进行。

存储器到存储器模式:

DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时,DMA传输结束。存储器到存储器模式不能与循环模式同时使用。 

 DMA请求映像
DMA1控制器

从外设(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])
产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。参见下
图的DMA1请求映像。
外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭

 

库函数:

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是STM32F103串口3的DMA配置步骤: 1. 首先要启用串口3的DMA功能,可以通过设置USART3的CR3寄存器DMAEN位来实现。在使用DMA之前,需要确保串口3已经正确地初始化,并且可以正常发送和接收数据。 2. 接下来需要配置DMA,包括DMA通道、传输方向、数据长度、传输模式等参数。可以使用ST提供的HAL库或者直接配置寄存器来实现。 3. 配置DMA传输完成断,以便在数据传输完成后触发断处理函数。可以使用HAL库提供的断处理函数或者直接编写断处理函数来实现。 4. 启动DMA传输,当需要发送或接收数据时,将数据缓存地址和数据长度设置给DMA,并启动传输。 下面是一个使用HAL库配置串口3的DMA发送功能的示例代码: ```c /* 使能串口3的DMA功能 */ __HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_USART3_CLK_ENABLE(); USART3->CR3 |= USART_CR3_DMAR; /* 配置DMA传输参数 */ hdma_usart3_tx.Instance = DMA1_Channel2; hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart3_tx.Init.Mode = DMA_NORMAL; hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW; HAL_DMA_Init(&hdma_usart3_tx); __HAL_LINKDMA(huart, hdmatx, hdma_usart3_tx); /* 配置DMA传输完成断 */ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 1, 0); HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); /* 启动DMA传输 */ HAL_UART_Transmit_DMA(&huart3, tx_buffer, tx_length); ``` 注意,以上代码仅供参考,实际使用时需要根据具体情况进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值