基于DMA控制器的UART串行通信设计

发布者:Mingyue1314最新更新时间:2012-05-04 来源: 现代电子技术 关键字:DMA  UART  链表项 手机看文章 扫描二维码
随时随地手机看文章

    常规下,UART的数据收发可由MCU控制UART的内部FIFO来完成。但具体不论是以中断还是以查询的形式,过程中总是会占用到MCU的时间,即便在其FIFO的最大有效利用时。这样,在实际应用中,当串口数据包量较大时,UART的发送过程会占用MCU很长时间,其中大多数时间可能是在一次等待数据传输的完成。为了节省这段时间,提高MCU的使用效率,以完成更多的数据处理,将会用到DMA控制器。DMA意思是直接内存访问,是指不经由CPU而直接从内存中存取数据的数据交换模式。当UART的使用DMA控制器控制发送过程时,MCU会将发送的控制权交给DMA硬件控制器,从而在数据发送的时间中去处理其它的事务。
    本文将结合ARM的Cortex-M3内核处理器来设计UART的DMA控制过程。Cortex-M3内核的处理器,是ARM公司最新一代的ARMv7架构的32位处理器。其LPC176X系列的MCU处理器内部带有8通道的DMA控制器。下面将使用这些DMA控制器通道来实现UART的数据收发过程。

1 系统结构及原理
1. 1 UART控制器
    LPC176X有4路UART控制器,通过设置其波特率、停止位、数据长度等参数来完成2个UART串行口的通信,当然外部通过电平转换可实现为RS232或RS485等接口类型,这里只系统地用内的部UART接口。
    硬件的连线上采用交叉互连,即一个UART接口的TX接到另一个接口的RX。软件上传输的数据报文格式可由不同应用不同设定,这里只笼统的称做数据包。
1.2 DMA控制器
    LPC176X的DMA控制器允许外设到存储器,存储器到外设,外设到外设和存储器到存储器之间的传输。每个DMA流都可以为单个源和目的提供单向串行DMA传输。
1.3 链表项及其标识
    DMA控制器使用链表项(LLI)来支持分散/聚集(Scatter-gather),分散/聚集是指DMA单次传输可以使用不必连续的内存空间,它的效果相当于若干个简单DMA过程的串连。在分散/聚集模式下,源和目标数据区由一连串的链表来定义,每个链表项控制着一个数据块的传输,将这个数据块传输完毕后,选择并装载另一个链表项来继续DMA操作或停止DMA流。第一个链表项需要被编程到DMA控制器的对应通道。链表项所描述的传输数据包通常需要进行一次或多次DMA突发传输到设定的源或目标。如不需要链表项分散/聚集,那么链表地址寄存器须设置为零。一个链表的最后一个链表项也须设置为零。
    一个链表项的内容由4个字组成,依次为源地址、目标地址、下个链表项地址及控制字。为了方便记录DMA链表内容,设计并定义一个链表内容结构体标识,标识名称记作stDMALinkListInfor,定义如下:
    a.JPG

2 缓存区的设计
2.1 串行数据缓存区的设计
    建立UARTn的接口数据缓存区,记作UARTn_BUF(n),用来存储UART串口数据包。为数据缓存区设置空缓存地址的FIFO队列UARTn_BUF_FR EE_TABLE,用来存放未被数据填充占用的空数据缓存分区地址;设置已占用缓存地址的FIFO队列UARTn_BUF_FILL_TABLE,用来存放已经被数据填充占用的数据缓存分区地址。[page]

2.2 链表项缓存区的设计
    建立N个DMAx的链表内容结构体的缓存区DMAx_LINK_LIST_INFOR_INDEX(i)(i=1,2,3,...N-1),称作DMAx_LINK_LIST_INFOR_CACHE(i)(i=1,2,...N-1)。其中DMAx_LINK_LIST_INFOR_CACHE(i)的地址为4字节对齐,必须为最低2位是0的位置。
2.3 空链表项地址队列的设计
    建立DMAx的可用空缓存FIFO队列,称作DMAx_LINK_LIST_FREE_TABLE,用于存储N个链表中的空缓存区地址。当执行出队操作时,返回一个非NULL空缓存区地址,若取回值为NULL则说明没有可用缓存区;而执行入队操作时,会将一个非NULL空缓存区的地址加入FIFO队列中,执行读取队列长度操作时,返回队列中可用空缓存地址的数量。
2.4 已占用链表项地址队列的设计
    建立DMAx的链表地址FIFO队列,记作DMAx_LINK_LIST_FILL_TABLE,用来放置占用并填充了链表内容的结构体缓存区地址。当执行出队操作时,返回一个非NULL已占用缓存区地址,若取回值为NULL则说明没有可用的已占用缓存区地址;而执行入队操作时,会将一个非NULL已占用缓存区的地址加入FIFO队列中,执行读取队列长度操作时,返回队列中可用的已占用缓存地址数量。
2.5 发送用缓存地址保存队列的设计
    建立UARTn TX的地址保存FIFO队列UART_LINK_LIST_STORE_TABLE,用于保存一次DMA发送的时所用到的DMAxLINK_LIST_INFOR_CACHE地址。队列容量可与DMAx_LINK_LIST_FILL_TABLE的容量相同,或根据需求设置成更小。

3 串行通信程实现
3.1 关键寄存器设置
    1)使能外设时钟,将PCONP寄存器中的PCGPDAM位置1。此位在复位时为0,即默认DMA被禁止,所以在应用DMA前须先将其使能。
    2)使能UnFCR中的第3位。该位为UART的DMA功能使能位,置1时使能DMA,清0后禁用DMA功能;只有在该位使能后,UART的发送和接收过程才能由DMA控制完成。
    3)将寄存器DMAReqSel的相应位清零。比如第0位,因为DMA的UART0 TX与定时器0匹配0复用,所以需先选择到UART0 TX上。第0位为0时DMA选择UARTX,为1时DMA选择MAT0.0;其它串口也需做类似选择。
3.2 串行数据发送过程实现
    UARTn的DMA数据发送过程如下:
    1)轮询检测是否有数据需要UARTn的发送,如果有则从UARTn_BUF_FREE_TABLE队列中取出一个UARTn_BUF缓存,填充欲发送的数据,然后从DMAx_LINK_LIST_FREE_TABLE队列中取出一个DMAx_LINK_LIST_INFOR_CACHE,将UARTn_BUF的地址赋给DMAx_LINK_LIST_INFOR_CACHE的Link List_SrcAddress,并设置其LinkList_DstAddress为UnTHR的地址LinkList_NextListAddress暂为0、LinkList_Control Value为UARTn_BUF中数据大小、源和目的BURST SIZE为0、源和目的传输宽度的1字节、源地址自增、目标地址不自增和Terminal Count中断使能。最后将该DMAx_ LINK_LISTINFOR_CACHE值入队到DMAx_LINK_LIST_FILL_TABLE队列中。流程如图1所示。

b.JPG[page]

    2)设置定时器UART_DMA_TX_TIMER,定时值为Ts,即每T秒定时器UART_DMA_TX_TIMER发生一次中断。中断服务为检查DMAx_LINK_LIST_FI LL_TABLE的队列长度L,判断是否有可用的链表地址。如果有,则执行出队操作取出一个缓存地址FILL_CACHE_0,将其入队到UART_LINK_LIST _STORE_TABLE中。然后利用其中的源地址、目标地址和ControIValue值,将其分配给DMA通道x的相应寄存器。若L>1,则再取出一个地址,入队到UART_LINK_LIST_STORE_TABLE,将其值赋给DMAx的LLI寄存器。如果仍有可用链表地址,则取出,入队到UART_LINK_LIST_STORE_TABLE,将其值赋给上一个链表地址中的LinkList_NextListAddress,然后依次类似操作,直到最一个取出后,将其LinkList_Next-ListAddress赋为0。若L=1,则将DMAx的LLI寄存器的值置为0。最后设置DMAx的Config寄存器,设置内容有目标外设为UART_TX、传送类型为MEMORY TO PERIP HERAL、不屏避Terminal Count中断、DMAx通道使能,启动DMAx传输。流程如图2所示。

c.JPG

[page]

    3)DMAx传输完成产生Terminal Count中断,在其中断服务程序中取出FIFO队列UART_LINK_LIST_STORE_TABLE中保存的地址ADDR,将ADDR中的源地址入队到UARTn空缓存队列,然后将ADDR值填充到DMAx的可用空缓存FIFO队列DMAx_LINK_LIST_FREE_TABLE中。流程如图3所示。

d.JPG


3.3 串行数据接收过程实现
    UARTn的DMA数据发送过程相对于必送过程较为简单,在配置好相应的寄存器和目标缓存地址后,使能相应DMA通道。当UART接收数据达到触发点后,会触发DMA相应通道的突发请求进行传输。传输结束后,在TerminalCount中断服务中更换目标缓存地址,使能一轮即可。当然在
配置中,DMA通道的突发个数应设置与UART接收FIFO触发点数相同。

4 结束语
    在DMA发送进行的过程中,UART_LINK_LIST_STORE_TABLE保存的地址值序列ADDRs中的地址所指空间不能被释放或被其它程序占用,同样的ADDRs中地址的源地址所指的UART缓存空间也不能被释放或被其它程序占用。如果在这个过程中出现了不满足上述要求的情况,则会出现不可预测的错误。

关键字:DMA  UART  链表项 引用地址:基于DMA控制器的UART串行通信设计

上一篇:基于STM32F107的搬运机器人电机控制系统设计
下一篇:小型污水厂远程监控系统设计

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

S3C DMA使用方法,2410-2440 dma介绍
这里具体DMA CONTROL寄存器(DCON)的配置说明,进而引出DMA的各种工作方式。 Atomic transfer:指的是DMA的单次原子操作,它可以是Unit模式(传输1个data size),也可以是burst模式(传输4个data size),具体对应DCON 。 Data Size:指的是单次原子操作的数据位宽,8、16、32,具体对应DCON 。 Request Source:DMA请求的来源有两种,软件&硬件模块,由DCON 控制;当为前者时,由软件对DMASKTRIG寄存器的位0置位触发一次DMA 操作。当为后者时,具体来源由DCON 控制,不同硬件模块的某时间触发一次DMA操作,具体要见不同的硬件模块。
[单片机]
S3C <font color='red'>DMA</font>使用方法,2410-2440 <font color='red'>dma</font>介绍
ARMLinux s3c2440 之UART分析一
在分析ARM-Linux s3c2440中UART的时有必要先了解 s3c2440A中串口的硬件知识。也就是本文---- 硬件篇: S3c2440A串口提供三个独立的异步串行通信I/O端口(asynchronousserial I/O ports)。每一个串口均可以以普通中断方式或者DMA方式进行数据收发,采用系统时钟时,最大速率为115.2kbps.如果采用外部时钟(UEXTCLK),UART速度可以更快。每个串口包含有2个64-byte的FIFO缓存区用来发送或传输数据。 S3c2440A 串口具有可编程波特率,红外(IR)收发数据,1或者2 位的停止位(stop),5/6/7/8 位数据宽度和奇偶校验功能(parity c
[单片机]
ARMLinux s3c2440 之<font color='red'>UART</font>分析一
基于Lua脚本语言的嵌入式UART通信的实现
   引言   随着变电站智能化程度的逐步提高,对温度、湿度等现场状态参量的采集需求也越来越多。就目前而言,在现场应用中,此类设备多采用RS232或RS485等UART串行通信方式和IED(Intelligent Electronic Device,智能电子设备)装置进行交互。一般来说,不同的设备采用的通信数据帧格式并不相同。各式各样的串口数据帧格式,对IED装置的软件定型造成一定的困难。传统的做法一般是由装置生产厂家指定和其配套的外围设备,装置的灵活性不够理想。本文针对此类问题,提出了一种基于Lua脚本语言的解决方案,可有效地提高IED装置对各种类型串口数据报文帧格式的适应性。该方案将具体串口报文规约的组建和解析交给Lua脚
[单片机]
基于Lua脚本语言的嵌入式<font color='red'>UART</font>通信的实现
STM8 多处理器通信
STM8 多处理器通信 通过UART可以实现多处理器通信(将几个UART连在一个网络里)。例如某个UART设备可以是主设备,它的TX输出和其他UART从设备的RX输入相连接;UART从设备的各自TX输出作逻辑与运算后和主设备的RX输入相连接。 在多处理器配置中,我们通常希望只有被寻址的接收者才被激活,来接收随后的数据,这样就可以减少由未被寻址的接收器的参与带来的多余的UART服务开销。 未被寻址的设备可启用其静默功能置于静默模式。在STM8静默模式里: 任何接收状态位都不会被设置。 所有接收中断被禁止。 UART_CR1寄存器中的RWU位被置1。RWU可以被硬件自动控制或在某个特定条件下由软件写入。 根据UAR
[单片机]
STM8 多处理器通信
一文了解stm32使用DMA模块的相关操作
DMA(Direct Memory Access)常译为“存储器直接存取”。早在Intel的8086平台上就有了DMA应用了。 一个完整的微控制器通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成。如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的。如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据。这样的数据搬运工作将使CPU的负荷显得相当繁重。 严格的说,搬运数据只是CPU的比较不重要的一种工作。CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CPU还需要负责复杂的中断申
[单片机]
一文了解stm32使用<font color='red'>DMA</font>模块的相关操作
TQ2440裸奔程序:串口UART打印printf测试程序
  //=========================================   // NAME: main.c   // DESC: TQ2440 串口UART打印printf测试程序   //=========================================      #include def.h   #include option.h   #include 2440addr.h   #include   #include   static volatile int uart_port = 0;   void uart_init(int pclk,int b
[单片机]
stm32 hal库ADC - DMA方式中断问题
希望用DMA去读取电压,但是每次转化完成后都会调用回调函数,这样太浪费CPU了,解决办法如下: http://www.stmcu.org.cn/module/forum/thread-615792-1-1.html cube默认是开启了中断,但是只要调用 HAL_NVIC_DisableIRQ(DMA2_Stream0_IRQn); 把中断关闭即可
[单片机]
基于单片机通用引脚的软件UART设计
引言 随着单片机应用技术的不断深入,由单片机构成的多机系统取得了长足的发展,多个单片机之间以串口进行数据传输,构成复杂的主从式通讯网。在多机系统中的有一些单片机承担着复杂的通讯任务,当计算机的串口不能满足需要,就必须对串口进行扩展。如多参数医用监护仪、小区防盗报警系统、RS485总线控制系统等。 目前扩展串口的方法主要有以下方法, ①、采用串口扩展芯片实现,如ST16C550、ST16C554、SP2538、MAX3110等,虽然成本较高, 但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统;②、采用分时切换的方法将一个串口扩展与多个串口设备通信,分时复用的方法成本低, 但只适用于数据量不大的
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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