




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章S3C2410的串口UART及編程
6.1S3C2410的串口UART概述6.1.1S3C2410異步串行通訊〔UART〕單元S3C2410UART單元提供3個(gè)獨(dú)立的異步串行通訊接口,皆可任務(wù)于查詢、中斷和DMA方式。運(yùn)用系統(tǒng)時(shí)鐘最高波特率達(dá)230.4kb/s,假設(shè)運(yùn)用外部設(shè)備提供的時(shí)鐘,可以到達(dá)更高的速率。每一個(gè)UART單元包含一個(gè)16字節(jié)的FIFO〔FirstInputFirstOutput,先進(jìn)先出移位存放器〕,用于數(shù)據(jù)的接納和發(fā)送。S3C2410UART支持可編程波特率、紅外發(fā)送/接納(UART2)、1個(gè)或2個(gè)停頓位、5位/6位/7位/8位數(shù)據(jù)寬度和奇偶校驗(yàn)。6.1.2波特率的產(chǎn)生波特率由一個(gè)公用的UART波特率分頻存放器(UBRDIVn)控制,UBRDIVn值計(jì)算公如下:UBRDIVn=(int)[ULK/(波特率×16)]-1或者UBRDIVn=(int)[PLK/(波特率×16)]-1式中:時(shí)鐘選用ULK還是PLK由UART控制存放器UCONn[10]的形狀決議。假設(shè)UCONn[10]=0,那么用PLK作為波特率發(fā)生器的時(shí)鐘源頻率;否那么選用ULK作為波特率發(fā)生器的時(shí)鐘源頻率。UBRDIVn的值必需在1~(216-1)之間。例如:假設(shè)ULK或者PLK等于40MHz,當(dāng)波特率為115200b/s時(shí),那么UBRDIVn=(int)[40000000/(115200×16)]一1=int(21.7)-1=21-1=206.1.3UART通訊操作下面簡(jiǎn)單引見UART操作,關(guān)于數(shù)據(jù)發(fā)送、數(shù)據(jù)接納、中斷產(chǎn)生、波特率產(chǎn)生、查詢檢測(cè)方式、紅外方式的詳細(xì)引見,參見下面6.3節(jié)。發(fā)送數(shù)據(jù)幀是可編程的。一個(gè)數(shù)據(jù)幀包含1個(gè)起始位、5~8個(gè)數(shù)據(jù)位、1個(gè)可選的奇偶校驗(yàn)位和1~2位停頓位,停頓位經(jīng)過(guò)行控制存放器ULCONn配置。與發(fā)送數(shù)據(jù)幀類似,接納數(shù)據(jù)幀也是可編程的。接納幀由1個(gè)起始位、5~8個(gè)數(shù)據(jù)位、l個(gè)可選的奇偶校驗(yàn)位以及1~2位行控制存放器ULCONn中設(shè)定的停頓位組成。接納器還可以檢測(cè)溢出錯(cuò)、奇偶校驗(yàn)錯(cuò)、幀錯(cuò)誤和傳輸中斷,每一個(gè)錯(cuò)誤均可以設(shè)置一個(gè)錯(cuò)誤標(biāo)志。?溢出錯(cuò)誤(overrunerror):指已接納到的數(shù)據(jù)在讀取之前被新接納的數(shù)據(jù)覆蓋;?奇偶校驗(yàn)錯(cuò):指接納器檢測(cè)到的校驗(yàn)和與設(shè)置的不符;?幀錯(cuò)誤:指沒(méi)有接納到有效的停頓位;?傳輸中斷:表示接納數(shù)據(jù)RxDn堅(jiān)持邏輯0超越一幀的傳輸時(shí)間。在FIFO方式下,假設(shè)RxFIFO非空,而在3個(gè)字的傳輸時(shí)間內(nèi)沒(méi)有接遭到數(shù)據(jù),那么產(chǎn)生超時(shí)。6.2UART的控制存放器6.2.1UART行控制存放器ULCONn該存放器的位6決議能否運(yùn)用紅外方式,位5、位4和位3決議校驗(yàn)方式,位2決議停頓位長(zhǎng)度,位1和位0決議每幀的數(shù)據(jù)位數(shù)。詳細(xì)如下:ULCONn[7]保管;ULCONn[6]紅外線方式,0:正常方式;1:紅外線方式;ULCONn[5:3]校驗(yàn)方式,0xx:無(wú)校驗(yàn);100:奇校驗(yàn);101:偶校驗(yàn);ULCONn[2]停頓位,0:一個(gè)停頓位;1:二個(gè)停頓位;ULCONn[1:0]數(shù)據(jù)位,00:5位;01:6位;10:7位;11:8位。6.2.2UART控制存放器UCONn該存放器決議UART的各種方式。UCONn[10]1:ULK做波特率發(fā)生器;0:PLK做波特率發(fā)生器。UCONn[9]1:Tx中斷電平觸發(fā);0:Tx中斷脈沖觸發(fā)。UCONn[8]1:Rx中斷電平觸發(fā);0:Rx中斷脈沖觸發(fā)。UCONn[7]1:接納超時(shí)中斷允許;0:接納超時(shí)中斷制止。UCONn[6}1:產(chǎn)生接納錯(cuò)誤中斷;0:不產(chǎn)生接納錯(cuò)誤中斷。UCONn[5]l:發(fā)送直接傳給接納方式(loopback);0:正常方式。UCONn[4]1:發(fā)送延續(xù)信號(hào);0:正常方式發(fā)送。UCONn[3:2]發(fā)送方式選擇:00:制止發(fā)送;01:中斷或查詢方式;10:DMA0懇求(UART0),DMA3懇求(UART2);11:DMAl懇求(UART1)。UCONn[1:0]接納方式選擇。00:制止接納;01:中斷或查詢方式;10:DMA0懇求UART0,DMA2懇求UART2;11:DMAl懇求UART1。6.2.3UARTFIFO控制存放器UFCONnUFCONn[7:6]00:TxFIFO存放器中有0字節(jié)就觸發(fā)中斷;01:TxFIFO存放器中有4字節(jié)就觸發(fā)中斷;10:TxFIFO存放器中有8字節(jié)就觸發(fā)中斷;11:TxFIFO存放器中有12字節(jié)就觸發(fā)中斷。UFCONn[5:4]00:RxFIFO存放器中有4字節(jié)就觸發(fā)中斷;01:RxFIFO存放器中有8字節(jié)就觸發(fā)中斷;10:RxFIFO存放器中有12字節(jié)就觸發(fā)中斷;11:RxFIFO存放器中有16字節(jié)就觸發(fā)中斷。UFCONn[3]保管。UFCONn[2]1:FIFO復(fù)位清零TxFIFO;0:FIFO復(fù)位不清零TxFIFO。UFCONn[1]1:FIFO復(fù)位清零RxFIFO;0:F1FO復(fù)位不清零RxFIFO。UFCONn[0]1:允許FIFO功能;0:制止FIFO功能。6.2.4UARTMODEM控制存放器UMCONnUMCONn[7:5]保管,必需全為0。UMCONn[4]1:允許運(yùn)用AFC方式;0:制止運(yùn)用AFC方式。UMCONn[3]保管,必需全為0。UMCONn[0]1:激活rRTS;0:不激活rRTS。6.2.5發(fā)送存放器UTXH和接納存放器URXH這兩個(gè)存放器存放發(fā)送和接納的數(shù)據(jù),當(dāng)然只需1字節(jié)(8位數(shù)據(jù))。需求留意的是,在發(fā)生溢出錯(cuò)誤時(shí),接納的數(shù)據(jù)必需被讀出來(lái),否那么會(huì)引發(fā)下次溢出錯(cuò)誤。6.2.6發(fā)送和接納形狀存放器UTRSTATnUTRSTATn發(fā)送和接納形狀存放器包括UTRSTAT0,UTRSTAT1andUTRSTAT2UTRSTATn存放器各位定義:UTRSTATn[1]發(fā)送緩沖器空標(biāo)志0=不空;1=空。UTRSTATn[0]接納緩沖器有接納數(shù)據(jù)標(biāo)志0=空;1=接納緩沖器有數(shù)據(jù)。6.2.7波特率分頻存放器UBRDIV波特率分頻存放器UBRDIV的定義和運(yùn)用在6.1.2中已表達(dá),不再反復(fù)。6.2.8UART單元各存放器的定義在隨書提供的軟件包2410test中,在2410addr.h文件中有關(guān)于UART單元各存放器的定義。//UART#definerULCON0(*(volatileunsigned*)0x50000000)//UART0Linecontrol#definerUCON0(*(volatileunsigned*)0x50000004)//UART0control#definerUFCON0(*(volatileunsigned*)0x50000008)//UART0FIFOcontrol#definerUMCON0(*(volatileunsigned*)0x5000000c)//UART0Modemcontrol#definerUTRSTAT0(*(volatileunsigned*)0x50000010)//UART0Tx/Rxstatus#definerUERSTAT0(*(volatileunsigned*)0x50000014)//UART0Rxerrorstatus#definerUFSTAT0(*(volatileunsigned*)0x50000018)//UART0FIFOstatus#definerUMSTAT0(*(volatileunsigned*)0x5000001c)//UART0Modemstatus#definerUBRDIV0(*(volatileunsigned*)0x50000028)//UART0Baudratediviaor#definerULCON1(*(volatileunsigned*)0x50004000)//UART1Linecontrol#definerUCON1(*(volatileunsigned*)0x50004004)//UART1Control#definerUFCON1(*(volatileunsigned*)0x50004008)//UART1FIFOcontrol#definerUMCON1(*(volatileunsigned*)0x5000400c)//UART1Modemcontrol#definerUTRSTAT1(*(volatileunsigned*)0x50004010)//UART1Tx/Rxstatus#definerUERSTAT1(*(volatileunsigned*)0x50004014)//UART1Rxerrorstatus#definerUFSTAT1(*(volatileunsigned*)0x50004018)//UART1FIFOstatus#definerUMSTAT1(*(volatileunsigned*)0x5000401c)//UART1Modemstatus#definerUBRDIV1(*(volatileunsigned*)0x50004028)//UART1Baudratedivisor#definerULCON2(*(volatileunsigned*)0x50008000)//UART2Linecontrol#definerUCON2(*(volatileunsigned*)0x50008004)//UART2Control#definerUFCON2(*(volatileunsigned*)0x50008008)//UART2FIFOcontrol#definerUMCON2(*(volatileunsigned*)0x5000800c)//UART2Modemcontrol#definerUTRSTAT2(*(volatileunsigned*)0x50008010)//UART2Tx/Rxstatus#definerUERSTAT2(*(volatileunsigned*)0x50008014)//UART2Rxerrorstatus#definerUFSTAT2(*(volatileunsigned*)0x50008018)//UART2FIFOstatus#definerUMSTAT2(*(volatileunsigned*)0x5000801c)//UART2Modemstatus#definerUBRDIV2(*(volatileunsigned*)0x50008028)//UART2Baudratedivisor#ifdef_BIG_ENDIAN#definerUTXH0(*(volatileunsignedchar*)0x50000023)//UART0TransmissionHold#definerURXH0(*(volatileunsignedchar*)0x50000027)//UART0Receivebuffer#definerUTXH1(*(volatileunsignedchar*)0x50004023)//UART1TransmissionHold#definerURXH1(*(volatileunsignedchar*)0x50004027)//UART1Receivebuffer#definerUTXH2(*(volatileunsignedchar*)0x50008023)//UART2TransmissionHold#definerURXH2(*(volatileunsignedchar*)0x50008027)//UART2Receivebuffer#defineWrUTXH0(ch)(*(volatileunsignedchar*)0x50000023)=(unsignedchar)(ch)#defineRdURXH0()(*(volatileunsignedchar*)0x50000027)#defineWrUTXH1(ch)(*(volatileunsignedchar*)0x50004023)=(unsignedchar)(ch)#defineRdURXH1()(*(volatileunsignedchar*)0x50004027)#defineWrUTXH20(ch)(*(volatileunsignedchar*)0x50008023)=(unsignedchar)(ch)#defineRdURXH2()(*(volatileunsignedchar*)0x50008027)#difineUTXH0(0x50000020+3)//Byte_accessaddressbyDMA#defineURXH0(0x50000024+3)#difineUTXH1(0x50004020+3)#defineURXH1(0x50004024+3)#difineUTXH2(0x50008020+3)#defineURXH2(0x50008024+3)#else//LittleEndian#definerUTXH0(*(volatileunsignedchar*)0x50000020)//UART0TransmissionHold#definerURXH0(*(volatileunsignedchar*)0x50000024)//UART0Receivebuffer#definerUTXH1(*(volatileunsignedchar*)0x50004020)//UART1TransmissionHold#definerURXH1(*(volatileunsignedchar*)0x50004024)//UART1Receivebuffer#definerUTXH2(*(volatileunsignedchar*)0x50000820)//UART2TransmissionHold#definerURXH2(*(volatileunsignedchar*)0x50008024)//UART2Receivebuffer#defineWrUTXH0(ch)(*(volatileunsignedchar*)0x50000020)=(unsignedchar)(ch)#defineRdURXH0()(*(volatileunsignedchar*)0x50000024)#defineWrUTXH1(ch)(*(volatileunsignedchar*)0x50004020)=(unsignedchar)(ch)#defineRdURXH1()(*(volatileunsignedchar*)0x50004024)#defineWrUTXH2(ch)(*(volatileunsignedchar*)0x50008020)=(unsignedchar)(ch)#defineRdURXH2()(*(volatileunsignedchar*)0x50008024)#difineUTXH0(0x50000020+3)//Byte_accessaddressbyDMA#defineURXH0(0x50000024+3)#difineUTXH1(0x50004020+3)#defineURXH1(0x50004024+3)#difineUTXH2(0x50008020+3)#defineURXH2(0x50008024+3)#endif6.3UART通訊程序編寫6.3.1通訊程序編寫步驟UART通訊程序可以采用查詢、中斷和DMA方式。我們經(jīng)過(guò)運(yùn)用較多的中斷方式來(lái)介UART通訊程序的編寫。簡(jiǎn)單做法是,UART通訊程序的編寫參照例子程序。?選通道,經(jīng)過(guò)函數(shù)Uart_Select();選UART0~UART2;?選波特率和波特率發(fā)生器時(shí)鐘,選波特率經(jīng)過(guò)函數(shù)Uart_Pclk_En(intch,intbaud)或Uart_Pclk_En(intch,intbaud)來(lái)進(jìn)展。時(shí)鐘選UCLK,rUCON0|=0x400;時(shí)鐘選PCLK,rUCON0&=0x3ff。?通訊協(xié)議〔rULCON0〕設(shè)定,假設(shè)正常通訊,一位停頓位,8位數(shù)據(jù)位,無(wú)奇偶效驗(yàn):rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); ?通訊控制字〔rUCON0〕設(shè)定,如時(shí)鐘選ULK做波特率發(fā)生器;Tx中斷脈沖觸發(fā),Rx中斷脈沖觸發(fā);接納超時(shí)中斷允許;產(chǎn)生接納錯(cuò)誤中斷;正常方式發(fā)送:rUCON0|=(TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);? I/O口初始化,由于UART通訊運(yùn)用H口的第二功能,所以H口要上拉制止:rGPHUP|=0x1ff。H口控制存放器nRTS1,nCTS1功能使能,rGPHCON&=0x3c0000,rGPHCON|=0x2faaa;? 設(shè)中斷效力函數(shù)入口地址,把中斷效力函數(shù)入口地址賦函數(shù)指針PISR_UARTn,留意,接納中斷效力函數(shù)入口地址和發(fā)送中斷效力函數(shù)入口地址是一個(gè),在中斷效力函數(shù)中根據(jù)UTRSTATn[1]和UTRSTATn[0]形狀決議是發(fā)送中斷還是接納中斷。? 翻開總中斷屏蔽和子中斷屏蔽等待中斷:rINTMSK=~(BIT_UART0);rINTSUBMSK=~(BIT_SUB_TXD0);? 進(jìn)入中斷后,先屏蔽發(fā)送和接納中斷,防止新來(lái)中斷干擾我們的正常發(fā)送和接納,正常發(fā)送和接納終了后,清中斷掛起和中斷源掛起存放器:ClearPending(BIT_UART0),rSUBSRCPND=(BIT_SUB_TXD0〔發(fā)送〕,rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0)〔接納〕;? 取消中斷屏蔽,等下一次中斷。6.3.2通訊程序編寫例如下面給出的幾個(gè)函數(shù),是查詢方式URAT通訊常用到的主要函數(shù),包括URAT初始化,字符的發(fā)送、接納函數(shù),希望大家仔細(xì)閱讀,了解每一行的含義。1,UART通訊,采用查詢方式://援用頭文件#include"2410addr.h"#include"2410lib.h"#include"option.h"#include"def.h"#include<stdarg.h>#include<string.h>#include<stdlib.h>#include<stdio.h>#include<ctype.h>//函數(shù)聲明voidUart_Init(intpclk,intbaud);charUart_Getch(void);charUart_GetKey(void);voidUart_GetString(char*string);voidUart_SendByte(intdata);voidUart_SendString(char*pt);voidUart_Select(intch);//-----------------------------------------------------------------//串口初始化,輸入PCLK,輸入波特率//-----------------------------------------------------------------staticintwhichUart=0;voidUart_Init(intpclk,intbaud){inti;if(pclk==0)pclk=PCLK;rUFCON0=0x0;//UARTchannel0FIFOcontrolregister,FIFOdisablerUFCON1=0x0;//UARTchannel1FIFOcontrolregister,FIFOdisablerUFCON2=0x0;//UARTchannel2FIFOcontrolregister,FIFOdisablerUMCON0=0x0;//UARTchaneel0MODEMcontrolregister,AFCdisablerUMCON1=0x0;//UARTchaneel1MODEMcontrolregister,AFCdisable//UART0rULCON0=0x3;//Linecontrolregister:Normal,Noparity,1stop,8bits.//00000011rUCON0=0x245;//Controlregister//[10][9][8][7][6][5][4][3:2][1:0]//ClockSel,TxInt,RxInt,RxTimeOut,Rxerr,Loop-back,Sendbreak,TransmitMode,ReceiveMode01001000101//PCLK,LevelPulseDisableGenerateNormalNormalInterruptorPolling//rUBRDIV0=((int)(pclk/16./baud)-1);//Baudratedivisiorregister0rUBRDIV0=((int)(pclk/16./baud+0.5)-1);//Baudratedivisiorregister0
//UART1rULCON1=0x3;rUCON1=0x245;rUBRDIV1=((int)(pclk/16./baud)-1);//UART2rULCON2=0x3;rUCON2=0x245;rUBRDIV2=((int)(pclk/16./baud)-1);for(i=0;i<100;i++);}//-------------------------------------------------------------------------------//選擇串口通道//-------------------------------------------------------------------------------voidUart_Select(intch){whichUart=ch;}//------------------------------------------------------------------------//等待發(fā)送移位存放器空//------------------------------------------------------------------------voidUart_TxEmpty(intch){if(ch==0)while(!(rUTRSTAT0&0x4));//Waituntiltxshifterisempty.elseif(ch==1)while(!(rUTRSTAT1&0x4));//Waituntiltxshifterisempty.elseif(ch==2)while(!(rUTRSTAT2&0x4));//Waituntiltxshifterisempty.}//-----------------------------------------------------------------------------//接納串口一字節(jié)數(shù)據(jù),留意RdURXH0(),RdURXH1(),RdURXH2()的運(yùn)用//-----------------------------------------------------------------------------charUart_Getch(void){if(whichUart==0){while(!(rUTRSTAT0&0x1));//ReceivedatareadyreturnRdURXH0();}elseif(whichUart==1){while(!(rUTRSTAT1&0x1));//ReceivedatareadyreturnRdURXH1();}elseif(whichUart==2){while(!(rUTRSTAT2&0x1));//ReceivedatareadyreturnRdURXH2();}elsereturn0;}//-------------------------------------------------------------------------------//得到串口的鍵值//-------------------------------------------------------------------------------charUart_GetKey(void){if(whichUart==0){if(rUTRSTAT0&0x1)//ReceivedatareadyreturnRdURXH0();elsereturn0;}elseif(whichUart==1){if(rUTRSTAT1&0x1)//ReceivedatareadyreturnRdURXH1();elsereturn0;}
elseif(whichUart==2){if(rUTRSTAT2&0x1)//ReceivedatareadyreturnRdURXH2();elsereturn0;}elsereturn0;}//-----------------------------------------------------------------------------//串口得到字符串//-----------------------------------------------------------------------------voidUart_GetString(char*string){char*string2=string;charc;while((c=Uart_Getch())!='\r'){if(c=='\b'){if((int)string2<(int)string){Uart_Printf("\b\b");string--;}}else{*string++=c;Uart_SendByte(c);}}*string='\0';Uart_SendByte('\n');}//---------------------------------------------------------------------//得到串口初始號(hào)//---------------------------------------------------------------------intUart_GetIntNum(void){charstr[30];char*string=str;intbase=10;intminus=0;intresult=0;intlastIndex;inti;Uart_GetString(string);if(string[0]=='-'){minus=1;string++;}
if(string[0]=='0'&&(string[1]=='x'||string[1]=='X')){base=16;string+=2;}
lastIndex=strlen(string)-1;
if(lastIndex<0)return-1;if(string[lastIndex]=='h'||string[lastIndex]=='H'){base=16;string[lastIndex]=0;lastIndex--;}if(base==10){result=atoi(string);result=minus?(-1*result):result;}else{for(i=0;i<=lastIndex;i++){if(isalpha(string[i])){if(isupper(string[i]))result=(result<<4)+string[i]-'A'+10;elseresult=(result<<4)+string[i]-'a'+10;}elseresult=(result<<4)+string[i]-'0';}result=minus?(-1*result):result;}returnresult;}//-----------------------------------------------------------------------------//串口發(fā)送字節(jié)//-----------------------------------------------------------------------------voidUart_SendByte(intdata){if(whichUart==0)
{if(data=='\n'){while(!(rUTRSTAT0&0x2));Delay(10);//becausetheslowresponseofhyper_terminalWrUTXH0('\r');}while(!(rUTRSTAT0&0x2));//WaituntilTHRisempty.Delay(10);WrUTXH0(data);}elseif(whichUart==1){if(data=='\n')
{while(!(rUTRSTAT1&0x2));Delay(10);//becausetheslowresponseofhyper_terminalrUTXH1='\r';}while(!(rUTRSTAT1&0x2));//WaituntilTHRisempty.Delay(10);rUTXH1=data;}elseif(whichUart==2){if(data=='\n')
{while(!(rUTRSTAT2&0x2));Delay(10);//becausetheslowresponseofhyper_terminalrUTXH2='\r';}while(!(rUTRSTAT2&0x2));//WaituntilTHRisempty.Delay(10);rUTXH2=data;}}//-----------------------------------------------------------------------------//串口發(fā)送字符串//-----------------------------------------------------------------------------voidUart_SendString(char*pt){while(*pt)Uart_SendByte(*pt++);}2,UART0中斷方式發(fā)送和接納//-----------------------------------------------------------------------------//UART0中斷方式發(fā)送和接納//-----------------------------------------------------------------------------voidTest_Uart0_Int(void){Uart_Port_Set();Uart_Select(0);/*UART0Txtestwithinterrupt*/isTxInt=1;uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART0Txinterrupttestisgood!!!!\r\n";Uart_Printf("[Uartchannel0TxInterruptTest]\n");pISR_UART0=(unsigned)Uart0_TxInt;rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); //Normal,Noparity,Onestopbit,8bitrUCON0&=0x400; //ForthePCLK<->UCLKfuctionrUCON0|=(TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);//Clock,Tx:Def,Rx:Def,Rxtimeout:x,Rxerrorint:x,Loop-back:x,Sendbreak:x,Tx:int,Rx:intUart_TxEmpty(0);//waituntiltxbufferisempty.rINTMSK=~(BIT_UART0);rINTSUBMSK=~(BIT_SUB_TXD0);while(isTxInt);/*UART0Rxtestwithinterrupt*/isRxInt=1;uart0RxStr=(char*)UARTBUFFER;Uart_Printf("\n[Uartchannel0RxInterruptTest]:\n");Uart_Printf("AftertypingENTERkey,youwillseethecharacterswhichwastypedbyyou.");Uart_Printf("\nToquit,pressENTERkey.!!!\n");Uart_TxEmpty(0);//waituntiltxbufferisempty.pISR_UART0=(unsigned)Uart0_RxIntOrErr;rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); //Normal,Noparity,Onestopbit,8bitrUCON0&=0x400; //ForthePCLK<->UCLKfuctionrUCON0|=(TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);//Clock,Tx:pulse,Rx:pulse,Rx:timeout:x,Rx,errorint:o,Loop-back:x,Sendbreak:x,Tx:int,Rx:int//ClearIntPendingandUnmaskClearPending(BIT_UART0);rINTMSK=~(BIT_UART0);rSUBSRCPND=(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0);rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_ERR0);
while(isRxInt);
rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_ERR0);rINTMSK|=(BIT_UART0);
Uart_Printf("%s\n",(char*)UARTBUFFER);Uart_Port_Return();}//--------------------------------------------------------------------------//UART發(fā)送和接納用到的I/O口保管和初始化//--------------------------------------------------------------------------voidUart_Port_Set(void){//PushUARTGPIOportconfigurationsave_rGPHCON=rGPHCON;save_rGPHDAT=rGPHDAT;save_rGPHUP=rGPHUP;//ConfigureUARTportrGPHCON&=0x3c0000;rGPHCON|=0x2faaa; //nRTS1,nCTS1rGPHUP|=0x1ff; //Uartportpull-updisable//rINTSUBMSK=0x7ff;//SUBINTALLMASK//PushUartcontrolregisterssave_ULCON0=rULCON0; save_UCON0=rUCON0; save_UFCON0=rUFCON0; save_UMCON0=rUMCON0; save_ULCON1=rULCON1; save_UCON1=rUCON1; save_UFCON1=rUFCON1; save_UMCON1=rUMCON1; save_ULCON2=rULCON2; save_UCON2=rUCON2; save_UFCON2=rUFCON2; save_UMCON2=rUMCON2; //InitializeUART1,2port}//-----------------------------------------------------------------------------//UART發(fā)送和接納終了,用到的I/O口恢復(fù)原來(lái)形狀//-----------------------------------------------------------------------------voidUart_Port_Return(void){//PopUARTGPIOportconfigurationrGPHCON=save_rGPHCON;rGPHDAT=save_rGPHDAT;rGPHUP=save_rGPHUP;//PopUartcontrolregistersrULCON0=save_ULCON0; rUCON0=save_UCON0; rUFCON0=save_UFCON0; rUMCON0=save_UMCON0; rULCON1=save_ULCON1; rUCON1=save_UCON1; rUFCON1=save_UFCON1; rUMCON1=save_UMCON1;rULCON2=save_ULCON2; rUCON2=save_UCON2; rUFCON2=save_UFCON2; rUMCON2=save_UMCON2; }//-------------------------------------------------------------------//UART發(fā)送和接納運(yùn)用UCLK,并計(jì)算rUBRDIV0和設(shè)定波特率//-------------------------------------------------------------------voidUart_Uclk_En(intch,intbaud){/*intch,baud;Uart_Printf("\nSelectUARTchannel[0:UART0/1:UART1/2:UART2]:\n");ch=Uart_GetIntNum();Uart_Printf("\nSelectbaudrate:\n");baud=Uart_GetIntNum();*/if(ch==0){ Uart_Select(0); rUCON0|=0x400; //SelectUCLK rUBRDIV0=((int)(UCLK/16./baud)-1); //Baudratedivisiorregister Uart_Printf("UCLKisenabledbyUART0.\n"); }elseif(ch==1){ Uart_Select(1); rUCON1|=0x400; //SelectUCLKrUBRDIV1=((int)(UCLK/16./baud)-1); //BaudratedivisiorregisterUart_Select(0);Uart_Printf("UCLKisenabledbyUART1.\n"); }else{ Uart_Select(2); rUCON2|=0x400; //SelectUCLKrUBRDIV2=((int)(UCLK/16./baud)-1); //BaudratedivisiorregisterUart_Select(0);Uart_Printf("UCLKisenabledbyUART2.\n"); }//for(i=0;i<100;i++); //Forthesatbleoperation}//----------------------------------------------------------------------------//UART發(fā)送和接納運(yùn)用PCLK,并計(jì)算rUBRDIV0和設(shè)定波特率//----------------------------------------------------------------------------voidUart_Pclk_En(intch,intbaud){/*intch,baud;Uart_Printf("\nSelectUARTchannel[0:UART0/1:UART1/2:UART2]:\n");ch=Uart_GetIntNum();Uart_Printf("\nSelectbaudrate:\n");baud=Uart_GetIntNum();*/if(ch==0){ Uart_Select(0); rUCON0&=0x3ff; //SelectPCLK rUBRDIV0=((int)(PCLK/16./baud)-1); //Baudratedivisiorregister Uart_Printf("PCLKisenabledbyUART0.\n"); }elseif(ch==1){ Uart_Select(1); rUCON1|=0x3ff; //SelectPCLK rUBRDIV1=((int)(PCLK/16./baud)-1); //Baudratedivisiorregister Uart_Select(0); Uart_Printf("PCLKisenabledbyUART1.\n"); }else{ Uart_Select(2); rUCON2|=0x3ff; //SelectPCLK rUBRDIV2=((int)(PCLK/16./baud)-1); //Baudratedivisiorregister Uart_Select(0); Uart_Printf("PCLKisenabledbyUART2.\n"); }//for(i=0;i<100;i++); //Forthesatbleoperation}//-----------------------------------
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度健康養(yǎng)生產(chǎn)品代理中介費(fèi)協(xié)議
- 2025年度電商平臺(tái)退貨運(yùn)費(fèi)退款協(xié)議合同
- 二零二五年度文化產(chǎn)業(yè)投資有限公司股權(quán)轉(zhuǎn)讓協(xié)議書
- 二零二五年度事業(yè)單位專業(yè)技術(shù)人才引進(jìn)聘用合同
- 二零二五年度農(nóng)產(chǎn)品電商平臺(tái)代理協(xié)議
- 2025年度茶葉批發(fā)市場(chǎng)租賃及采購(gòu)代理合同
- 二零二五年度金融科技入股分紅管理合同
- 2025年度網(wǎng)絡(luò)安全與大數(shù)據(jù)戰(zhàn)略合作合同
- 2025年度老舊小區(qū)外墻改造工程進(jìn)度管理合同
- 二零二五年度企業(yè)信用評(píng)價(jià)與守合同合規(guī)監(jiān)督合同
- 監(jiān)理日志表(標(biāo)準(zhǔn)模版)
- H3C-CAS虛擬化平臺(tái)詳細(xì)介紹
- 小學(xué)生韻母in、ing常見漢字與區(qū)分練習(xí)
- 藥房品種類別及數(shù)量清單
- 機(jī)關(guān)檔案管理工作培訓(xùn)PPT課件
- 初中物理人教版八年級(jí)下冊(cè) 第1節(jié)牛頓第一定律 課件
- 網(wǎng)站培訓(xùn)內(nèi)容trswcm65表單選件用戶手冊(cè)
- 連續(xù)平壓熱壓機(jī) 三篇 俞敏等
- 打印版-圓與二次函數(shù)綜合題精練(帶答案)
- 各種閥門CAD圖
- 工程結(jié)算書標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論