在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            FL2440 UART的用法

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

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

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

            rUCON0 = 0x245; /*PCLK為時鐘源,接收和發(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)); /*等待并判斷接收緩存是否準備好*/

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

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

            rUTXH0 = ch; /*發(fā)送一個字節(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寄存器,否則就會引起一個中斷兩次響應(yīng)的問題。因為是否中斷由SRCPND寄存器決定,而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; /*亮兩個LED,蜂鳴器響*/

            else

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

            }

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

            {

            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"里面的關(guān)于rUTXH0/rURXH0的定義。arm指令默認小端模式初始化,所以地址是這個。




            關(guān)鍵詞: FL2440UAR

            評論


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

            關(guān)閉