STM32的UART DMA传输总结

原创 2016年05月28日 13:38:15

使用DMA传输可以连续获取或发送一段信息而不占用中断或延时,在通信频繁或有大段信息要传输时非常有用。

这里写图片描述
由上表可知,要使用USART1TX/RX我们选择通道4和5

1、 DMA传输方式:
(1) DMA_Mode_Normal,当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的DMA传输,需要3个步骤:在关闭DMA通道的情况下,在DMA_CNDTRx寄存器中重新写入传输数目,然后重新开启DMA。

void DMA1_Channel5_IRQHandler(void)
{//由于不同的中断源拥有同一个中断矢量入口,所以需要判断中断标志
    if(DMA_GetFlagStatus(DMA1_FLAG_TC5)==SET)
    {
        DMA_Cmd (DMA1_Channel5,DISABLE);//关闭DMA通道
        DMA_ClearFlag(DMA1_FLAG_TC5);//清中断标志,否则会一直中断
        DMA_SetCurrDataCounter(DMA1_Channel5,UART_DMA_BUFFSIZE);//重置传输数目,当再次达到这个数目就会进中断
        DMA_Cmd (DMA1_Channel5,ENABLE);//开启DMA通道
    }
}

(2) DMA_Mode_Circular,在循环模式下,最后一次传输结束时, DMA_CNDTRx寄存器的内容会自动地被重新加载为其初始数值,内部的当前外设/存储器地址寄存器也被重新加载为DMA_CPARx/DMA_CMARx寄存器设定的初始基地址。
2、将外设与DMA连接起来
将串口1的发送设置成DMA模式:

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

3、数据的发送
使用非循环模式,跟上文的1.(1)中重新开启DMA的3个步骤一样,将UART_TX_Buff中的数据准备好,然后开启DMA,即可自动发送UART_TX_Buff中的数据,数据传输完成,进入中断DMA1_Channel4_IRQHandler

4、数据的接收
使用DMA中断来接收数据,只能接收固定帧长的数据,USART接收够一定长度的数据,就会进入DMA中断。
若要接收可变长度的数据,方法有以下3种:
  1.将RX脚与一路时钟外部引脚相连,当串口一帧发完,即可利用此定时器产生超时中断.这个实时性较高,可以做到1个字节实时监测.
  2.不改变硬件,开启一个定时器监控DMA接收,如果超时则产生中断.这个实时性不高,因为超时时间必须要大于需要接收帧的时间,精度不好控制.
  3.STM32单片机有的串口可以监测总线是否处于空闲,如果空闲则产生中断.可以用它来监测DMA接收是否完毕.这种方式实时性很高。当USART在停止位后的一个byte的时间内,总线是空闲的,就置位总线空闲标志,这时我们认为一帧的数据传输完成,就会进入USART中断处理。
  但这里需要注意一个问题就是,如果两帧的数据紧挨着一起被接收,那么这种情况应该使用DMA中断。因为使用USART空闲中断的话,要两帧全部发完才能进入中断,这样只能处理一帧的数据;使用DMA中断的话,在第一帧结束就可以进入中断,即使第二帧紧跟着后面。

代码中是采用第三种方法。
【Reference】
http://blog.csdn.net/jdh99/article/details/8444474
http://blog.chinaunix.net/uid-21658993-id-3030728.html

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011388550/article/details/49965117

STM32 串口采用DMA方式收发

一直都没有整理STM32 DMA应用,这篇文章算是抛砖引玉吧,欢迎拍砖。 本人QQ 330952038,欢迎交流学习什么是DMA —- Directional Memory Access, 直接存储...
  • gdjason
  • gdjason
  • 2016-03-30 20:53:54
  • 5354

STM32F103 UART4 DMA接收 终于调试成功,分享一下

//网上找了老半天也找不到UART4-DMA的程序,自己调试成功了,特地分享一下 uint8_t UART4_Rx_buffer[512],UART4_Rx_num;void UART4_Config...
  • a15951837025
  • a15951837025
  • 2015-11-25 10:39:05
  • 7948

STM32F407的串口采用DMA收发数据

环境: 主机:WIN8 开发环境:MDK5.13 mcu: stm32f407VGT6 说明: 之前用STM32F103实现DMA收发串口数据,现在项目中采用...
  • chinazhangzhong123
  • chinazhangzhong123
  • 2017-01-12 09:13:40
  • 2107

STM32 USART串口DMA接收和发送模式

STM32 USART串口DMA接收和发送模式 温馨提示:需要下载资料的请到原文下载 串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1.  ...
  • sandform
  • sandform
  • 2016-05-18 16:33:00
  • 5410

STM32CubeMX:UART(DMA空闲方式)

UART传输有三种方式,而DMA的应用采用阻塞式接收指定的数据长度,效率较低,而应用DMA空闲方式可提高其效率。 参考帖子:http://blog.csdn.net/youmeichifan/art...
  • anchises
  • anchises
  • 2017-04-17 10:44:22
  • 2038

STM32的串口采用DMA方式接收数据测试

STM32的串口采用DMA方式接收数据测试 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 参考链接:http:...
  • jdh99
  • jdh99
  • 2012-12-27 17:00:26
  • 61924

STM32CubeMX 5 解锁UART的DMA发送

一般只使用DMA帮助UART 的发送,这样可以更加节省串口占用的计算资源。因为之前那篇文章的uart发送实际上是中断发送(每个字符一次中断)的,而DMA则只会每个字符串一个中断。开始设置: 在串口...
  • u013429988
  • u013429988
  • 2017-03-27 11:22:07
  • 1869

STM32F4 UART1 DMA发送和接收不定长度数据

STM32F4 串口收发使用DMA还是很方便的。但是配置DMA时需要配置数据长度,这一点对于发送来说可以预估计自己发送的长度来配置DMA发送数据长度,但是对于接收不是很好解决,因为如果使用DMA接收中...
  • louyangyang91
  • louyangyang91
  • 2016-05-26 09:08:13
  • 10269

STM32 串口+DMA的使用

STM32串口+DMA STM32有5个串口资源(USART1,USART2,USART3及UART4,UART5)。 其中3个USART(通用同步/异步收/发器universalsynchron...
  • new2linux
  • new2linux
  • 2014-09-17 19:50:18
  • 7606

stm32F4 串口DMA+环形缓冲区的实现

下面是串口DMA+环形缓冲区的实现,数据收发是异步的,不需要死等。 关于环形缓冲区参考: http://blog.csdn.net/jieffantfyan/article/details/535...
  • jieffantfyan
  • jieffantfyan
  • 2016-09-26 22:43:56
  • 5677
收藏助手
不良信息举报
您举报文章:STM32的UART DMA传输总结
举报原因:
原因补充:

(最多只允许输入30个字)