万事娱乐注册 万事娱乐登录 万事娱乐招商QQ

Navigation menu

来源:未知 责任编辑:admin

如何使用UART+DMA的方式进行数据的传输?

  是做非常重要的一个模块,它可以作为shell来进行软件调试,也可以简单的打印日志或错误信息,还可以用作数据通讯,比如而言,它可能是除GPIO外最常用的模块,但在使用过程中,有一些细节常常会被忽略而导致产品不稳定甚至死机,今天我们就聊聊UART## UART的连接

  UART(Universal Asynchronous Receiver/Transmitter)是一种异步通讯,其中通讯的双方主要通过TX, RX交叉连接,有些MCU还支持硬件流控,那就又包含RTS和CTS这两个信号。支持硬件流控的MCU在驱动的时候,可以使用RTS作为收发使能的控制信号,这样软件工程师在写驱动的时候,就不需要控制GPIO来切换发送与接收,而且发送过程中,当数据写入D寄存器后,不需要等待移位的完成,就可以直接去处理其他任务

  与I2C/SPI不同,UART在通讯过程中是没有同步时钟的,所以需要用本地时钟采用对方发送的数据,这样就有一个容错的问题,也就是当时钟偏差多大后,通讯将无法建立。Kinetis KV参考手册中描述了计算方法:(RT cycles表示UART模块的系统时钟,每个UART bit都是由16倍的采样完成,并且在RT8,9,10这三个点采样)

  针对时钟正偏的情况(时钟比数据快),在此情况下至少要保证最采样STOP bit 的RT8, RT9, RT10落在STOP电平(而不是倒数第一个字节)才能保证采样数据不出错

  针对时钟负偏的情况(时钟比数据慢),临界区应该是RT8, RT9, RT10采在MSB的末尾,这样就会多占用6个RT cycles,个人觉得这个图有点问题,应该把RT8, 9, 10放在STOP的末尾,RT11~16放到IDLEorNEXT FRAME,不过手册里计算公式是没有问题的:

  所以如果想要稳定的UART通讯,一定要保证UART的时钟源正偏不超过4.12%,负偏不超过3.53%,如果设备要在全温范围内工作,建议还是使用外部晶体作为UART的时钟源或者检查下内部时钟是否能满足这个要求,下图是KL17内部时钟的相关参数,还需要说明一点,整个计算过程是认为对端设备时钟无误差,实际应用中应该保留一定的降额

  MCU往往都会提供UART的相关示例,通常有3中模式,针对这三种不同的模式,用户可以根据自身的需求来进行选择:

  这段函数中,使能了UART TX DMA完成中断以及UART RX DMA中断,下面是中断服务函数:

  这个Demo可以展示如何使用DMA来传输UART,但是实际用户在使用的时候却很难使用,问题主要出在接收端。各种通讯协议很少是有固定字节长度的,比如Modbus,Profibus-DP。针对不定长数据的接收,我们常见有以下几种做法:

  的中断资源,每接收1个字节都会产生一次中断。同时如果系统中需要支持多串口通讯,还可能会出现OR(Receiver Overrun)错误而导致丢帧

  使用DMA接收数据,使能IdleLineInterrupt,并配置空闲字节长度,在Idle中断服务程序中Copy数据到用户空间。以Modbus为例,其要求发送帧间隔是3.5Char,也就是每帧之间的必须等待超过3.5倍的字节时间长度,不同的波特率对应不同的等待时间,我们可以配置空闲长度为4个字节,这样MCU如果接收端连续等待4个字节长度时间都是高电平后产生一个中断(RT1170支持从起始位或者停止位开始计数)

  使能UART中断,这里需要注意UART在通讯过程中往往会遇到干扰而导致一些错误或者异常,MCU在获取异常后会置位一些错误标志,这些标志一定要进行处理,否则有可能出现接收终止而导致通讯失败。不同的芯片针对错误标志的清除方法是不同的(有的需要读D寄存器,有的需要W1C),一定要根据手册来处理:

  在EDMA_CreateHandle函数中关闭DMA中断,因为已经开启串口IDLE中断,就没必要再DMA中断,而且很有可能DMA中断尚未产生,帧数据已经接收完毕了

  当DMA尚未接收到全部数据时,如果帧已经结束,那我们就必须知道当前DMA传输了多少个数据,所以可以编写一个函数来获取这个值

  声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。侵权投诉

  的话,除了安排好的收发缓冲内存外,再就只需调用下面两个HAL库的API函数即可

  预置数十个开箱即用连接器,基于SDK和热插拔的连接器扩展技术,快速启动

  的信息。在STM32中,通常有以下几种模式:轮询模式程序必须轮询状态位以检查是否已收到新字符并以足够快的速度读取它以获得所有字节

  整理总结,分享给大家,若是哪里有错,希望大家能够指教改出。平台说明这里我们演示的芯片型号是GD32F450ZKT6,我们通过

  ,无需Cortex-MO处理器干预。在此操作过程中,主处理器可以执行其它任务,仅

  的读写可以解决上述问题。本方法有个缺陷就是必须使用同一组IO口,如PA或PB,这样直接对寄存器IDR

  的必要条件中断实验练习STM32用HAL库点亮LED灯任务要求实验过程采用串口

  ,加载TCP/IP协议连接到互联网,实现网络通信成了众多设计者的目标。但由于指令

  采集等领域有着广泛的应用,绝大多数嵌入式处理器都内置了通用异步收发器(

  速率高,可更好地支持未来高端显卡等优点,在LTE系统的物理层中,设计基于PCIe总线

  完成后,在中断函数中显示“DMAFinished”,提示DMA成功完成

  的方法HT56R678 内建有SIM 功能,其中包括了SPI 和I2C 两种通信接口,本文以HT56R678 为母体,介绍使用I2C

  的方法 HT56R678 内建有SIM 功能,其中包括了SPI 和I2C 两种通信接口,本文以HT56R678 为母体,介绍使用I2C