uart0.c

来自「LPC2129实现从SPI通讯和两个串口定时器中断」· C语言 代码 · 共 235 行

C
235
字号
#include "uart0.h"
#include "InitDev.h"
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//#include <ctype.h>	 

#define MAX_TBUF1	100
char tbuf1[MAX_TBUF1]= {0, };


/****************************************************************************
* 名称:UART0_Init()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
***************************************************************************/
void  UART0_Init(int bps)
{  
   uint16 Fdiv;
   U0LCR = 0x83;		            // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16) / bps;  // 设置波特率
   U0DLM = Fdiv / 256;							
   U0DLL = Fdiv % 256;						
   U0LCR = 0x03;

	PINSEL0=(PINSEL0&0xfffffff0)|0x00000005;


	U0FCR = 0x01;                       // 使能FIFO,并设置触发点为1字节
	U0FCR = 0x07;                       // 使能FIFO,并设置触发点为1字节
	U0IER = 0x01;                       // 允许RBR中断,即接收中断

	uart0_irq_set(); //中断设置 IRQ0

	uart0_selbit_init();

	clr_uart0_2();
	set_uart0_1();
	
 /* IO0DIR |= UART1CS_A ;
   	IO1DIR |= UART1CS_B;	
   	U1FCR = 0x01;                       // 使能FIFO,并设置触发点为1字节
	U1FCR = 0x07;                       // 使能FIFO,并设置触发点为1字节
	U1IER = 0x00;                       // 允许RBR中断与THR中断,即接收中断
	U1MCR = 0X00;

   PINSEL0=PINSEL0&0xFFF0FFFF|0x00050000;		*/
}

/****************************************************************************
* 名称:uart0_irq_set()
* 功能:串口接收中断设置,中断函数为 
* 入口参数:data		要发送的数据
* 出口参数:无
****************************************************************************/				
void uart0_irq_set()
{
  
  VICIntSelect=VICIntSelect & (~(1<<6));//(0xffffffbf); //VICIntSelect[6]=0 ==irq
  VICVectCntl0=0x20 | 6;	   // UART0中断分配为IRQ 通道0	 ,0x20为使能IRQ通道0
  VICVectAddr0=(uint32)uart0_irq;  //中断函数为uart0_irq
  VICIntEnable=	VICIntEnable | (1<<6);	 //VICIntEnable[6]=1

}

void __irq uart0_irq()		// 对于UART有两种情况可以引发接收中断:接收字节达到接收FIFO的处发点(RDA)和接收超时(CTI)
{
unsigned char receiv;

 switch(U0IIR & 0x0F)
 {
   case 0x04:
      receiv=U0RBR;
	  UART0_SendByte(receiv);
	  break;
   default:
      break;
 }

 VICVectAddr=0x0;

}

void uart0_selbit_init()
{
 	IO1DIR |=CH1;
	IO1DIR |=CH2;
}
void set_uart0_1()
{
   IO1SET |=CH1;
}

void set_uart0_2()
{
   IO1SET |=CH2;
}

void clr_uart0_1()
{
   IO1CLR |=CH1;
}

void clr_uart0_2()
{
   IO1CLR |=CH2;
}
/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data		要发送的数据
* 出口参数:无
****************************************************************************/
void  UART0_SendByte(uint8 data)
{  

   U0THR = data;				    // 发送数据
   while( (U0LSR&0x40)==0 );	    // 等待数据发送完毕
}
/****************************************************************************
* 名称:UART0_RcvByte()
* 功能:从串口接受字节数据,使用查询方式
* 入口参数:无		要发送的数据
* 出口参数:返回接受到的数据
****************************************************************************/
uint8  UART0_RcvByte(void)
{  
   uint8 rcv_data;				    // 发送数据
   while( (U0LSR&0x01)==0 );	    // 等待接受数据
   rcv_data=U0RBR;
   return (rcv_data);
}

/****************************************************************************
* 名称:UART0_SendStr()
* 功能:向串口发送一字符串
* 入口参数:srt		要发送的字符串的指针
* 出口参数:无
****************************************************************************/
void  UART0_SendStr(uint8 const *str)
{  
   while(1)
   {  if( *str == '\0' ) break;
      UART0_SendByte(*str++);	    // 发送数据
   }
}

/****************************************************************************
* 名称:UART0_Printf()
* 功能:向串口发送一字符串 用法同Printf()函数
* 入口参数:format	要发送的字符串的指针 ... 为参数
* 出口参数:发送的字符串的字符个数
****************************************************************************/
int UART0_Printf(const char *format, ...)
{
	va_list v_list;
	char *ptr;
	int i= 0;


	va_start(v_list, format);     // Initialize variable arguments. 
	vsprintf(tbuf1, format, v_list ); 
	va_end(v_list);


	ptr= tbuf1;
	while( (*ptr) && i<MAX_TBUF1) {
		UART0_SendByte(*ptr);
		ptr++;	i++;
	}//while

	return i;
}//end
 /*
void SendSpeed1(int TempSpeed)
{
	uint8 i;
	uint8 data[12];

	

	//TempSpeed /=4;		

	if(TempSpeed > 0)
	{
		i = 0;
		while(TempSpeed != 0)
		{
			data[i] = 0x30 + TempSpeed%10;

			i++;

			TempSpeed /= 10;
		}	
	}
	else if(TempSpeed < 0)
	{
		TempSpeed = 0 - TempSpeed;

		i = 0;
		while(TempSpeed != 0)
		{
			data[i] = 0x30 + TempSpeed%10;

			i++;

			TempSpeed /= 10;
		}
		
		data[i] = '-';
		i++;	
	}
	else
	{	
		i = 0;
		data[i] = '0';
		i++;
	}

	U1THR = 'V';
	do
	{
		i--;
		
		U1THR = data[i];				// 发送数据
	}
	while(i>0);

	U1THR = 0x0D;					// 发送数据

}	   */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?