⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 LPC2132串口初始化例子----------------
💻 C
字号:
/*

                         \\\|///
                       \\  - -  //
                        (  @ @  )
+---------------------oOOo-(_)-oOOo-------------------------+
|                                                           |
|                        PCD5544.c                          |
|                     by Xiaoran Liu                        |
|                        2008.3.16                          |
|                                                           |
|                    ZERO research group                    |
|                        www.the0.net                       |
|                                                           |
|                            Oooo                           |
+----------------------oooO--(   )--------------------------+
                      (   )   ) /
                       \ (   (_/
                        \_)     

*/
// 引入相关芯片的头文件 
#include <stdio.h>
#include <LPC213x.h>
#define uchar unsigned char // 0~255
#define uint unsigned int   // 0~65535
#define ulong unsigned long //

uchar txbuf;

/* System configuration .Fosc、Fcclk、Fcco、Fpclk must be defined */
/* 系统设置, Fosc、Fcclk、Fcco、Fpclk必须定义*/
#define Fosc            12000000                    //Crystal frequence,10MHz~25MHz,should be the same as actual status. 
						    //应当与实际一至晶振频率,10MHz~25MHz,应当与实际一至
#define Fcclk           (Fosc * 4)                  //System frequence,should be (1~32)multiples of Fosc,and should be equal or less  than 60MHz. 
						    //系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ
#define Fcco            (Fcclk * 4)                 //CCO frequence,should be 2、4、8、16 multiples of Fcclk, ranged from 156MHz to 320MHz. 
						    //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz
#define Fpclk           (Fcclk / 4) * 1             //VPB clock frequence , must be 1、2、4 multiples of (Fcclk / 4).
						    //VPB时钟频率,只能为(Fcclk / 4)的1、2、4倍

void  TXDATA(uchar x);

typedef struct UartMode
{
	uchar datab;		// 字长度,5/6/7/8可选
	uchar stopb;		// 停止位,1/2可选
	uchar parity;		// 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;

UARTMODE set={8,1,2};

/*----------------------------------------------------------*\
 | Delay                                                    |
\*----------------------------------------------------------*/
void  Delayus(unsigned int  dly) {
    unsigned int i;

    for (; dly>0; dly--) 
		for (i=0; i<6; i++);
}
void  Delayms(unsigned int  dly) {
    unsigned int  i;

    for (; dly>0; dly--)
        for (i=0; i<7500; i++);
}

//-------------------------------------------------------------------------
//  uart0 Interrupt 
//  串口0中断子程序        
//-------------------------------------------------------------------------
__irq void uart0 (void) 
{
   // TXDATA(0x66);
   if((U0IIR & 0X0F)==0X04)
	{
		txbuf=U0RBR;

	}
	VICVectAddr = 0x00;			// 中断处理结束
}
__irq void uart1 (void) 
{
   // TXDATA(0x66);
   if((U1IIR & 0X0F)==0X04)
	{
		txbuf=U1RBR;

	}
	VICVectAddr = 0x00;			// 中断处理结束
}

/*----------------------------------------------------------*\
 | Realtime Initial                                         |
\*----------------------------------------------------------*/
void  RTCInit(void) {
	PCONP  |= 0x00000200;   
	CCR     = 0x00000002;
	CIIR    = 0x00000000;
	AMR     = 0x000000FF;
	ILR     = 0x00000003;
	//PREINT  = FPCLK / 32768 - 1;
	//PREFRAC = FPCLK - (FPCLK / 32768) * 32768;
	CCR     = 0x00000011;
	}
/*----------------------------------------------------------*\
 | Set current time                                         |
\*----------------------------------------------------------*/
void SetNow(void) {
	CCR   = 0x00000002;
	YEAR  = 2009;
	MONTH = 2;
	DOM   = 26;
	HOUR  = 20;
	MIN   = 13;
	SEC   = 50;
	CCR   = 0x00000011;
	}

	//-------------------------------------------------------------------------
// 定义串口模式设置数据结构 
//-------------------------------------------------------------------------


/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud	波特率
**			  set	模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
uchar Baud0_Set(ulong baud, UARTMODE set)
{				     
	ulong bak;
	
	// 参数过滤 
	if ((baud ==0 ) || (baud > 115200))	return (0);		 
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	// 设置串口波特率 
	U0LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U0DLM = bak >> 8;
	U0DLL = bak & 0xFF;
	
	// 设置串口模式 
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U0LCR = bak;
	
	return (1);
}

//----------------------------------------------------------------
//函数:init_uart0()
//功能:初始化串口0
//----------------------------------------------------------------
void init_uart0(void)
{
	PINSEL0 = PINSEL0 | 0x00000005;		// 设置I/O连接到UART0

	Baud0_Set(9600,set);     	//9600 baud	   此处修改baud

	U0FCR=0X01;                 //使能FIFO,触发点为1个字节
	U0IER=0X01;                 //允许RBR中断,既接收中断

	 VICVectCntl2 = 0x20 | 0x06;				// UART0分配到IRQ slot0,即最高优先级
	 VICVectAddr2 = (unsigned long)uart0;	// 设置UART0向量地址
	 VICIntEnable = 1 << 0x06;				// 使能UART0中断
}


/**********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud	波特率
**			  set	模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
***************************************************************************************************/
uchar Baud1_Set(ulong baud, UARTMODE set)
{				     
	ulong bak;
	
	// 参数过滤 
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	// 设置串口波特率 
	U1LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U1DLM = bak >> 8;
	U1DLL = bak & 0xFF;
	
	// 设置串口模式 
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;		            // 停止奇偶校验
	}
	bak |= set.parity << 4;				// 设置奇偶校验	不校验
	
	U1LCR = bak;
	
	return (1);
}
//----------------------------------------------------------------
//函数:init_uart1()
//功能:初始化串口1
//----------------------------------------------------------------
void init_uart1(void)
{
	PINSEL0 = PINSEL0 | 0x00050000;		// 设置I/O连接到UART0

	Baud1_Set(9600,set);     	//2400 baud		  此处修改baud 

	U1FCR=0X01;                 //使能FIFO,触发点为1个字节
	U1IER=0X01;                 //允许RBR中断,既接收中断

	VICVectCntl3 = 0x20 | 0x07;				// UART0分配到IRQ slot0,即最高优先级
	VICVectAddr3 = (unsigned long)uart1;	// 设置UART0向量地址
	VICIntEnable = 1 << 0x07;				// 使能UART0中断
}

//-------------------------------------------------------------------------------------  
// uart0 发送数据
//-------------------------------------------------------------------------------------
void UART0_SendBuf(unsigned char *str, unsigned int send_size)
{
    unsigned int i;

    for(i=0; i<send_size; i++)		     //for(; *str != '\0'; str++)
    {                            
          U0THR = *str;                  // 发送数据
		str++;
          while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
        
    }
}

void  TXDATA(uchar x)
{
         U0THR = x;
          while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
}

//-------------------------------------------------------------------------------------  
// uart1 发送数据
//-------------------------------------------------------------------------------------
void UART1_SendBuf(unsigned char *str, unsigned int send_size)
{
    unsigned int i;

    for(i=0; i<send_size; i++)		   //for(; *str != '\0'; str++)
    {                            
          U1THR = *str;                    // 发送数据
		str++;
          while ((U1LSR & 0x40) == 0);    // 等待数据发送完毕
        
    }
}
void  sys_init()
{
    PINSEL0 = 0X00000000;
    IO0DIR |= 3;
    IO0CLR |= 3;
    Delayms(500);
    IO0SET |= 3;

    PLLCON = 1;
    VPBDIV = 0;
    PLLCFG = 0x23;

    PLLFEED = 0xaa;
    PLLFEED = 0x55;
    while ((PLLSTAT & (1 << 10)) == 0);
    PLLCON = 3;
    PLLFEED = 0xaa;
    PLLFEED = 0x55;

}

int main() 
{
    // uchar sj_s;

    sys_init();
    init_uart0();
    RTCInit();
    SetNow();
    //IO0DIR |= 1;
    txbuf=0x77;
    while (1)
    {
        //  IO0CLR |=1;
        TXDATA(txbuf);
        Delayms(500);
        // IO0SET |=1;
        //  Delayms(500);

        /*         if (sj_s!=SEC)
                {
                    sj_s=SEC;
                    IO0CLR |=1;
                    Delayus(500000);
                    IO0SET |=1;
                } */
    }

}

⌨️ 快捷键说明

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