本发明属于自动化通信技术领域,提供了一种通过dma接收串口不定长报文的方法。
背景技术:
当串口在高速率通信模式时采用中断方式进行报文接收,会导致cpu频繁进入串口接收中断服务程序,这样不仅占用大量cpu处理时间,而且非常容易造成报文的丢失。而dma(directmemoryaccess)是一种高速数据交换模式,允许在外部设备和存储器之间进行直接的读写操作而不需要cpu的干预。在dma的操作模式下,cpu通过指令直接控制dma控制器,让dma控制器来控制报文的传输,报文传输完成后进入dma传输结束中断服务程序,这样很大程度上减轻了cpu的负荷。因此使用dma进行报文接收与中断方式相比,具有以下优点:第一:采用串口中断方式进行报文接收时,每接收1个字节数据就会产生一次串口接收中断服务程序,而dma方式下,要求传输的数据块全部传送结束后才会产生一次中断,从而减少了cpu进行中断处理的次数;第二:采用串口中断方式进行报文接收时,串口的接收中断服务程序是由cpu控制完成的,占用了cpu的处理时间,而dma传输是由dma控制器控制完成。但是,采用dma方式进行报文接收时,dma报文传输操作是定长传输,即发送方将发送的报文按照发送方和接收方约定好的固定长度进行发送,不足固定长度就需要填充无效数据至固定长度。使用dma方式进行报文接收时,需要先向dma控制器指定需要接收字节个数,当dma控制器接收到指定字节后产生dma传输中断。而在实际应用时,串口接收报文的字节个数往往是不固定的,因此无法直接使用dma进行报文接收,如何利用dma方式接收不定长报文成为亟待解决的问题。
技术实现要素:
本发明的目的在于提供一种通过dma接收串口不定长报文的方法,以解决dma只能接收定长报文的局限,实现高速串口通信接收不定长报文
。为实现上述目的,本发明采用如下技术方案:一种通过dma接收串口不定长报文的方法,所述方法包括如下步骤:
1)设置串口为dma接收模式,并设置dma初始值;
2)设置一个gpio引脚为外部中断模式,并且把此引脚与串口的接收引脚rxd相连接;
3)配置所述gpio引脚为下降沿模式,即下降沿产生所述gpio引脚外部中断,当产生第一个下降沿时使能定时器tc0;
4)设置外部中断产生event事件,此事件与定时器tc0相关联;
5)设置定时器tc0的输入事件与所述gpio引脚外部中断产生的事件相关联,并把tc0设置为retrigger模式,即接收到外部event事件后,把定时器的累计时间清零;
6)设置定时器tc0超时时间,当串口没有数据报文时,rxd引脚不会产生下降沿触发定时器tc0清零累计时间,定时器tc0超时产生中断;在超时中断服务程序中进行串口报文处理,并重新使能dma接收通道以等待下一帧报文。
进一步地,步骤1)中所述初始值具体指设置dma接收通道的源地址为串口接收的寄存器地址,目的地址为存储串口数据的缓冲区数组首地址,而且设置目的地址为自增模式。
进一步地,所述存储串口数据的缓冲区的大小与最大报文长度一致。
本发明的有益效果:可以有效解决dma只能接收定长报文的局限,扩展了dma在串口通信中接收不定长报文的应用。
附图说明
图1本发明系统结构示意图;
图2本发明串口rxd引脚、外部中断、event、和定时器之间的时序图。
具体实施方式
为使本发明的上述内容、特征和优点能够更加清晰易懂,下面结合附图对本发明的详细实施步骤做具体的说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用来限定本发明。
本发明提供一种通过dma接收串口不定长报文的方法,包含如下步骤:
(1)首先设置串口接收为dma模式,并设置dma初始值。所述初始值为设置dma接收通道的源地址为串口接收的寄存器地址,目的地址为接收串口数据的缓冲区数组首地址,而且设置目的地址为自增模式,dma的接收长度与数据接收缓冲区大小一致。为了保证最大长度报文的正常接收,此接收缓冲区的大小必须与最大报文长度一致。
(2)之后设置一个与串口rxd引脚相关联的gpio引脚为外部中断模式,本实施例中设置pc14引脚为外部中断模式。
(3)配置所述gpio引脚为下降沿模式,即下降沿产生所述gpio引脚外部中断,当产生第一个下降沿时使能定时器tc0。
(4)设置外部中断产生event事件,此事件与定时器tc0相关联。
(5)设置定时器tc0的event输入事件与所述gpio引脚外部中断产生的event事件相关联,并把tc0设置为retrigger模式,即接收到外部event事件后,把定时器的累计时间清零。由于串口报文起始位是一个bit的低电平,所以在开始传输字节的时候一定会产生一个下降沿。rxd引脚下降沿触发外部中断,外部中断产生event事件,event事件retrigger定时器tc0。当串口有报文进行传输时,定时器tc0就不会溢出产生超时中断。rxd引脚、event事件和tc0定时器的逻辑图如图2所示。
(6)设置定时器tc0超时时间,当串口没有报文传输时,rxd引脚不会产生下降沿去触发定时器tc0清零累计时间,那么tc0就会超时产生中断。在超时中断服务程序中进行串口报文处理,并重新使能dma接收通道以等待下一帧报文。
以上实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。