《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 高效FIFO串口雙機通信在ARM7上的實現
高效FIFO串口雙機通信在ARM7上的實現
馬明龍,黃春梅,張 瑞
(長春工業大學 計算機科學與工程學院,吉林 長春 130021)
摘要: 詳細介紹了高效FIFO串口通信的基本原理和實現方法,并在兩臺基于ARM7TDMI微處理器的目標機上,用FIFO串口通信模式實現了兩機之間的高效通信。整個工程分寄存器配置模塊、串口接收模塊、串口發送模塊和容錯模塊。
Abstract:
Key words :

摘  要: 詳細介紹了高效FIFO串口通信的基本原理和實現方法,并在兩臺基于ARM7TDMI微處理器的目標機上,用FIFO串口通信模式實現了兩機之間的高效通信。整個工程分寄存器配置模塊、串口接收模塊、串口發送模塊和容錯模塊。
關鍵詞: 嵌入式系統;串口通信;FIFO;ARM;模塊

  S3C44B0X(時鐘頻率為60 MHz)的UART單元提供2個獨立的異步串行I/O口,每個通信口均可工作于中斷或DMA模式。即UART能產生內部中斷請求或DMA請求,在CPU和串行I/O口之間傳送數據。它支持高達115.2 Kb/s的傳輸速率,每1個UART通道包含了2個16位的分別用于接收和發送信號的先進先出(FIFO)通道。S3C44B0X UART包括可編程波特率、紅外發送/接收、1個開始位、1個或2個停止位、5/6/7/8位數據寬度和奇偶校驗。每個UART包含1個波特率發生器、接收器、發送器和控制單元,其構成如圖1所示[1]。

1  FIFO概述
1.1 FIFO概念
  先入先出FIFO(First In First Out),即先被寫入到FIFO的數據將會先被讀出。它是一片用來緩存數據的存儲單元,可以把需要處理的數據先暫存在這片存儲單元中,在數據量達到一定數量時再集中處理,以提高系統性能。FIFO可以集成在芯片中,而當系統需要的緩沖區較大時,也可以用單獨的RAM實現。S3C44B0X串口收發器包含了16 B的FIFO和數據移位器,將要傳輸的數據寫進FIFO,然后賦值到發送移位器,最后從發送的引腳移位發送出去,達到利用FIFO緩沖區高效通信的目的。
1.2  FIFO意義
    FIFO是數據傳輸系統中極其重要的一環,特別是在2個處于不同時鐘域的系統接口部分,FIFO的合理使用,不但能使接口處數據傳輸的輸入輸出速率進行有效的匹配,不使數據發生復寫、丟失和讀入無效數據的情況,而且還會有效地提高系統中數據的傳輸效率。使用FIFO進行串口通信,較之傳統的串口通信有更高的效率。它將要發送和已經接收的數據集中起來進行操作,避免了頻繁的總線操作,減輕了CPU的負擔。因此,使得基于FIFO方式的串口通信目前應用十分廣泛。
1.3  FIFO中斷請求
S3C44B0X的UART有7個狀態(Tx/Rx/Error)信號:溢出錯誤、奇偶錯誤、幀錯誤、斷點條件、接收FIFO/Buffer數據準備就緒、發送FIFO/Buffer空和發送移位寄存器空,這些狀態信號由相應的UART狀態寄存器(UTRSTATn/UERSTATn)聲明[1]。
當處于接收錯誤狀態時,如果在控制寄存器(UCONn)中接收錯誤狀態中斷使能位被置為1,則溢出錯誤、奇偶校驗錯誤、幀錯誤及斷點錯誤,每1個作為1種錯誤狀態都可發出錯誤中斷請求。當1個接收錯誤狀態中斷請求被發現時,引起中斷請求信號會被讀UERSTATn所識別。如果控制器中的接收模式被選定為中斷模式,則當接收器從接收移位寄存器向接收FIFO傳輸數據時,會激活接收FIFO的可引起接收中斷的“滿”狀態信號。同樣,如果控制器中的發送模式被選定為中斷模式,則當發送器從發送FIFO向發送移位寄存器傳輸數據時,可引起發送中斷的發送FIFO“空”狀態信號被激活。如表1所示。


2  FIFO串口通信的實現
FIFO重啟時,輸入和輸出的指針都指向FIFO中的第1個存儲位置。對FIFO的每次寫入操作會使輸入指針指向FIFO的下1個存儲位置,相應地每次讀取操作會使FIFO的輸出指針指向FIFO的上1個存儲位置。若指針需要從最后1個存儲位置移動到第1個存儲位置,則FIFO會自動實現這一過程而不需要任何對指針的重啟操作。FIFO內部除了包含輸入和輸出端口之外,通常還有其他狀態標志輸出,如空狀態和滿狀態。當FIFO已空或者已滿時,空狀態和滿狀態標志位就會有相應的輸出,即當FIFO已空時不能進行讀取操作,當FIFO已滿時不能進行寫入操作[2]。
2.1  配置特殊寄存器
 為了使目標系統能正常工作,必須配置相關的寄存器,如I/O口寄存器、串口控制寄存器和串口源/目的寄存器等。S3C44B0X有2個串口,這里以串口0為例,進行相關寄存器的配置。
/*I/O口配置,定義各相關引腳功能和上拉電阻狀態 */
rPCONC |=0xf0000000;
rPUPC |=0xc000;
rPCONE=(rPCONE &0x3ffeb)|0x28;
rPUPE |=0x6;
rPCONF=(rPCONF &0x3ff)+0x124800;
rPUPF |=0x1e0;
/* 定義串口0工作寄存器組 */
rULCON0=0x3; //正常模式,無奇偶校驗,1位停止位,8位數據位
 rUCON0=0x245;    //Rx為邊沿觸發,Tx為電平觸發,禁
//止超時中斷,產生接收錯誤中斷,普通傳送、
//發送與接收為中斷或輪詢模式
rUFCON0=(2<<6)|(1<<4)|(6)|1; //FIFO啟動需先復位
     rUBRDIV0=(mclk/(baud*16));  //mclk為60000000,baud為115200
2.2  FIFO串口發送模塊
  串口數據發送幀格式是可編程的,它包含1個開始位,5~8個數據位,1個可選的奇偶位和1~2個停止位,這些都可以通過線控制寄存器(UCONn)來設置。發送器也能夠產生發送中止條件。中止條件迫使串口輸出保持在邏輯0狀態,這種狀態保持超過1個傳輸幀的時間長度。通常在1幀傳輸數據完整地傳輸完之后,再通過這個全0狀態將中止信號發送給對方。中止信號發送之后,傳送數據將持續地放入到輸出FIFO中。要發送的數據被存放在定義的字符串指針uart0TxStr 中,串口發送模塊通過讀該字符串中的字符進行數據發送,核心源代碼如下:
void __irq Uart0_TxFifoInt(void)
{
/* 判斷FIFO發送緩沖區是否為滿或字符串結束 */
while( !(rUFSTAT0 & 0x200) && (*uart0TxStr !='\0'))
{
rUTXH0=*uart0TxStr++;
for(i=0;i<700;i++);  //延遲,防止FIFO誤寫
}
rI_ISPC=BIT_UTXD0;
if(*uart0TxStr == '\0')
{    
              rINTMSK |= BIT_UTXD0; 
              rI_ISPC=BIT_UTXD0; 
      }
}
2.3  FIFO串口接收模塊
  接收的數據幀格式與發送一樣都是可編程的。它包括了1個起始位,5~8個數據位,1個可選的奇偶校驗位和1~2個停止位,這些都可以通過線控制寄存器(UCONn)來設置。接收器還可以檢測到溢出錯誤、奇偶校驗錯誤、幀錯誤和中止狀況,每種情況下都會將1個錯誤標志置位。
 (1)溢出錯誤表示新的數據已經覆蓋了舊的數據,因為舊的數據沒有及時被讀入。
(2)奇偶校驗錯誤表示接收器檢測到了意料之外的奇偶校驗結果。
(3)幀錯誤表示接收到的數據沒有有效的停止位。
 (4)中止狀況表示RxDn的輸入被保持為0狀態超過了1個幀傳輸的時間[3]。
 (5)在FIFO模式下接收FIFO不為空,但接收器已經在3個字時間內沒有接收到任何數據,就認為發生了接收超時狀況。
接收模塊將數據從接收移位寄存器中讀出后,首先被存儲到接收緩存數組keyBuf[ ]中。變量keyBufWrPt和keyBufRdPt指向緩存數組中當前寫數據和讀數據,當接收模塊往緩存數組中寫入1個字節后,keyBufWrPt加1;當Uart_IntGetKey從緩存數組中讀出1個字節后,keyBufRdPt加1。兩變量最大值為KEY_LEN,超過最大值時置零。接收模塊的核心代碼如下[4]:
/* 接收模塊將移位寄存器中的數據讀出到接收緩存數組中 */
void __irq Uart0_RxFifoInt(void)
{
     rI_ISPC=BIT_URXD0;
if(rUFSTAT0==0)
Uart_Printf("time out\n");
     while( (rUFSTAT0&0xf) >0 )     //循環直到FIFO
//發送緩沖區為空
        {
      keyBuf[keyBufWrPt++]=rURXH0;   //讀取接收緩沖區數據存入緩存數組
  if(keyBufWrPt==KEY_BUFLEN)
      keyBufWrPt=0;
}
}
/* 定義1個函數從接收緩存數組中讀取數據 */
char Uart_IntGetkey(void)
{
 if(keyBufRdPt==KEY_BUFLEN)
 keyBufRdPt=0;
        while(keyBufWrPt==keyBufRdPt);//等待直到FIFO被觸發
     return keyBuf[keyBufRdPt++];
}
2.4 FIFO容錯模塊
 除了接收FIFO寄存器之外,UART還具有1個狀態FIFO。狀態FIFO表示了在FIFO寄存器中,哪一個數據被毫無錯誤地接收。假設UART的FIFO連續接收到A、B、C、D、E字符,并且在接收B字符時發生了幀錯誤(即該字符沒有停止位),在接收D字符時發生了奇偶校驗錯。雖然UART錯誤發生了,但不會產生錯誤中斷,因為含有錯誤的字符還沒有被CPU讀取。當字符被讀出時錯誤中斷才會發生,而且只有在讀出URXHn和UERSTATn寄存器后,FIFO錯誤狀態寄存器才會被清除[5]。容錯模塊核心代碼如下[6]。
void __irq Uart0_RxFifoErrorInt(void)
{
 rI_ISPC=BIT_UERR01;
     Uart_Printf("UERSTAT0=0x%x\n",rUERSTAT0& 0xf);
     while( (rUFSTAT0&0xf) >0 )
{
    keyBuf[keyBufWrPt++]=rURXH0;
          if(keyBufWrPt==KEY_BUFLEN);
       keyBufWrPt=0;
         }
}
3  實驗結果
 本實驗在S3C44B0X和ADS1.2平臺上實現,取得了預期的效果。在同等條件下(忽略溫度、電壓等外部因素變化),在帶FIFO(FIFO)和不帶FIFO(Non-FIFO)時發送和接收所花時間如表2所示。

   以傳輸4 KB數據為例,由表2可知,使用FIFO時,發送和接收分別節省0.547 076 s和0.042 832 s時間。假定傳輸1 bit的數據用時為θs,傳輸數據量為n,則可知使用FIFO和不使用FIFO兩種情況下的用時差為15nθ/16s。由此可見,當傳輸數據量n越大時,采用FIFO的串口傳輸模式的用時越少、優越性越明顯。這也顯示了FIFO在串口傳輸較大數據量的工程應用中的重要性和必要性。
在串口通信應用越來越廣的背景下,提高串口通信速度顯得格外重要。本文以S3C44B0X微處理器為平臺,介紹的基于FIFO的串口雙機通信的原理和實現方法,該方法同時也適用于其他配置FIFO緩沖區的微處理器,具有很強的適用性和通用性,在學習、研究的同時,也為工程應用中的串口通信提供了參考模型。
參考文獻
[1] 田澤.嵌入式系統開發與應用[M].北京:北京航空航天大學出版社,2005.
[2] Samsung. S3C44B0X datasheet[EB/OL]. http://pdf1.alldatasheet.com/datasheet-pdf/view/84253/SAMSUNG/S3C44-B0X.html,2003.
[3] 馬忠梅,英惠.ARM嵌入式處理器結構與應用基礎(第2版)[M].北京:北京航空航天大學出版社,2007.
[4] 嚴蔚敏,吳偉民.數據結構:C語言版[M].北京:清華大學出版社,1996.
[5] 胥靜.嵌入式系統設計與開發實例詳解:基于ARM的應用[M].北京:北京航空航天大學出版社,2005.
[6] 王宇行.ARM程序分析與設計[M].北京:北京航空航天大學出版社,2008.
 

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          夜夜嗨av一区二区三区四区| 亚洲免费在线| 亚洲欧美成aⅴ人在线观看| 亚洲精品国产精品国自产观看| 国产伪娘ts一区| 国产一区二区三区久久久| 国产精品极品美女粉嫩高清在线| 国产欧美一区二区三区国产幕精品| 欧美激情精品久久久久久大尺度| 亚洲国产精品va在看黑人| 一本色道久久综合精品竹菊| 久久久99精品免费观看不卡| 国产精品一卡二卡| 国产精品久久久久9999高清| 亚洲欧美一区二区精品久久久| 美女久久网站| 国产视频久久久久| 久热精品视频| 99精品热6080yy久久| 国产精品夜色7777狼人| 在线日韩av永久免费观看| 欧美日韩国产页| 国产亚洲欧美日韩在线一区| 亚洲午夜视频在线| 国产手机视频一区二区| 午夜一区二区三视频在线观看| 在线电影欧美日韩一区二区私密| 欧美性大战久久久久久久| 国产免费观看久久| 久久精品在这里| 亚洲国产精品久久久久久女王| 亚洲欧洲一区| 亚洲一区二区三区精品在线观看| 亚洲欧美偷拍卡通变态| 国产欧美另类| 91久久精品日日躁夜夜躁欧美| 91久久久在线| 99国产成+人+综合+亚洲欧美| 亚洲国产美国国产综合一区二区| 亚洲国产精品久久久久婷婷老年| 久久影院午夜论| 亚洲精品国精品久久99热一| 黄色精品一区二区| 国产精品99久久不卡二区| 永久免费毛片在线播放不卡| 国产精品网站在线观看| 欧美日韩国产bt| 欧美日韩国产综合视频在线| 极品少妇一区二区| 一区二区亚洲欧洲国产日韩| 国产一区二区久久精品| 亚洲综合色自拍一区| 午夜在线视频观看日韩17c| 亚洲国产精品第一区二区三区| 免费成人美女女| 欧美激情 亚洲a∨综合| 国产精品高潮在线| 国产精品一香蕉国产线看观看| 1000部国产精品成人观看| 久久av资源网| 亚洲欧美中日韩| 欧美成人国产一区二区| 国产精品美女久久久久aⅴ国产馆| 久久精品一区蜜桃臀影院| 久久一区二区三区四区| 欧美午夜在线| 亚洲人人精品| 亚洲免费不卡| 国产欧美一区二区三区视频| 这里只有精品视频在线| 欧美日韩免费一区| 欧美日韩xxxxx| 国产精一区二区三区| 美女黄毛**国产精品啪啪| 亚洲手机在线| 一区二区三区不卡视频在线观看| 国内精品一区二区三区| 亚洲小说欧美另类婷婷| 欧美日韩亚洲精品内裤| 欧美日韩另类视频| 亚洲丰满在线| 亚洲精品在线免费| 欧美午夜免费电影| 欧美体内she精视频| 欧美日韩午夜视频在线观看| 久久成人精品一区二区三区| 欧美日韩综合在线免费观看| 亚洲区国产区| 国产亚洲视频在线观看| 香蕉乱码成人久久天堂爱免费| 欧美性开放视频| 亚洲图片欧洲图片av| 亚洲毛片在线看| 久久久久国内| 夜夜爽av福利精品导航| 欧美日韩日本国产亚洲在线| 国产农村妇女精品一二区| 亚洲欧洲一区二区三区| 久久国产加勒比精品无码| 欧美与欧洲交xxxx免费观看| 欧美视频一区在线观看| 国产精品高潮呻吟久久| 久久国产手机看片| 99视频+国产日韩欧美| 99re6热只有精品免费观看| 免费不卡在线视频| 欧美日韩美女一区二区| 娇妻被交换粗又大又硬视频欧美| 欧美日一区二区三区在线观看国产免| 亚洲日本中文字幕区| 亚洲免费观看在线视频| 欧美国产亚洲精品久久久8v| 一区二区高清在线| 欧美在线免费观看视频| 欧美日韩亚洲成人| 亚洲小说欧美另类社区| 99热免费精品在线观看| 欧美日韩精品免费观看视频完整| 欧美日韩亚洲91| 欧美在线一二三区| 国产精品久久久久免费a∨大胸| 久久gogo国模啪啪人体图| 久久高清福利视频| 欧美视频在线观看视频极品| 国产精品区一区二区三区| 欧美性色aⅴ视频一区日韩精品| 欧美v国产在线一区二区三区| 亚洲一二三级电影| 国产欧美一区在线| 欧美一区二区成人| 亚洲免费在线精品一区| 欧美日韩一区在线观看| 1000部精品久久久久久久久| 欧美顶级少妇做爰| 欧美国产激情| 亚洲资源在线观看| 国产性天天综合网| 亚洲欧洲精品一区二区| 欧美理论电影网| 亚洲缚视频在线观看| 国产精品看片你懂得| 日韩性生活视频| 欧美日韩一卡| 欧美第十八页| 伊大人香蕉综合8在线视| 亚洲日本va午夜在线电影| 美日韩精品视频免费看| 老妇喷水一区二区三区| 国产日韩欧美在线看| 国产精品乱码人人做人人爱| 午夜精品福利视频| 在线激情影院一区| 久久久www免费人成黑人精品| 国产一区美女| 黄色精品一区二区| 欧美高清视频一二三区| 免费不卡亚洲欧美| 国产视频观看一区| 久久九九免费视频| 亚洲精品美女在线观看播放| 日韩视频在线播放| 亚洲影视九九影院在线观看| 亚洲精品欧美精品| 久久躁日日躁aaaaxxxx| 欧美在线你懂的| 国产精品美女一区二区| 欧美高清你懂得| 欧美精品1区2区| 久久久亚洲成人| 亚洲精品一二区| 欧美另类videos死尸| 亚洲国产成人av| 亚洲欧美日韩久久精品| 99视频在线观看一区三区| 国产精品久久久久久久久久久久久久| 欧美国产精品劲爆| 国产欧美日韩精品专区| 午夜亚洲福利| 欧美成人精品在线视频| 亚洲欧美另类在线| 久久综合色婷婷| 欧美成人a视频| 欧美成人免费一级人片100| 国产伦精品一区二区三区视频黑人| 免费在线观看精品| 欧美在线影院在线视频| 国产精品美女一区二区| 99热免费精品在线观看| 国产日韩成人精品| 久久精品国产一区二区电影| 欧美激情精品久久久久久蜜臀| 欧美日韩1区2区3区| 欧美日韩国产成人在线| 亚洲人体影院| 在线免费一区三区| 伊人狠狠色丁香综合尤物| 欧美伊人久久久久久久久影院| 国产精品一香蕉国产线看观看| 国产欧美一区二区三区国产幕精品| 国产亚洲美州欧州综合国| 久久久久九九九| 日韩一级黄色大片| 精久久久久久| 欧美日韩在线视频首页| 国产精品美女主播| 久久午夜国产精品| 激情丁香综合| 亚洲国产高清aⅴ视频| 欧美在线视频不卡| 午夜精品亚洲| 亚洲天堂免费在线观看视频| 在线视频一区观看| aa级大片欧美三级| 一本色道久久综合亚洲精品按摩| 亚洲国产日韩欧美在线99| 一区二区免费看| 欧美成人嫩草网站| 日韩视频免费观看| 国产字幕视频一区二区| 欧美视频一二三区| 老司机午夜免费精品视频| 欧美成人福利视频| 国产欧美在线看| 国产精品视频久久久| 久久精品国产免费看久久精品| 国产精品久久久久久妇女6080| 亚洲第一毛片| 亚洲综合精品一区二区| 一区二区欧美国产| 国产精品成人免费精品自在线观看| 久久久久久久波多野高潮日日| 亚洲无吗在线| 欧美午夜www高清视频| 国产精品一区二区久久久久| 久久久久久网址| 黑丝一区二区| 欧美成人dvd在线视频| 欧美午夜片欧美片在线观看| 亚洲国产第一页| 国产片一区二区| 日韩亚洲欧美高清| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲电影欧美电影有声小说| 亚洲影院色无极综合| 久久―日本道色综合久久| 国产一区二区高清| 亚洲美女黄色片| 久久久久久91香蕉国产| 尤物网精品视频| 国产自产女人91一区在线观看| 国产在线视频欧美一区二区三区| 亚洲欧洲精品一区二区三区| 国产三级精品三级| 国产在线国偷精品产拍免费yy| 亚洲国产成人av在线| 欧美国产一区视频在线观看| 亚洲区国产区| 欧美激情精品久久久久久久变态| 欧美不卡福利| 国产一区二区三区久久久久久久久| 久久精品视频在线| 国产精品视频xxx| 亚洲一区在线直播| 国产农村妇女毛片精品久久莱园子| 久久五月天婷婷| 欧美mv日韩mv亚洲| 91久久精品国产91久久| 激情五月综合色婷婷一区二区| 亚洲一区二区欧美| 欧美日韩一区二区三区免费| 一色屋精品视频在线观看网站| 国产一区二区电影在线观看| 欧美三级乱码| 激情五月综合色婷婷一区二区| 欧美日韩国产另类不卡| 久久精品一区二区国产| 久久一区二区三区四区五区| 国产综合久久久久久| 米奇777在线欧美播放| 国产精品久久激情| 国产精品久久久久久久浪潮网站| 国产视频综合在线| 欧美午夜一区二区福利视频| 美女在线一区二区| 一本色道久久综合亚洲二区三区| 欧美欧美午夜aⅴ在线观看| 亚洲激情图片小说视频| 午夜精品久久久久久久99樱桃| 亚洲在线不卡| 亚洲欧美三级伦理| 亚洲成色www久久网站| 一本一本大道香蕉久在线精品| 性欧美xxxx大乳国产app| 欧美成人免费观看| 亚洲人成毛片在线播放| 伊人久久噜噜噜躁狠狠躁| 国产女优一区| 在线观看国产精品淫| 国产一区二区三区丝袜| 亚洲免费中文字幕| 国产一区二三区| 欧美成人免费一级人片100| 国产无遮挡一区二区三区毛片日本| 国产日韩1区| 国产精品成人在线观看| 欧美激情一区二区三区不卡| 欧美在线资源| 国产精品久久久久国产a级| 欧美日韩天天操| 欧美成人精品高清在线播放| 欧美fxxxxxx另类| 亚洲一二三区在线| 免费在线亚洲| 亚洲精选在线| 欧美丰满少妇xxxbbb| 欧美日韩一区二区精品| 久久久美女艺术照精彩视频福利播放| 国产精品乱码久久久久久| 欧美一区国产在线| 亚洲全黄一级网站| 亚洲电影免费在线| 黄色成人小视频| 亚洲精品一二三| 亚洲精品综合在线| 亚洲黄一区二区三区| 日韩午夜精品视频| 国产精品伦子伦免费视频| 欧美激情1区2区|