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

          新聞中心

          FL2440 UART的用法

          作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
          UART原理說明:

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

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

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

          rUFCON0 = 0;

          rUMCON0 = 0;

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

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

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

          while(1)

          {

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

          ch = rURXH0; /*接收一個(gè)字節(jié)數(shù)據(jù)*/

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

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

          switch(ch) /*根據(jù)所接收數(shù)據(jù)的不同,執(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寄存器,否則就會引起一個(gè)中斷兩次響應(yīng)的問題。因?yàn)槭欠裰袛嘤蒘RCPND寄存器決定,而SRCPND寄存器的相關(guān)狀態(tài)位由SUBSRCPND寄存器決定,如果先清SRCPND寄存器,而還沒有清SUBSRCPND寄存器的話,SRCPND寄存器的相關(guān)位還是會被置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) /*接收數(shù)據(jù)處理部分*/

          {

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

          if(ch==0x55)

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

          else

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

          }

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

          {

          rGPBDAT = ~0x561; /*亮4個(gè)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"里面的關(guān)于rUTXH0/rURXH0的定義。arm指令默認(rèn)小端模式初始化,所以地址是這個(gè)。




          關(guān)鍵詞: FL2440UAR

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁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); })();