您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2025/11/28 11:19:58发布21次查看
摘要:针对大数据量的串口间通信,在常规的uart串行数据通信的基础上,结合cortex-m3微控制器中dma控制器的作用,实现dma控制的uart串口数据包收发。设计链表项缓存,zui终实现dma的分散/聚集模式的数据传输过程,主要是发送过程。提高了串行数据通信过程的mcu独立性和mcu利用的效率。
常规下,uart的数据收发可由mcu控制uart的内部fifo来完成。但具体不论是以中断还是以查询的形式,过程中总是会占用到mcu的时间,即便在其fifo的zui大有效利用时。这样,在实际应用中,当串口数据包量较大时,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.1uart控制器
lpc176x有4路uart控制器,通过设置其波特率、停止位、数据长度等参数来完成2个uart串行口的通信,当然外部通过电平转换可实现为rs232或rs485等接口类型,这里只系统地用内的部uart接口。
硬件的连线上采用交叉互连,即一个uart接口的tx接到另一个接口的rx。软件上传输的数据报文格式可由不同应用不同设定,这里只笼统的称做数据包。
1.2dma控制器
lpc176x的dma控制器允许外设到存储器,存储器到外设,外设到外设和存储器到存储器之间的传输。每个dma流都可以为单个源和目的提供单向串行dma传输。
1.3链表项及其标识
dma控制器使用链表项(lli)来支持分散/聚集(scatter-gather),分散/聚集是指dma单次传输可以使用不必连续的内存空间,它的效果相当于若干个简单dma过程的串连。在分散/聚集模式下,源和目标数据区由一连串的链表来定义,每个链表项控制着一个数据块的传输,将这个数据块传输完毕后,选择并装载另一个链表项来继续dma操作或停止dma流。*个链表项需要被编程到dma控制器的对应通道。链表项所描述的传输数据包通常需要进行一次或多次dma突发传输到设定的源或目标。如不需要链表项分散/聚集,那么链表地址寄存器须设置为零。一个链表的zui后一个链表项也须设置为零。
一个链表项的内容由4个字组成,依次为源地址、目标地址、下个链表项地址及控制字。为了方便记录dma链表内容,设计并定义一个链表内容结构体标识,标识名称记作stdmalinklistinfor,定义如下:
2、缓存区的设计
2.1串行数据缓存区的设计
建立uartn的接口数据缓存区,记作uartn_buf(n),用来存储uart串口数据包。为数据缓存区设置空缓存地址的fifo队列uartn_buf_free_table,用来存放未被数据填充占用的空数据缓存分区地址;设置已占用缓存地址的fifo队列uartn_buf_fill_table,用来存放已经被数据填充占用的数据缓存分区地址。
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字节对齐,必须为zui低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发送用缓存地址保存队列的设计
建立uartntx的地址保存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的uart0tx与定时器0匹配0复用,所以需先选择到uart0tx上。第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的linklist_srcaddress,并设置其linklist_dstaddress为unthr的地址linklist_nextlistaddress暂为0、linklist_controlvalue为uartn_buf中数据大小、源和目的burstsize为0、源和目的传输宽度的1字节、源地址自增、目标地址不自增和terminalcount中断使能。zui后将该dmax_link_listinfor_cache值入队到dmax_link_list_fill_table队列中。流程如图1所示。
2)设置定时器uart_dma_tx_timer,定时值为ts,即每t秒定时器uart_dma_tx_timer发生一次中断。中断服务为检查dmax_link_list_fill_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,然后依次类似操作,直到zui一个取出后,将其linklist_next-listaddress赋为0。若l=1,则将dmax的lli寄存器的值置为0。zui后设置dmax的config寄存器,设置内容有目标外设为uart_tx、传送类型为memorytoperipheral、不屏避terminalcount中断、dmax通道使能,启动dmax传输。流程如图2所示。
3)dmax传输完成产生terminalcount中断,在其中断服务程序中取出fifo队列uart_link_list_store_table中保存的地址addr,将addr中的源地址入队到uartn空缓存队列,然后将addr值填充到dmax的可用空缓存fifo队列dmax_link_list_free_table中。流程如图3所示。
3.3串行数据接收过程实现
uartn的dma数据发送过程相对于必送过程较为简单,在配置好相应的寄存器和目标缓存地址后,使能相应dma通道。当uart接收数据达到触发点后,会触发dma相应通道的突发请求进行传输。传输结束后,在terminalcount中断服务中更换目标缓存地址,使能一轮即可。当然在
配置中,dma通道的突发个数应设置与uart接收fifo触发点数相同。
4、结束语
在dma发送进行的过程中,u
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product