在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Cortex-M3 (NXP LPC1788)之UART用法

            Cortex-M3 (NXP LPC1788)之UART用法

            作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
            在工作中經(jīng)常將平臺的串口和PC機連接,通過串口打印信息進行程序調(diào)試。LPC1788共有5個串口Uart0~Uart4,跟具開發(fā)板的資源,將使用Uart2進行簡單的串口輸出和輸入中斷的操作。開發(fā)板上使用74HC4052多路開關(guān)對UART2的RXD和TXD進行選擇,使用SP3243E進行3.0V到5.5V的RS-232電平轉(zhuǎn)換。查看手冊配置好相關(guān)的跳線帽,保證DB口上的串口輸出采用的是Uart2。

            下面介紹Uart相關(guān)系統(tǒng)配置和Uart模塊的配置。Uart的時鐘采用PCLK,我們配置系統(tǒng)的CCLK為120M,PCLK為60M,后面設(shè)置串口的波特率就采用PLCK進行計算。要使用串口2的功能需要使能系統(tǒng)時鐘控制PCONP,以及配置GPIO管腳為Uart2的RXD和TXD功能。要實現(xiàn)通信,我們需要設(shè)置數(shù)據(jù)的格式,包括傳輸?shù)牟ㄌ芈?,?shù)據(jù)長度,停止位,以及校驗等,這些數(shù)據(jù)在線性控制寄存器UnLCR中控制。波特率的產(chǎn)生需要經(jīng)過分數(shù)波特率分頻器UnFDR和主分頻器DLL,DLM。計數(shù)公式如下圖。

            本文引用地址:http://www.biyoush.com/article/201611/318449.htm

            根據(jù)計算,當(dāng)PLCK=60M,波特率為115200,數(shù)據(jù)位為8,停止位為1,無校驗,則DLL = 22, DLM =0, DivAddVal =1, MulVal = 2 ,線性控制寄存器中的值為0x3。

            要通過串口發(fā)送數(shù)據(jù)時,只需要把要發(fā)送的數(shù)據(jù)寫入發(fā)送保持寄存器UnTHR,系統(tǒng)就會通過移位寄存器將數(shù)據(jù)通過串口發(fā)送。為了了解系統(tǒng)的發(fā)送狀態(tài),還需要線性狀態(tài)寄存器UnLSR,例如程序中使用該該寄存器的第5位判斷發(fā)慫保持寄存器是否為空,防止數(shù)據(jù)溢出。

            如果需要進行串口的中斷操作,還需要對串口中斷進行配置,如串口中斷使能寄存器UnIER和串口中斷標(biāo)識寄存器UnIIR。程序中使用到了串口2的接收中斷,為此在中斷使能設(shè)置寄存器ISER中使能UART2中斷,在串口中斷使能寄存器UnIER中使能串口的接收中斷,該中斷同時使能了字符接收超時中斷。UART2的RXD管腳接收到數(shù)據(jù)將存放在FIFO中,程序中配置接收FIFO的觸發(fā)條件為1個字節(jié),即有接收到數(shù)據(jù)就觸發(fā)。中斷觸發(fā)后,我們可以根據(jù)中斷標(biāo)識寄存器UnIIR判斷到底是串口的接收中斷,超時中斷,發(fā)送中斷等。進入中斷以后,接收中斷和超時中斷,都可以通過讀取接收緩存寄存器UnRBR進行中斷復(fù)位,使下次中斷可以發(fā)生。

            下面的程序例子,程序開始打印菜單,PC串口軟件發(fā)送一個字節(jié)數(shù)據(jù)給開發(fā)板,開發(fā)板接收到數(shù)據(jù)后將讀取UnRBR前后的中斷標(biāo)識寄存器IIR的值,以及接收到的值發(fā)送回給PC。如果是0x5a或者0xa5還可以打開或者關(guān)閉LED指示燈。

            1. #defineCCLK120000000
            2. #definePCLK60000000
            3. #definerFIO1DIR(*(volatileunsigned*)(0x20098020))
            4. #definerFIO1MASK(*(volatileunsigned*)(0x20098030))
            5. #definerFIO1PIN(*(volatileunsigned*)(0x20098034))
            6. #definerFIO1SET(*(volatileunsigned*)(0x20098038))
            7. #definerFIO1CLR(*(volatileunsigned*)(0x2009803c))
            8. #definerISER0(*(volatileunsigned*)(0xE000E100))
            9. #definerCLKSRCSEL(*(volatileunsigned*)(0x400FC10C))//時鐘源選擇寄存器
            10. #definerPLL0CON(*(volatileunsigned*)(0x400FC080))//PLL0控制寄存器
            11. #definerPLL0CFG(*(volatileunsigned*)(0x400FC084))//PLL0配置寄存器
            12. #definerPLL0STAT(*(volatileunsigned*)(0x400FC088))//PLL0狀態(tài)寄存器
            13. #definerPLL0FEED(*(volatileunsigned*)(0x400FC08C))//PLL0饋送寄存器
            14. #definerPLL1CON(*(volatileunsigned*)(0x400FC0A0))
            15. #definerPLL1CFG(*(volatileunsigned*)(0x400FC0A4))
            16. #definerPLL1STAT(*(volatileunsigned*)(0x400FC0A8))
            17. #definerPLL1FEED(*(volatileunsigned*)(0x400FC0AC))
            18. #definerCCLKSEL(*(volatileunsigned*)(0x400FC104))//CPU時鐘選擇寄存器
            19. #definerUSBCLKSEL(*(volatileunsigned*)(0x400FC108))//USB時鐘選擇寄存器
            20. #definerPCLKSEL(*(volatileunsigned*)(0x400FC1A8))//外設(shè)時鐘寄存器
            21. #definerPCON(*(volatileunsigned*)(0x400FC0C0))
            22. #definerPXCONP(*(volatileunsigned*)(0x400FC0C4))
            23. #definerSCS(*(volatileunsigned*)(0x400FC1A0))//系統(tǒng)控制和狀態(tài)寄存器
            24. #definerCLKOUTCFG(*(volatileunsigned*)(0x400FC1C8))
            25. #definerIOCON_P0_10(*(volatileunsigned*)(0x4002C028))
            26. #definerIOCON_P0_11(*(volatileunsigned*)(0x4002C02C))
            27. #definerPCONP(*(volatileunsigned*)(0x400FC0C4))
            28. #definerU2LCR(*(volatileunsigned*)(0x4009800C))
            29. #definerU2FDR(*(volatileunsigned*)(0x40098028))
            30. #definerU2DLL(*(volatileunsigned*)(0x40098000))
            31. #definerU2DLM(*(volatileunsigned*)(0x40098004))
            32. #definerU2TER(*(volatileunsigned*)(0x40098030))
            33. #definerU2THR(*(volatileunsigned*)(0x40098000))
            34. #definerU2RBR(*(volatileunsigned*)(0x40098000))
            35. #definerU2FCR(*(volatileunsigned*)(0x40098008))
            36. #definerU2IIR(*(volatileunsigned*)(0x40098008))
            37. #definerU2LSR(*(volatileunsigned*)(0x40098014))
            38. #definerU2IER(*(volatileunsigned*)(0x40098004))
            39. #definerU2ACR(*(volatileunsigned*)(0x40098020))
            40. voidUART2_IRQHandler()
            41. {
            42. unsignedintintId;
            43. chartmp_char;
            44. intId=rU2IIR&0xf;
            45. rU2THR=intId;
            46. if(intId==0xc||intId==0x4)//RDA或者CTI中斷
            47. {
            48. rU2LCR&=~(0x1<<7);//DLAB=0
            49. tmp_char=rU2RBR&0xff;
            50. rU2THR=tmp_char;
            51. }
            52. intId=rU2IIR&0xf;
            53. rU2THR=intId;
            54. if(tmp_char==0xa5)
            55. rFIO1PIN|=(1<<18);
            56. elseif(tmp_char==0x5a)
            57. rFIO1PIN&=~(1<<18);
            58. }
            59. voidSystemInit()
            60. {
            61. rSCS&=~(0x1<<4);//頻率12M
            62. rSCS|=(0x1<<5);//使能主振蕩器
            63. while(0==(rSCS&(0x1<<6)));//等待主振蕩器穩(wěn)定
            64. rCLKSRCSEL=0x1;
            65. rPLL0CFG=0x9;//配置CCLK=120M
            66. rPLL0CON=0x01;
            67. rPLL0FEED=0xAA;
            68. rPLL0FEED=0x55;
            69. while(0==(rPLL0STAT&(0x1<<10)));
            70. rCCLKSEL=(0x1|(0x1<<8));
            71. rPCLKSEL=0x2;//配置PCLK=60M
            72. rCLKOUTCFG=0x0|(0xb<<4)|(0x1<<8);
            73. }
            74. voidInit_Uart2()
            75. {
            76. rPCONP|=0x1<<24;//使能UART2功率控制
            77. rIOCON_P0_10=(rIOCON_P0_10&(~0x7))|0x1;//P0.10P0.11做UART2的發(fā)送和接收管腳
            78. rIOCON_P0_11=(rIOCON_P0_11&(~0x7))|0x1;
            79. rU2LCR|=0x1<<7;//DLAB=1
            80. rU2FDR=1|2<<4;//波特率設(shè)置115200
            81. rU2DLM=0;
            82. rU2DLL=22;
            83. rU2LCR&=~(0x1<<7);//DLAB=0
            84. rU2LCR|=0x3;//8位數(shù)據(jù)位,無校驗,1個停止位
            85. rU2TER|=0x1<<7;//使能串口2的發(fā)送
            86. rU2IER|=0x1;//使能串口2的接收中斷
            87. rU2FCR|=0x1;//復(fù)位FIFO,設(shè)置接收1個字符觸發(fā)中斷
            88. rU2FCR|=0x1<<1|0x1<<2;
            89. rISER0|=0x1<<7;//使能串口2中斷
            90. }
            91. voidUart2SendC(charc)
            92. {
            93. rU2THR=c&0xff;
            94. while(!(rU2LSR&(0x1<<5)));//等待rU2THR中的數(shù)據(jù)發(fā)送完成,防止數(shù)據(jù)溢出
            95. }
            96. voidUart2SendS(char*s)
            97. {
            98. while(*s)
            99. {
            100. Uart2SendC(*s);
            101. s++;
            102. }
            103. }
            104. intmain(void)
            105. {
            106. charstr[]={"nr1,DisplaytheU2IIR[3:0]+Data+U2IIR[3:0]nr2,Send0x5a--->TurnontheLEDnr3,Send0xa5--->TurnofftheLEDnr"};
            107. rFIO1DIR|=(1<<18);//GPIO1.18->OUTPUT
            108. Init_Uart2();
            109. Uart2SendS(str);
            110. while(1);
            111. }

            運行結(jié)果如下圖所示




            關(guān)鍵詞: Cortex-M3NXPLPC1788UAR

            評論


            相關(guān)推薦

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

            關(guān)閉