STM32的UART DMA传输总结

发布者:GoldenHarmony最新更新时间:2018-06-10 来源: eefocus关键字:STM32  UART  DMA传输 手机看文章 扫描二维码
随时随地手机看文章

使用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);1

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


关键字:STM32  UART  DMA传输 引用地址:STM32的UART DMA传输总结

上一篇:stm32串口中断收发数据环形缓冲区的设计
下一篇:STM32F0 串口接收超时

推荐阅读最新更新时间:2024-03-16 16:05

STM32开发笔记16: 使用静态库加快Keil编译速度
单片机型号:STM32L053R8T6 使用Stm32CubeMx生成的源文件数量比较多,编译的时候会占用很长的时间,我们仔细观察这些文件除了main.c外,其它的文件我们基本上是调用其中的函数,并不需要对其进行改动。所以,可以仿照Freescale MQX的设计方法,分层进行编译,下图是在进行项目设计时候的层次结构。 第0层用于存储Stm32CubeMx生成的工成文件,第2层处理除main.c以外的所有文件,第3层加入应用层的逻辑结构。 第0层的处理方法,大家参考Stm32CubeMx的使用方法,就可以了。 第1层的处理方法,也非常简单,可通过以下步骤完成: 1、在工程目录结构
[单片机]
<font color='red'>STM32</font>开发笔记16: 使用静态库加快Keil编译速度
STM32学习笔记6(TIM模块定时器)
TIM模块定时器向上溢出 & 输出比较 首先我们必须肯定ST公司的实力,也承认STM32的确是一款非常不错的Cortex-M3核单片机,但是,他的手册实在是让人觉得无法理解,尤其是其中的TIM模块,没有条理可言,看了两天几乎还是不知所云,让人很是郁闷。同时配套的固件库的说明也很难和手册上的寄存器对应起来,研究起来非常费劲!功能强大倒是真的,但至少也应该配套一个让人看的明白的说明吧~~两天时间研究了STM32定时器的最最基础的部分,把定时器最基础的两个功能实现了,余下的功能有待继续学习。首先有一点需要注意:FWLib固件库目前的最新版应该是V2.0.x,V1.0.x版本固件库中,TIM1模块被独立出来,调用的函数与其他定时器不同;在V
[单片机]
STM32使用虚拟示波器
在调试过程中.,经常会有需要看到数据实时变化的情况,这时候便需要用到虚拟示波器。如:制作平衡车时,需要了解拟合角度跟随加速度计和陀螺仪的动态变化情况;做电机PWM调速时需要了解速度的变化曲线等。 对于虚拟示波器的选择,由于之前参加过飞思卡尔,用过是山外的多功能调试助手中的虚拟示波器,感觉还不错。 现在想用stm32制作一个平衡车,需要用到虚拟示波器,现在把使用方法分享出来,给那些有需要的人。 首先是通信协议:(下面是虚拟示波器部分的通信协议) 虚拟示波器采用串口通信的方式和下位机通信。因此首先要配置好串口(这里就不做介绍了),接下来便需要实现发送函数。 ///发送一个字节的数据 void usart3_send_c
[单片机]
<font color='red'>STM32</font>使用虚拟示波器
STM32串口接收丢失字符
重定向使用MicroLib 串口波特率设置为115200 单个字符发送,大部分操作无反馈,少部分操作有正确反馈; 1.修改串口波特率为9600 有所改善,但并未解决问题 2.修改串口中断优先级为抢占有限级 1 子优先级 3 无改善 3.停止使用串口中断,使用查询标志位方式完成接收 问题解决
[单片机]
stm32 串口通信
这次讲讲利用串口收发中断来进行串口通讯。STM32 上为每个串口分配了一个中断。也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断。程序需在中断处理函数中读取状态寄存器(USART_SR)来判断当前的是什么中断。下面的中断映像图给出了这些中断源是如何汇合成最终的中断信号的。图中也给出了如何控制每一个单独的中断源是否起作用。 另外,Cortex-M3 内核中还有个NVIC,可以控制这里的中断信号是否触发中断处理函数的执行,还有这些外部中断的级别。关于NVIC 可以参考《ARM CortexM3 权威指南》,里面讲解的非常详细。 简单的说,为了开启中断,我们需要如下的代码: NVIC_InitTypeDef NV
[单片机]
<font color='red'>stm32</font> 串口通信
使用proteus仿真STM32单片机的注意事项
第1点: 我们用户编写的代码,必须放在 user code begin 和 end 之间;否则,当我们修改stm32cubemx 项目的 配置时,再次生成代码,就会删除之前的代码;正确做法如下图所示: 我们用户编写的代码,必须放在 user code begin 和 end 之间 第2点: 在proteus中,电源需要更改成3.3V,VDDA添加到电源VCC/GND中去;VSSA添加到GND中去;如下图所示: 电源需要改成3.3V 第3点: HAL_Delay(__IO uint32_t Delay)延时函数在stm32f1xx_hal.c里面,该函数能实现ms级别的延时;该函数体前面有一个关键字__weak,该关键字简
[单片机]
使用proteus仿真<font color='red'>STM32</font>单片机的注意事项
基于STM32的语音导览系统的设计
景点语音导览主要有以下几种方式:一种是通过全球定位系统(GPS)的用户终端接收工作卫星的导航信息,从而解算出车辆的经纬度信息,进而计算出实时坐标,将其与景点坐标相比较,当车辆驶入景点一定距离范围内时,不用人工干预,系统自动播报景点语音信息;另一种是对车轮轴的转角脉冲进行计数,将计数值和预置值对比,即可确定播放时刻,达到准确播放景点语音信息的目的;第三种方案是利用无线射频识别技术,在每一个景点范围内设置一个具有唯一ID 的射频发射器,采用间歇工作方式发射信号,当旅游列车即将到达景点时,车载系统接收到射频发射器信号并解码出景点的ID 号,由系统控制自动播放对应编号的景点语音信息。由于景点自然环境的复杂性,第一种方式难以满足系统要求;
[单片机]
基于<font color='red'>STM32</font>的语音导览系统的设计
基于STM32平台实现SVPWM调制
SVPWM SVPWM是空间矢量脉宽调制(Space Vector Pulse Width Modulation)的简称,通常由三相逆变器的六个功率开关管组成,经过特定的时序和换相所所产生的脉冲宽度调制波,最终输出的波形可能会十分接近理想的正弦波形。具体如下图所示;左侧为复平面,即空间矢量,右侧为时域的正弦波形。 关于SVPWM原理的文章非常多,这里可以推荐一下网上一个非常不错的教程《SVPWM的原理及法则推导和控制算法详解第五修改版》,本文将如何实现SVPWM进行简单的介绍。 IQMATH TI的片子很香,控制方面,TI无疑是做的最好的方案之一,相对来说资料也非常齐全;另外TI针对没有浮点运算器的定点DSP推出了IQMATH
[单片机]
基于<font color='red'>STM32</font>平台实现SVPWM调制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved