小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

S3C2440之UART

 創(chuàng)科之龍 2012-01-05

UARTUniversal Asynchronous Receiver/Transmitter,通用異步接收/發(fā)送裝置)用于異步通信,可以實現(xiàn)全雙工發(fā)送和接收。s3c2440提供了三個UART端口,它們都可以通過查詢、中斷和DMA方式傳輸數(shù)據(jù)。下面通過超級終端發(fā)送字符到2440,2440返回該字符的例子來簡要介紹一下s3c2440中UART的用法:

用到的寄存器:

                      GPHCON :端口配置引腳寄存器

                      GPHUP:使能上拉禁止寄存器

                      ULCON0:線路控制寄存器

                      UCON0:通道控制寄存器

                      UTRSTAT0:發(fā)送/接收狀態(tài)寄存器

                      UBRDIV0:波特率分頻寄存器

                      UTXTH0:通道0發(fā)送緩沖寄存器

                      URXTH0:通道0接收緩沖寄存器

編程流程如下:

1,UART的初始化:包括串口的選擇,IO口的初始化,UART的UFCONn,

     UMCONn,ULCONn,UCONn及波特率的初始化

其中波特率的具體計算公式為:時鐘源頻率÷(波特率×16)-1。

如圖:


具體相關(guān)寄存器的配置如下:

  1. rGPHCONrGPHCON = rGPHCON & (~(0xffff)) ;  
  2. rGPHCONrGPHCON = rGPHCON | (0xaaa0) ;//除GPH0,GPH1以外的腳都是第二功能,urt0的9個腳  
  3.     rGPHUP  = 0x0;  // 使用內(nèi)部上拉電阻。  
  4.   
  5. rUFCON0=0x00;   //不使用FIFO  
  6.       rUMCON0=0x00;   //不使用自動流控制  
  7.       rULCON0=0x03;   //不采用紅外線傳輸模式,無奇偶校驗位,1個停止位,8個數(shù)據(jù)位  
  8.       rUCON0=0x245;   //發(fā)送中斷為電平方式,接收中斷為邊沿方式,禁止超時中斷,允許產(chǎn)生錯誤狀態(tài)中斷,禁止回送模式,禁止中止  
  9.                       //信號,傳輸模式為中斷請求模式,接收模式也為中斷請求模式。  
  10.       rUBRDIV0=( (int)(PCLK/16./baud+0.5) -1 );//?為什么要加0.5?  

2,要發(fā)送數(shù)據(jù)時,等待直到發(fā)送緩沖區(qū)UTRSTAT0[1]為空.再把數(shù)據(jù)放入發(fā)送緩存器UTXHn中。

要發(fā)送的數(shù)據(jù),首先被寫入FIFO,然后拷貝到發(fā)送移位寄存器,接著它從數(shù)據(jù)輸出端(TxDn)依次被移位輸出

  1. while(!(rUTRSTAT0 & 0x2));  //等待,直到發(fā)送緩沖區(qū)為空  
  2. Delay(100);  
  3. WrUTXH0(ch);    //串口0發(fā)送字符  
3,要接收數(shù)據(jù)時,檢查串口狀態(tài)寄存器0,是否有數(shù)據(jù)到來,然后啟動接收,接收到的數(shù)據(jù)是放到接收緩存器URXHn中。

UART的接收數(shù)據(jù):被接收的數(shù)據(jù)也同樣從數(shù)據(jù)接口RxDn移位輸入到移位寄存器,然后拷貝到FIFO中

  1. while(!(rUTRSTAT0 & 0x1));  //檢查串口狀態(tài)寄存器0,是否有數(shù)據(jù)到來,啟動接收過程  
  2. return RdURXH0();  //URXH0串口接收緩存寄存器0  


uart.c

實現(xiàn)查詢發(fā)式串口的收發(fā)功能,接收來自串口的字符,并將接收到的字符發(fā)送到超級終端:

  1. static int UartNum=0;   //串口選擇的標志位,可以省略,只是方便多個串口選擇  
  2. //===============================================================  
  3. //對Uart進行初始化,以所需要的波特率為輸入?yún)?shù)  
  4. void myUart_Init(int whichuart, int baud)  
  5. {  
  6.    if(whichuart==0)   //判斷是否選擇串口0,假如選擇串口1,則應該初始化串口1的寄存器  
  7.    {  
  8.         UartNum=0;   //串口選擇的標志位  
  9.           
  10.         rGPHCONrGPHCON = rGPHCON & (~(0xffff)) ;  
  11.         rGPHCONrGPHCON = rGPHCON | (0xaaa0) ;//除GPH0,GPH1以外的腳都是第二功能,urt0的9個腳  
  12.         rGPHUP  = 0x0;  // 使用內(nèi)部上拉電阻。  
  13.       
  14.         rUFCON0=0x00;   //不使用FIFO  
  15.         rUMCON0=0x00;   //不使用自動流控制  
  16.         rULCON0=0x03;   //不采用紅外線傳輸模式,無奇偶校驗位,1個停止位,8個數(shù)據(jù)位  
  17.         rUCON0=0x245;   //發(fā)送中斷為電平方式,接收中斷為邊沿方式,禁止超時中斷,允許產(chǎn)生錯誤狀態(tài)中斷,禁止回送模式,禁止中止  
  18.                           //信號,傳輸模式為中斷請求模式,接收模式也為中斷請求模式。  
  19.         rUBRDIV0=( (int)(PCLK/16./baud+0.5) -1 );//?為什么要加0.5?  
  20.         Delay(10);  
  21.     }  
  22.   
  23. }  
  24.   
  25. /*******************************************************************/  
  26. void myUart_SendByte(char ch)  
  27. {  
  28.     if (UartNum ==0)      //判斷是否選擇串口0,在這里也可以不用這句,  
  29.                           //只是方便多個串口選擇時用  
  30.     {  
  31.         if(ch=='\n')    //判斷是否是換行字符,如果是換行字符,發(fā)送一個回車符  
  32.         {  
  33.             while(!(rUTRSTAT0 & 0x2));   //等待,直到發(fā)送緩沖區(qū)為空  
  34.             //Delay(10);     //超級中斷的響應速度較慢   
  35.             WrUTXH0('\r');   //發(fā)送回車符  
  36.         }  
  37.         while(!(rUTRSTAT0 & 0x2));  //等待,直到發(fā)送緩沖區(qū)為空  
  38.         Delay(100);  
  39.         WrUTXH0(ch);    //串口0發(fā)送字符  
  40.     }  
  41.       
  42. }  
  43.   
  44. /********************************************************************/  
  45. void Uart_Send (char *str)  
  46. {  
  47.     myUart_Init(0,115200);  
  48.     while (*str)  
  49.     myUart_SendByte(*str++);  
  50. }     
  51. /********************************************************************/  
  52. char myUart_ReceiveByte(void)    //接收字符函數(shù)  
  53. {  
  54.     if(UartNum==0)   //選擇串口0  
  55.     {         
  56.         while(!(rUTRSTAT0 & 0x1));  //檢查串口狀態(tài)寄存器0,是否有數(shù)據(jù)到來,啟動接收過程  
  57.         return RdURXH0();  //URXH0串口接收緩存寄存器0  
  58.     }  
  59.     return 0;  
  60. }  
  61.   
  62. /********************************************************************/  
  63. void Uart_receive(char *string)     //接收函數(shù)  
  64. {  
  65.      char *stringstring2 = string;     
  66.      char c;  
  67.      myUart_Init(0,115200);  //串口的選擇與波特率的選擇  
  68.      while((c = myUart_ReceiveByte())!='\n')    //循環(huán)判斷接收字符函數(shù)返回的字符是不是換行字符\r是換行符?\n?  
  69.      {  
  70.         if(c=='\b')//\b回退符  
  71.         {  
  72.             if( (int)string2 < (int)string )  
  73.             {  
  74.                 Uart_Printf("\b \b");       
  75.                 string--;  
  76.             }  
  77.         }  
  78.         else   
  79.         {  
  80.             *string++ = c;  
  81.             myUart_SendByte(c);  
  82.         }  
  83.      }  
  84.      *string='\0';      //接收完畢后執(zhí)行空格  
  85.      myUart_SendByte('\n');  //如果接收完畢后,補充一個回車  
  86. }  
測試用主函數(shù):

  1. int Main(void)      
  2. {  
  3.     char *str;           
  4.     char *string;  
  5.     ChangeClockDivider(3,1);        //1:3:6  
  6.     ChangeMPllValue(127,2,1);       //405MHZ  
  7.     Port_Init();  
  8.     Isr_Init();  
  9.           
  10.     Uart_Send("Please Input a string:\n");   //超級終端提示輸入一串字符  
  11.     Uart_receive(string);         //2440接收字符  
  12.     *str=*string;     //發(fā)送的跟接收的字符相等  
  13.     Delay(500);           
  14.     Uart_Send(str);      //2440發(fā)送字符顯示到超級終端上  
  15.     while(1);     
  16. }  

效果圖:



完整工程文件可在這里下載。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多