<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > FL2440 UART的用法

          FL2440 UART的用法

          作者: 時間:2016-11-11 來源:網絡 收藏
          UART原理說明:

          通用異步收發(fā)器簡稱UART,即“Universal Asynchronous Receiver Transmitter”,它用來傳輸串行數據:發(fā)送數據時,CPU將并行數據寫入UART,UART按照一定格式在一根電線上串行發(fā)出;接收數據時,UART檢測另一根電線上的信號,將串行數據放在緩沖區(qū)中,CPU即可讀取UART獲得的數據。UART之間以全雙工方式傳輸數據,最精簡的連線方式只有三根電線:TxD用于發(fā)送數據,RxD用于接收數據,Gnd用于給雙方提供參考電平。連線如下圖所示:

          本文引用地址:http://www.ex-cimer.com/article/201611/316626.htm
          為了增強數據的抗干擾能力、提高數據傳輸長度,通常將TTL/CMOS邏輯電平轉換為RS-232邏輯電平,3~12V表示0,-3~-12V表示1。S3C2440有3個獨立的UART通道,每個通道都可以工作于中斷、查詢或者DMA模式。
          S3C2440UART的使用:
          UART使用之前需要設置波特率、數據傳輸格式,配置相關管腳為UART功能,選擇工作模式是中斷、查詢還是DMA.。另外,S3C2440中每個UART都有一個深度為64字節(jié)的接收FIFO和發(fā)送FIFO。我們采用的配置方式不使用FIFO模式。
          1. 將涉及的UART通道管腳設為UART功能
          比如,UART通道0中,GPH2、GPH3分別用作TXD0、RXD0,即要使用UART通道0時,必須先將GPHCON寄存器中GPH2/3配置為TXD0/RXD0。
          2. UBRDIVn寄存器:設置波特率
          S3C2440的時鐘源有PCLK 、UEXTCLK、FCLK/n,其中n值是通過UCON0~UCON2聯(lián)合設置。
          根據給定的波特率、所選擇的時鐘源頻率,可以通過以下公式計算UBRDIVn寄存器。
          UBRDIVn=(int)(UART CLOCK /(BUAD RATE * 16)) - 1
          時鐘源選擇PCLK為50MHz,波特率設置為115200赫茲,所以計算出的值為26.13,取整之后為26,即把26存到寄存器UBRDIV0即可。
          3. ULCONn:設置傳輸格式
          設置數據寬度、停止位寬度、檢驗模式、紅外模式。
          4. UCONn寄存器
          通過該寄存器來設置S3C2440中UART的接收模式、發(fā)送模式、接收中斷方式、發(fā)送中斷方式、時鐘選擇、FCLK分頻系數(FCLK/n中n的值)等等。
          5.UTRSTATn寄存器
          UTRSTATn寄存器用來表明數據是否發(fā)送完畢,是否已經接受到數據。第0位可以用來判斷接受緩存器內是否有可接收的數據,接收到數據自動設置為1;第1位和第2位可以用來判斷發(fā)送緩存器中是否為空,為空時可以發(fā)送數據。寄存器格式如下:
          接收到的數據是放到接收緩存器URXHn中,要發(fā)送數據時,是把數據放入發(fā)送緩存器UTXHn中。由于UART是通過字節(jié)方式傳輸數據的,因此要區(qū)分是大端模式還是小端模式,也就是說這兩個寄存器在這兩種模式下,所在的地址是不同。
          現在來看一段代碼,這段代碼采用的查詢的方式來使用UART的。每次完成一個字節(jié)的傳輸。

          #include "2440addr.h"

          void Main(void)

          {

          char ch;

          rGPBCON = 0x155551;

          rGPBUP = 0x7ff;

          rGPBDAT = 0x560;

          rGPHCON = 0x00faaa; /*使用UART0功能 0000 0000 1111 1010 1010 1010 管腳使能*/

          rGPHUP = 0x7ff;

          rULCON0 = 0x3; /*設置UART0無奇偶校驗,一位停止位,8位數據 設定數據傳輸格式*/

          rUCON0 = 0x245; /*PCLK為時鐘源,接收和發(fā)送數據為查詢或中斷方式[4]沒有break信號[7]禁止fifo*/

          rUFCON0 = 0;

          rUMCON0 = 0;

          rUBRDIV0 = 26; /*設置波特率,PCLK為50MHz,波特率為115.2kHz*/

          while(!(rUTRSTAT0 & 0x2)); /*等待并判斷發(fā)送緩存是否為空*/

          rUTXH0 = 0xaa; /*是空,則發(fā)送0xAA字節(jié)*/

          while(1)

          {

          while(!(rUTRSTAT0 & 0x1)); /*等待并判斷接收緩存是否準備好*/

          ch = rURXH0; /*接收一個字節(jié)數據*/

          while(!(rUTRSTAT0 & 0x2)); /*等待并判斷發(fā)送緩存是否為空*/

          rUTXH0 = ch; /*發(fā)送一個字節(jié)數據*/

          switch(ch) /*根據所接收數據的不同,執(zhí)行不同的程序*/

          {

          case 0x11: /*滅LED*/

          rGPBDAT |= 0x560;
          break;

          case 0x22: /*亮LED*/

          rGPBDAT &= 0x1f;
          break;

          case 0x33: /*蜂鳴器不響*/

          rGPBDAT &= 0x560;
          break;

          case 0x44: /*蜂鳴器響*/

          rGPBDAT |= 0x1;
          break;
          default: /*LED滅,蜂鳴器不響*/

          rGPBDAT = 0x560;
          break;

          }

          }

          }

          中斷處理方式,UART有子中斷,要注意子中斷屏蔽的打開,由于UART中斷涉及到SUBSRCPND寄存器,因此在中斷處理程序中不僅要清SRCPND寄存器,還要清SUBSRCPND寄存器,它們的順序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否則就會引起一個中斷兩次響應的問題。因為是否中斷由SRCPND寄存器決定,而SRCPND寄存器的相關狀態(tài)位由SUBSRCPND寄存器決定,如果先清SRCPND寄存器,而還沒有清SUBSRCPND寄存器的話,SRCPND寄存器的相關位還是會被置1,而一旦被置1,則一定還會引起中斷。

          #include "2440addr.h"

          #define U32 unsigned int

          void __irq uartISP(void)

          {

          char ch;

          rSUBSRCPND |= 0x3;

          rSRCPND = 0x1<<28;

          rINTPND = 0x1<<28;

          if(rUTRSTAT0 & 1) /*接收數據處理部分*/

          {

          ch = rURXH0; /*接收字節(jié)數據*/

          if(ch==0x55)

          rGPBDAT = ~0x60; /*亮兩個LED,蜂鳴器響*/

          else

          rUTXH0 = ch; /*發(fā)送字節(jié)數據*/

          }

          else /*發(fā)送數據處理部分*/

          {

          rGPBDAT = ~0x561; /*亮4個LED*/

          }

          }

          void Main(void)

          {

          rGPBCON = 0x155555;

          rGPBUP = 0x7ff;

          rGPBDAT = 0x560;

          rGPHCON = 0x00faaa;

          rGPHUP = 0x7ff;

          rULCON0 = 0x3;

          rUCON0 = 0x5;

          rUFCON0 = 0;

          rUMCON0 = 0;

          rUBRDIV0 = 26;

          rSRCPND = 0x1<<28;

          rSUBSRCPND = 0x3;

          rINTPND = 0x1<<28;

          rINTSUBMSK = ~(0x3); /*打開UART0發(fā)送和接收中斷屏蔽*/

          rINTMSK = ~(0x1<<28); /*打開UART0中斷屏蔽*/

          pISR_UART0 = (U32)uartISP;

          while(1)

          {

          }

          }

          在"2440addr.h"里面的關于rUTXH0/rURXH0的定義。arm指令默認小端模式初始化,所以地址是這個。




          關鍵詞: FL2440UAR

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();