LPC1768之串口UART0

串口操作,首先是功率,时钟控制打开。

然后是管脚选择,设置为串口模式。

然后设定串口传输数据格式。

波特率设置,(主意有小数位和没小数位时候不一样,有小数位需要设置DIVADDL和MULVAL)。

然后锁存波特率。

设定控制UARTn RX和TX FIFO的操作。

最后打开系统中UART0的中断,使能接收中断。

详见代码,代码中有详细注释。

/*************************************************************************************	  
*	main.c:  the main file 
*	NXP --> LPC1768
*
*   
*	Author	:	light					
*	Date	:	2012-4-17  
*
***************************************************************************************/

#include<LPC17XX.h>


#define FOSC                        12000000                            /*  振荡器频率                  */

#define FCCLK                      (FOSC  * 8)                          /*  主时钟频率<=100Mhz          */
                                                                        /*  FOSC的整数倍                */
#define FCCO                       (FCCLK * 3)                          /*  PLL频率(275Mhz~550Mhz)      */
                                                                        /*  与FCCLK相同,或是其的偶数倍 */
#define FPCLK                      (FCCLK / 4)                          /*  外设时钟频率,FCCLK的1/2、1/4*/
                                                                        /*  或与FCCLK相同               */

int Uart0RecvBuf;	  				// UART0 RX DATA
/********************************************************************************
** Descriptions			:Uart0 Initial
**
** parameters			:baud rate 
** Returned value		:None
*********************************************************************************/
void Uart0Init(uint32_t bps) 
{
	LPC_SC->PCONP |= (1<<3);				//打开UART0功率、时钟控制位

	LPC_PINCON->PINSEL0 = 0X00000050;		//P0.2 P0.3设置为串口

	LPC_UART0->LCR = 0x83;					//设置串口数据格式,8位字符长度,1个停止位,无校验,
											//使能访问除数锁存器 ,设定波特率
	LPC_UART0->DLM = ((FPCLK/16)/bps) / 256;	//除数高八位  , 没有小数情况
	LPC_UART0->DLL = ((FPCLK/16)/bps) % 256; 	//除数第八位

	LPC_UART0->LCR = 0x03;	  				//禁止访问除数锁存器,锁定波特率

	LPC_UART0->FCR  = 0x07; 				//控制UARTn RX和TX FIFO的操作。接收数据一个字节触发中断

	NVIC_EnableIRQ(UART0_IRQn);              /* enable irq in nvic              */
	LPC_UART0->IER = 0x01;					//使能接收中断
}
/********************************************************************************
** Descriptions			:Uart0 Receive Data
**
** parameters			:None 
** Returned value		:Received Data
*********************************************************************************/
int Uart0RecvByte(void)	  //查询法
{
	//当UnRBR包含未读字符时,UnLSR[0]就会被置位;当UARTn RBR FIFO为空时,UnLSR[0]就会被清零
	//0  -  UnRBR为空
	//1  -  UnRBR包含有效数据
	while(!((LPC_UART0->LSR) & 0x01));		//等待判断LSR[0]是否是1,1时表示RBR中接收到数据		
	
	return(LPC_UART0->RBR);		  			//读取接收数据
}
/********************************************************************************
** Descriptions			:Uart0 Send Data
**
** parameters			:None 
** Returned value		:None
*********************************************************************************/
int Uart0SendByte(int buf)
{
	//当检测到UARTn THR已空时,THRE就会立即被设置。写UnTHR会清零THRE
	//0  -  UnTHR包含有效字符
	//1  -  UnTHR为空
	while(!((LPC_UART0->LSR) & 0x01));		//等待判断LSR[5](即THRE)是否是1,1时表示THR中为空		
	
	LPC_UART0->THR = buf;		  			//发送数据

	return 0;
}
/********************************************************************************
** Descriptions			:Uart0 Interrupt Receive Data
**
** parameters			:None 
** Returned value		:Received Data
*********************************************************************************/
void UART0_IRQHandler(void)
{
	Uart0RecvBuf = LPC_UART0->RBR;		//读取接收数据	

	Uart0SendByte(Uart0RecvBuf);		//发送接收到的数据
}

/*----------------------------------------------------------------------------
  The main Function 
 *----------------------------------------------------------------------------*/
int main(void)
{
	int temp;

	SystemInit();
	Uart0Init(115200);

	while(1)
	{
					
	//	temp = Uart0RecvByte();			//查询接收数据
	//	Uart0SendByte(temp);			//发送数据

	}

}


你可能感兴趣的:(Date,function,File,Parameters)