• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于DMA的高速UART串口通信設計與實現

      2018-09-15 04:31:08牛洪海周緒貴
      自動化儀表 2018年9期
      關鍵詞:服務程序接收數據中斷

      牛洪海,臧 峰,周緒貴

      (南京南瑞繼保電氣有限公司,江蘇 南京 211102)

      0 引言

      通用異步收發(fā)器(universal asynchronous receiver transmitter,UART)是一種通用串行數據收發(fā)器。該收發(fā)器可以用來實現主機與輔助設備之間的通信,因其實現簡單而被廣泛應用于工業(yè)控制和通信領域[1-2]。UART數據傳輸主要通過中斷或直接內存存取(direct memory access,DMA)的方式實現[3-4]?;谥袛喾绞降闹醒胩幚砥?central processing unit,CPU)使用率較高。當有大批量的數據傳輸時,將占用大量時間片,導致其他低優(yōu)先級程序無法得到有效執(zhí)行。DMA可以不經由CPU控制而直接從內存中存取數據[5-8],用于實現外設與存儲器之間,以及存儲器與存儲器之間的高速數據傳輸。該操作是根據地址空間的標志[9],實現單通道源地址和目的地址之間的單向數據傳輸[10],為不同模塊之間的高速數據傳輸提供了一種可靠的方式。但由于DMA數據傳輸操作是定長傳輸,即發(fā)送方將所需發(fā)送的報文按照發(fā)送方和接收方約定好的固定長度進行發(fā)送。采用DMA方式接收數據時,如不足固定長度就需要填充無效數據至固定長度。當使用DMA方式進行數據接收時,先向DMA控制器指定需要接收的字節(jié)個數。DMA控制器接收到指定字節(jié)后,產生DMA傳輸中斷。而在實際應用時,串口接收數據的字節(jié)個數往往是不固定的,因此無法直接使用DMA進行數據接收。如何利用DMA方式接收不定長數據,已成為亟待解決的問題。

      1 方案設計與實現

      1.1 總體設計

      基于上述存在的問題,本文提出了一種通過DMA接收高速通信串口不定長數據的方法。該方法步驟具體如下。①設置串口為DMA接收模式;②設置一個通用輸入/輸出引腳(general purpose input output,GPIO)引腳(本文為PC14引腳)為外部中斷控制(external interrupt controller,EIC),并且該引腳與串口的接收引腳(receive data,RXD)相連,產生外部中斷(interrupt)INT14;③配置外部引腳為下降沿模式,即下降沿產生外部引腳中斷,當產生第一個下降沿時,啟用0號定時器(timer counter 0,TC0);④設置外部中斷產生EVENT事件,并將此事件與定時器TC0相關聯(lián);⑤設置TC0的輸入事件,與外部引腳產生的事件相關聯(lián),并把TC0設置為Retrigger模式;⑥設置定時器超時時間,本文設為20 s,定時器超時后關閉,然后進行報文處理,并重新使能DMA接收,以等待下一幀報文。方案設計原理如圖1所示。

      圖1 方案設計原理圖

      1.2 串口DMA接收設計

      使用DMA進行數據傳輸時,需要對DMA控制器進行配置。首先,選擇串口DMA接收通道。本文所述的接收通道為6。其次,配置DMA對應通道的源地址。本文所述的是串口接收數據的寄存器地址。最后,配置DMA通道的目的地址,即存儲串口數據的緩沖區(qū)數組首地址,并設置目的地址為自增模式。

      1.3 外部中斷設計

      設置一個GPIO引腳(PC14引腳)為外部中斷模式,并把此引腳與串口的接收引腳RXD相連。配置外部引腳為下降沿模式,即下降沿產生外部中斷。當產生第一個下降沿時,使能定時器TC0。當產生外部中斷時,同時配置產生EVENT事件。此事件與定時器TC0的輸入事件相關聯(lián)。

      1.4 定時器設計

      定時器TC0設置為Retrigger模式,即接收到EVENT事件后,把定時器的累計時間清零。因為串口報文是以低電平作為起始位,所以在串口發(fā)送數據時,一定會產生下降沿,使定時器TC0不會因溢出而產生定時中斷。當串口沒有數據報文發(fā)送時,保持高電平,使定時器溢出,產生定時中斷。在定時中斷服務程序中,關閉定時器,重啟DMA接收通道以等待下一幀報文,并進行串口報文處理。

      2 硬件電路設計

      本文采用的硬件是由Microchip公司提供的Atmel系列ATSAME54N20A芯片。該芯片具有豐富的外圍接口,包括32路可配置的DMA通道、16路可配置的外部中斷引腳、8路可配置的UART串口。相關串口硬件電路圖如圖2所示。ATSAME54N20A芯片可配置的UART引腳與RS-485芯片的A/B引腳相連接,RS-485芯片的接收引腳RXD與外部中斷引腳PC14相連。

      圖2 串口硬件電路圖

      3 軟件設計

      為了使軟件能正常運行,需要對芯片的一些模塊進行初始化,主要包括晶振初始化、時鐘初始化等。本文主要設置如下。

      ①串口初始化,包括波特率設置(本文設置為5 Mbit/s)、奇偶校驗位、停止位設置。

      ②DMA通道初始化,包括設置串口接收的DMA通道、DMA的源地址、目的地址。

      ③外部中斷初始化,包括設置PC14引腳為外部中斷模式,并產生事件,置下降沿首次檢測標志start_timer_flag = 0[11]。

      ④定時器初始化,包括設置定時器超時時間,并設置定時器接收事件。

      UART接收數據流程如圖3所示。

      圖3 UART接收數據流程圖

      當完成初始化后,檢測PC14引腳是否有下降沿產生。如果檢測到下降沿并且start_timer_flag=0,那么啟動定時器并置start_timer_flag=1;否則下降沿產生EVENT事件驅動定時器累計時間清零。當沒有下降沿產生時,定時器超時進入超時中斷服務程序。首先,關閉定時器;然后,進行串口報文的處理,重新初始化DMA并置start_timer_flag = 0。

      4 性能分析

      為了更好地理解上述設計方案,本節(jié)結合波形關系圖進行詳細的性能分析。波形關系圖如圖4所示。

      當串口接收數據時,串口數據波形如圖4(a)所示。首先,總線會檢測到一個低電平,代表有數據需要發(fā)送。該低電平就是RXD引腳的起始位。由于PC14外部引腳與RXD相連,所以PC14的波形與RXD引腳的波形一致。外部引腳波形如圖4(b)所示。將PC14設為外部中斷模式,而且是下降沿產生外部中斷,則當RXD的起始位或串口數據位由“1”變“0”時,會產生下降沿,PC14會產生外部中斷。外部中斷波形如圖4(c)所示。該外部中斷會產生一個EVENT事件。由于此事件與TC0的輸入事件相關聯(lián),TC0檢測到此事件后清除定時器的累計時間,然后重新從零開始計時。當串口沒有數據要接收時,總線保持高電平,即串口的RXD引腳一直保持在“1”狀態(tài)。此時,沒有EVENT事件去清除定時器TC0的累計時間,導致定時器溢出產生定時中斷。該過程的定時器波形如圖4(d)所示。本文中設置的定時器超時時間是20 μs。在定時中斷服務程序中,重新使能DMA接收通道,以等待下一幀報文的到來,并進行串口報文的處理。

      圖4 波形關系圖

      5 測試驗證

      為了驗證上述分析的正確性,搭建5 bit/s串口通信測試環(huán)境,如圖5所示。

      圖5 測試環(huán)境示意圖

      ①主備串口RS-485芯片進行物理連接,即把主Atmel芯片的RS-485引腳與備Atmel的RS-485引腳相連。

      ②配置外部中斷引腳,即把RXD引腳與PC14引腳相連。

      ③為了監(jiān)視TC0何時進入中斷服務程序,設置PC13為GPIO。當TC0進入超時中斷服務程序時置高電平,退出中斷服務程序時置低電平。

      ④驗證程序是通過TC0超時中斷處理報文,而非DMA中斷處理報文。配置DMA接收緩沖區(qū)數值為300 B,但是主Atmel只發(fā)送200 B,通過示波器查看PC13是否能輸出脈沖信號。

      ⑤當備Atmel接收到處理數據后,返回200 B至主Atmel。

      測試結果分析如圖6所示。

      圖6 測試結果分析圖

      6 結束語

      本文在分析串口通過DMA進行數據接收的優(yōu)缺點基礎上,提出了一種通過外部中斷與定時器配合的通信方案。該方案既兼顧了DMA傳輸不需要CPU干預的優(yōu)點,又解決了DMA只能接收固定長度數據的缺點;在節(jié)省了CPU處理時間的同時,提高了串口接收數據的效率,有效擴展了DMA在串口通信中接收不定長報文的應用。但此方案需要額外占用一個GPIO引腳和定時器,在芯片資源有限的情況下需要謹慎考慮。

      猜你喜歡
      服務程序接收數據中斷
      基于移動終端的人事信息員工自助服務系統(tǒng)設計
      基于移動終端的人事信息員工自助服務系統(tǒng)設計
      沖激噪聲背景下基于幅度預處理的測向新方法*
      電訊技術(2021年10期)2021-11-02 01:25:36
      基于C#的進程守護程序的設計
      視聽(2020年3期)2020-06-11 14:28:18
      低復雜度多輸入多輸出雷達目標角度估計方法
      跟蹤導練(二)(5)
      千里移防,衛(wèi)勤保障不中斷
      解放軍健康(2017年5期)2017-08-01 06:27:44
      單片機模擬串口數據接收程序的實現及優(yōu)化
      水利工程施工監(jiān)理服務程序及質量控制
      AT89C51與中斷有關的寄存器功能表解
      乐平市| 江门市| 桂东县| 隆德县| 奎屯市| 调兵山市| 霍州市| 昌邑市| 山东省| 富蕴县| 泉州市| 龙山县| 旌德县| 西林县| 崇阳县| 贵定县| 福泉市| 威信县| 宁都县| 大关县| 武乡县| 龙山县| 富裕县| 肥西县| 河池市| 宜黄县| 长寿区| 囊谦县| 鹿泉市| 安陆市| 祁东县| 平乡县| 芜湖县| 灵丘县| 宝应县| 仪征市| 安平县| 封丘县| 丰城市| 洛浦县| 林芝县|