zoukankan      html  css  js  c++  java
  • 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);

    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

  • 相关阅读:
    jsp中一个标签两种方式绑定两个click事件导致未执行的问题
    Chrome浏览器自动填充<input>标签的密码
    js中字符串的replace方法区分单双引号
    注册页面-省市联动
    mac OS X下制定ll指令
    ssh通过密钥免密登录linux服务器
    mac OS X下PhpStorm+MAMP PRO+Xdebug+FireFox集成开发和断点调试环境配置
    ubuntn配置桌面快捷方式
    centos安装Redis
    Spring文件下载与上传 FormData
  • 原文地址:https://www.cnblogs.com/season-peng/p/6713509.html
Copyright © 2011-2022 走看看