第六章 ARM9-串口UART及编程课件_第1页
第六章 ARM9-串口UART及编程课件_第2页
第六章 ARM9-串口UART及编程课件_第3页
第六章 ARM9-串口UART及编程课件_第4页
第六章 ARM9-串口UART及编程课件_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章S3C2410的串口UART及编程

6.1S3C2410的串口UART概述6.1.1S3C2410异步串行通信(UART)单元S3C2410UART单元提供3个独立的异步串行通信接口,皆可工作于查询、中断和DMA模式。使用系统时钟最高波特率达230.4kb/s,如果使用外部设备提供的时钟,可以达到更高的速率。每一个UART单元包含一个16字节的FIFO(FirstInputFirstOutput,先进先出移位寄存器),用于数据的接收和发送。S3C2410UART支持可编程波特率、红外发送/接收(UART2)、1个或2个停止位、5位/6位/7位/8位数据宽度和奇偶校验。第六章S3C2410的串口UART及编程

6.1S3C16.1.2波特率的产生波特率由一个专用的UART波特率分频寄存器(UBRDIVn)控制,UBRDIVn值计算公如下:UBRDIVn=(int)[ULK/(波特率×16)]-1或者UBRDIVn=(int)[PLK/(波特率×16)]-1式中:时钟选用ULK还是PLK由UART控制寄存器UCONn[10]的状态决定。如果UCONn[10]=0,则用PLK作为波特率发生器的时钟源频率;否则选用ULK作为波特率发生器的时钟源频率。UBRDIVn的值必须在1~(216-1)之间。例如:若ULK或者PLK等于40MHz,当波特率为115200b/s时,则UBRDIVn=(int)[40000000/(115200×16)]一1=int(21.7)-1=21-1=206.1.2波特率的产生26.1.3UART通信操作下面简略介绍UART操作,关于数据发送、数据接收、中断产生、波特率产生、查询检测模式、红外模式的详细介绍,参见下面6.3节。发送数据帧是可编程的。一个数据帧包含1个起始位、5~8个数据位、1个可选的奇偶校验位和1~2位停止位,停止位通过行控制寄存器ULCONn配置。与发送数据帧类似,接收数据帧也是可编程的。接收帧由1个起始位、5~8个数据位、l个可选的奇偶校验位以及1~2位行控制寄存器ULCONn中设定的停止位组成。接收器还可以检测溢出错、奇偶校验错、帧错误和传输中断,每一个错误均可以设置一个错误标志。6.1.3UART通信操作3•溢出错误(overrunerror):指已接收到的数据在读取之前被新接收的数据覆盖;•奇偶校验错:指接收器检测到的校验和与设置的不符;•帧错误:指没有接收到有效的停止位;•传输中断:表示接收数据RxDn保持逻辑0超过一帧的传输时间。在FIFO模式下,如果RxFIFO非空,而在3个字的传输时间内没有接受到数据,则产生超时。•溢出错误(overrunerror):指已接收到的数46.2UART的控制寄存器6.2.1UART行控制寄存器ULCONn

该寄存器的位6决定是否使用红外模式,位5、位4和位3决定校验方式,位2决定停止位长度,位1和位0决定每帧的数据位数。具体如下:ULCONn[7]保留;ULCONn[6]红外线模式,0:正常模式;1:红外线模式;ULCONn[5:3]校验模式,0xx:无校验;100:奇校验;101:偶校验;ULCONn[2]停止位,0:一个停止位;1:二个停止位;ULCONn[1:0]数据位,00:5位;01:6位;10:7位;11:8位。6.2UART的控制寄存器56.2.2UART控制寄存器UCONn该寄存器决定UART的各种模式。UCONn[10]1:ULK做波特率发生器;0:PLK做波特率发生器。UCONn[9]1:Tx中断电平触发;0:Tx中断脉冲触发。UCONn[8]1:Rx中断电平触发;0:Rx中断脉冲触发。UCONn[7]1:接收超时中断允许;0:接收超时中断禁止。UCONn[6}1:产生接收错误中断;0:不产生接收错误中断。UCONn[5]l:发送直接传给接收方式(loopback);0:正常模式。UCONn[4]1:发送间断信号;0:正常模式发送。6.2.2UART控制寄存器UCONn6UCONn[3:2]发送模式选择:00:禁止发送;01:中断或查询模式;10:DMA0请求(UART0),DMA3请求(UART2);11:DMAl请求(UART1)。UCONn[1:0]接收模式选择。00:禁止接收;01:中断或查询模式;10:DMA0请求UART0,DMA2请求UART2;11:DMAl请求UART1。UCONn[3:2]发送模式选择:76.2.3UARTFIFO控制寄存器UFCONnUFCONn[7:6]00:TxFIFO寄存器中有0字节就触发中断;01:TxFIFO寄存器中有4字节就触发中断;10:TxFIFO寄存器中有8字节就触发中断;11:TxFIFO寄存器中有12字节就触发中断。UFCONn[5:4]00:RxFIFO寄存器中有4字节就触发中断;01:RxFIFO寄存器中有8字节就触发中断;10:RxFIFO寄存器中有12字节就触发中断;11:RxFIFO寄存器中有16字节就触发中断。6.2.3UARTFIFO控制寄存器UFCONn8UFCONn[3]保留。UFCONn[2]1:FIFO复位清零TxFIFO;0:FIFO复位不清零TxFIFO。UFCONn[1]1:FIFO复位清零RxFIFO;0:F1FO复位不清零RxFIFO。UFCONn[0]1:允许FIFO功能;0:禁止FIFO功能。UFCONn[3]保留。96.2.4UARTMODEM控制寄存器UMCONnUMCONn[7:5]保留,必须全为0。UMCONn[4]1:允许使用AFC模式;0:禁止使用AFC模式。UMCONn[3]保留,必须全为0。UMCONn[0]1:激活rRTS;0:不激活rRTS。6.2.5发送寄存器UTXH和接收寄存器URXH这两个寄存器存放发送和接收的数据,当然只有1字节(8位数据)。需要注意的是,在发生溢出错误时,接收的数据必须被读出来,否则会引发下次溢出错误。6.2.4UARTMODEM控制寄存器UMCONn106.2.6发送和接收状态寄存器UTRSTATnUTRSTATn发送和接收状态寄存器包括UTRSTAT0,UTRSTAT1andUTRSTAT2UTRSTATn寄存器各位定义:UTRSTATn[1]发送缓冲器空标志0=不空;1=空。UTRSTATn[0]接收缓冲器有接收数据标志0=空;1=接收缓冲器有数据。6.2.7波特率分频寄存器UBRDIV波特率分频寄存器UBRDIV的定义和使用在6.1.2中已叙述,不再重复。6.2.8UART单元各寄存器的定义在随书提供的软件包2410test中,在2410addr.h文件中有关于UART单元各寄存器的定义。6.2.6发送和接收状态寄存器UTRSTATn11//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//UART12#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#definerUMSTAT0(*(volatile13#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#definerUERSTAT1(*(volati14#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#definerUMCON2(*(volatile15#definerUTXH0(*(volatileunsignedchar*)0x50000023)//UART0TransmissionHold#definerURXH0(*(volatileunsignedchar*)0x50000027)//UART0Receivebuffer#definerUTXH1(*(volatileunsignedchar*)0x50004023)//UART1TransmissionHold#definerURXH1(*(volatileunsignedchar*)0x50004027)//UART1Receivebuffer#definerUTXH2(*(volatileunsignedchar*)0x50008023)//UART2TransmissionHold#definerUTXH0(*(volatile16#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)#definerURXH2(*(volatile17#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#defineURXH1(0x50004024+18#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#definerURXH2(*(volatile19#defineURXH0(0x50000024+3)#difineUTXH1(0x50004020+3)#defineURXH1(0x50004024+3)#difineUTXH2(0x50008020+3)#defineURXH2(0x50008024+3)#endif#defineURXH0(0x50000024+206.3UART通信程序编写6.3.1通信程序编写步骤UART通信程序可以采用查询、中断和DMA模式。我们通过使用较多的中断方式来介UART通信程序的编写。简单做法是,UART通信程序的编写参照例子程序。•选通道,通过函数Uart_Select();选UART0~UART2;•选波特率和波特率发生器时钟,选波特率通过函数Uart_Pclk_En(intch,intbaud)或Uart_Pclk_En(intch,intbaud)来进行。时钟选UCLK,rUCON0|=0x400;时钟选PCLK,rUCON0&=0x3ff。•通信协议(rULCON0)设定,如果正常通信,一位停止位,8位数据位,无奇偶效验:rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); 6.3UART通信程序编写21•通信控制字(rUCON0)设定,如时钟选ULK做波特率发生器;Tx中断脉冲触发,Rx中断脉冲触发;接收超时中断允许;产生接收错误中断;正常模式发送:rUCON0|=(TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);• I/O口初始化,因为UART通信使用H口的第二功能,所以H口要上拉禁止:rGPHUP|=0x1ff。H口控制寄存器nRTS1,nCTS1功能使能,rGPHCON&=0x3c0000,rGPHCON|=0x2faaa;• 设中断服务函数入口地址,把中断服务函数入口地址赋函数指针PISR_UARTn,注意,接收中断服务函数入口地址和发送中断服务函数入口地址是一个,在中断服务函数中根据UTRSTATn[1]和UTRSTATn[0]状态决定是发送中断还是接收中断。•通信控制字(rUCON0)设定,如时钟选ULK做波特率22• 打开总中断屏蔽和子中断屏蔽等待中断:rINTMSK=~(BIT_UART0);rINTSUBMSK=~(BIT_SUB_TXD0);• 进入中断后,先屏蔽发送和接收中断,防止新来中断干扰我们的正常发送和接收,正常发送和接收结束后,清中断挂起和中断源挂起寄存器:ClearPending(BIT_UART0),rSUBSRCPND=(BIT_SUB_TXD0(发送),rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0)(接收);• 取消中断屏蔽,等下一次中断。6.3.2通信程序编写示例下面给出的几个函数,是查询方式URAT通信常用到的主要函数,包括URAT初始化,字符的发送、接收函数,希望大家仔细阅读,理解每一行的含义。• 打开总中断屏蔽和子中断屏蔽等待中断:231,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>1,UART通信,采用查询方式:24//函数声明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,输入波特率//-----------------------------------------------------------------//函数声明25staticintwhichUart=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,AFCdisablestaticintwhichUart=0;26//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

//UART027//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;}//UART128//------------------------------------------------------------------------//等待发送移位寄存器空//------------------------------------------------------------------------voidUart_TxEmpty(intch){if(ch==0)while(!(rUTRSTAT0&0x4));//Waituntiltxshifterisempty.elseif(ch==1)while(!(rUTRSTAT1&0x4));//Waituntiltxshifterisempty.elseif(ch==2)while(!(rUTRSTAT2&0x4));//Waituntiltxshifterisempty.}//----------------------------29//-----------------------------------------------------------------------------//接收串口一字节数据,注意RdURXH0(),RdURXH1(),RdURXH2()的使用//-----------------------------------------------------------------------------charUart_Getch(void){if(whichUart==0){while(!(rUTRSTAT0&0x1));//ReceivedatareadyreturnRdURXH0();}elseif(whichUart==1){while(!(rUTRSTAT1&0x1));//ReceivedatareadyreturnRdURXH1();}//----------------------------30elseif(whichUart==2){while(!(rUTRSTAT2&0x1));//ReceivedatareadyreturnRdURXH2();}elsereturn0;}//-------------------------------------------------------------------------------//得到串口的键值//-------------------------------------------------------------------------------charUart_GetKey(void){if(whichUart==0){if(rUTRSTAT0&0x1)//ReceivedatareadyreturnRdURXH0();elsereturn0;}elseif(whichUart==2)31elseif(whichUart==1){if(rUTRSTAT1&0x1)//ReceivedatareadyreturnRdURXH1();elsereturn0;}

elseif(whichUart==2){if(rUTRSTAT2&0x1)//ReceivedatareadyreturnRdURXH2();elsereturn0;}elsereturn0;}elseif(whichUart==1)32//-----------------------------------------------------------------------------//串口得到字符串//-----------------------------------------------------------------------------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--;}}//----------------------------33else{*string++=c;Uart_SendByte(c);}}*string='\0';Uart_SendByte('\n');}else34//---------------------------------------------------------------------//得到串口初始号//---------------------------------------------------------------------intUart_GetIntNum(void){charstr[30];char*string=str;intbase=10;intminus=0;intresult=0;intlastIndex;inti;Uart_GetString(string);//----------------------------35if(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[0]=='-')36if(string[lastIndex]=='h'||string[lastIndex]=='H'){base=16;string[lastIndex]=0;lastIndex--;}if(base==10){result=atoi(string);result=minus?(-1*result):result;}if(string[lastIndex]=='h'||s37else{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;}else38elseresult=(result<<4)+string[i]-'0';}result=minus?(-1*result):result;}returnresult;}//-----------------------------------------------------------------------------//串口发送字节//-----------------------------------------------------------------------------voidUart_SendByte(intdata){if(whichUart==0)

else39{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')

{40{while(!(rUTRSTAT1&0x2));Delay(10);//becausetheslowresponseofhyper_terminalrUTXH1='\r';}while(!(rUTRSTAT1&0x2));//WaituntilTHRisempty.Delay(10);rUTXH1=data;}elseif(whichUart==2){if(data=='\n')

{41{while(!(rUTRSTAT2&0x2));Delay(10);//becausetheslowresponseofhyper_terminalrUTXH2='\r';}while(!(rUTRSTAT2&0x2));//WaituntilTHRisempty.Delay(10);rUTXH2=data;}}{42//-----------------------------------------------------------------------------//串口发送字符串//-----------------------------------------------------------------------------voidUart_SendString(char*pt){while(*pt)Uart_SendByte(*pt++);}2,UART0中断方式发送和接收//-----------------------------------------------------------------------------//UART0中断方式发送和接收//-----------------------------------------------------------------------------//----------------------------43voidTest_Uart0_Int(void){Uart_Port_Set();Uart_Select(0);/*UART0Txtestwithinterrupt*/isTxInt=1;uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART0Txinterrupttestisgood!!!!\r\n";Uart_Printf("[Uartchannel0TxInterruptTest]\n");voidTest_Uart0_Int(void)44pISR_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);pISR_UART0=(unsigned)Uart0_TxI45/*UART0Rxtestwithinterrupt*/isRxInt=1;uart0RxStr=(char*)UARTBUFFER;Uart_Printf("\n[Uartchannel0RxInterruptTest]:\n");Uart_Printf("AftertypingENTERkey,youwillseethecharacterswhichwastypedbyyou.");/*UART0Rxtestwithinterrup46Uart_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);Uart_Printf("\nToquit,press47rSUBSRCPND=(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发送和接收用到的I/O口保存和初始化//--------------------------------------------------------------------------rSUBSRCPND=(BIT_SUB_TXD0|BIT_S48voidUart_Port_Set(void){//PushUARTGPIOportconfigurationsave_rGPHCON=rGPHCON;save_rGPHDAT=rGPHDAT;save_rGPHUP=rGPHUP;

//ConfigureUARTportrGPHCON&=0x3c0000;rGPHCON|=0x2faaa; //nRTS1,nCTS1rGPHUP|=0x1ff; //Uartportpull-updisable//rINTSUBMSK=0x7ff;//SUBINTALLMASK//PushUartcontrolregistersvoidUart_Port_Set(void)49save_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}save_ULCON0=rULCON0; 50//-----------------------------------------------------------------------------//UART发送和接收结束,用到的I/O口恢复原来状态//-----------------------------------------------------------------------------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; //----------------------------51rUFCON1=save_UFCON1; rUMCON1=save_UMCON1;rULCON2=save_ULCON2; rUCON2=save_UCON2; rUFCON2=save_UFCON2; rUMCON2=save_UMCON2; }//-------------------------------------------------------------------//UART发送和接收使用UCLK,并计算rUBRDIV0和设定波特率//-------------------------------------------------------------------rUFCON1=save_UFCON1; 52voidUart_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"); }voidUart_Uclk_En(intch,intb53elseif(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}elseif(ch==1){54//----------------------------------------------------------------------------//UART发送和接收使用PCLK,并计算rUBRDIV0和设定波特率//----------------------------------------------------------------------------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"); }//----------------------------55elseif(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}elseif(ch==1){56//-----------------------------------------------------------------------------//UART0发送中断服务程序//-----------------------------------------------------------------------------void__irqUart0_TxInt(void){rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); //Justforthesafetyif(*uart0TxStr!='\0'){WrUTXH0(*uart0TxStr++); ClearPending(BIT_UART0); //Clearmasterpending rSUBSRCPND=(BIT_SUB_TXD0); //ClearSubintpending rINTSUBMSK&=~(BIT_SUB_TXD0); //Unmasksubint}//----------------------------57else{ isTxInt=0; ClearPending(BIT_UART0); //ClearmasterpendingrSUBSRCPND=(BIT_SUB_TXD0); //ClearSubintpendingrINTMSK|=(BIT_UART0);}}//-----------------------------------------------------------------------------//UART0接收和接收错误中断服务程序//-----------------------------------------------------------------------------else58void__irqUart0_RxIntOrErr(void){rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);if(rSUBSRCPND&BIT_SUB_RXD0)__sub_Uart0_RxInt();else__sub_Uart0_RxErrInt();ClearPending(BIT_UART0);rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0); //ClearSubintpendingrINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_ERR0);}void__irqUart0_RxIntOrErr(vo59//----------------------------------------------------------------------------//UART0接收子程序//----------------------------------------------------------------------------void__sub_Uart0_RxInt(void){if(RdURXH0()!='\r'){ Uart_Printf("%c",RdURXH0()); *uart0RxStr++=(char)RdURXH0();}else{ isRxInt=0; *uart0RxStr='\0'; Uart_Printf("\n");}}//----------------------------60//-------------------------------------------------------------------------------//UART0接收错误子程序//-------------------------------------------------------------------------------void__sub_Uart0_RxErrInt(void){switch(rUERSTAT0)//toclearandcheckthestatusofregisterbits{ case'1': Uart_Printf("Overrunerror\n"); break; case'2': Uart_Printf("Parityerror\n"); break;

//----------------------------61case'4': Uart_Printf("Frameerror\n"); break; case'8': Uart_Printf("Breakedetect\n"); break; default: break;}}case'4':62第六章习题与练习1,了解并熟悉UART的概念及工作原理。2,控制寄存器ULCONn、UCONn的作用,各bit位的定义。3,如何产生UART通信波特率?4,如何选用ULK还是PLK做UART通信时钟?5,发送寄存器UTXH和接收寄存器URXH的作用,如何使用?6,采用中断方式UART通信程序编制需几个步骤?7,采用查询方式UART通信程序编制需几个步骤?8,中断方式UART通信,如何在中断服务程序中区分是接收中断还是发送中断?9,如何设置某串口做红外方式发送接收?10,红外方式发送接收,红外波段内的近红外线,波长在什么范围之间?第六章习题与练习63第六章S3C2410的串口UART及编程

6.1S3C2410的串口UART概述6.1.1S3C2410异步串行通信(UART)单元S3C2410UART单元提供3个独立的异步串行通信接口,皆可工作于查询、中断和DMA模式。使用系统时钟最高波特率达230.4kb/s,如果使用外部设备提供的时钟,可以达到更高的速率。每一个UART单元包含一个16字节的FIFO(FirstInputFirstOutput,先进先出移位寄存器),用于数据的接收和发送。S3C2410UART支持可编程波特率、红外发送/接收(UART2)、1个或2个停止位、5位/6位/7位/8位数据宽度和奇偶校验。第六章S3C2410的串口UART及编程

6.1S3C646.1.2波特率的产生波特率由一个专用的UART波特率分频寄存器(UBRDIVn)控制,UBRDIVn值计算公如下:UBRDIVn=(int)[ULK/(波特率×16)]-1或者UBRDIVn=(int)[PLK/(波特率×16)]-1式中:时钟选用ULK还是PLK由UART控制寄存器UCONn[10]的状态决定。如果UCONn[10]=0,则用PLK作为波特率发生器的时钟源频率;否则选用ULK作为波特率发生器的时钟源频率。UBRDIVn的值必须在1~(216-1)之间。例如:若ULK或者PLK等于40MHz,当波特率为115200b/s时,则UBRDIVn=(int)[40000000/(115200×16)]一1=int(21.7)-1=21-1=206.1.2波特率的产生656.1.3UART通信操作下面简略介绍UART操作,关于数据发送、数据接收、中断产生、波特率产生、查询检测模式、红外模式的详细介绍,参见下面6.3节。发送数据帧是可编程的。一个数据帧包含1个起始位、5~8个数据位、1个可选的奇偶校验位和1~2位停止位,停止位通过行控制寄存器ULCONn配置。与发送数据帧类似,接收数据帧也是可编程的。接收帧由1个起始位、5~8个数据位、l个可选的奇偶校验位以及1~2位行控制寄存器ULCONn中设定的停止位组成。接收器还可以检测溢出错、奇偶校验错、帧错误和传输中断,每一个错误均可以设置一个错误标志。6.1.3UART通信操作66•溢出错误(overrunerror):指已接收到的数据在读取之前被新接收的数据覆盖;•奇偶校验错:指接收器检测到的校验和与设置的不符;•帧错误:指没有接收到有效的停止位;•传输中断:表示接收数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论