新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Cortex-M3 (NXP LPC1788)之UART用法

        Cortex-M3 (NXP LPC1788)之UART用法

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

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

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

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

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

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

        下面的程序例子,程序開始打印菜單,PC串口軟件發送一個字節數據給開發板,開發板接收到數據后將讀取UnRBR前后的中斷標識寄存器IIR的值,以及接收到的值發送回給PC。如果是0x5a或者0xa5還可以打開或者關閉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狀態寄存器
        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))//外設時鐘寄存器
        21. #definerPCON(*(volatileunsigned*)(0x400FC0C0))
        22. #definerPXCONP(*(volatileunsigned*)(0x400FC0C4))
        23. #definerSCS(*(volatileunsigned*)(0x400FC1A0))//系統控制和狀態寄存器
        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)));//等待主振蕩器穩定
        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的發送和接收管腳
        78. rIOCON_P0_11=(rIOCON_P0_11&(~0x7))|0x1;
        79. rU2LCR|=0x1<<7;//DLAB=1
        80. rU2FDR=1|2<<4;//波特率設置115200
        81. rU2DLM=0;
        82. rU2DLL=22;
        83. rU2LCR&=~(0x1<<7);//DLAB=0
        84. rU2LCR|=0x3;//8位數據位,無校驗,1個停止位
        85. rU2TER|=0x1<<7;//使能串口2的發送
        86. rU2IER|=0x1;//使能串口2的接收中斷
        87. rU2FCR|=0x1;//復位FIFO,設置接收1個字符觸發中斷
        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中的數據發送完成,防止數據溢出
        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. }

        運行結果如下圖所示




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 十堰市| 三都| 彭州市| 印江| 石狮市| 庆城县| 富裕县| 曲靖市| 正镶白旗| 四川省| 泸西县| 周至县| 福贡县| 武胜县| 独山县| 班戈县| 岗巴县| 文山县| 万山特区| 化州市| 宁阳县| 通化县| 马公市| 大悟县| 扎兰屯市| 新龙县| 陵川县| 江北区| 安平县| 新野县| 来安县| 汉源县| 顺义区| 宁国市| 石渠县| 清新县| 托里县| 漾濞| 吐鲁番市| 嘉定区| 通化县|