ARM7学习---LPC2103 UART0中断接收

来源:本站
导读:目前正在解读《ARM7学习---LPC2103 UART0中断接收》的相关信息,《ARM7学习---LPC2103 UART0中断接收》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《ARM7学习---LPC2103 UART0中断接收》的详细说明。

ARM7学习---LPC2103 UART0中断接收

花了差不多一天的时间在研究LPC2103的串口中断接收程序,终于搞定了,从昨天晚上一直在看资料和调试,到今天中午又好好的研究了下,终于把串口中断接收程序搞定了。哈哈!比较高兴!现在把调试成功的程序记录下来,以作以后学习的参考。接下来可以继续移植我的GPS串口接收程序了。我是在Keil for ARM编译环境中调试的,具体程序如下:

/**************ARM7(LPC2103)练习程序**************************/

/************************************************************************/

/*****File Function : UART0中断接收测试程序 *****/

/*****Program Author : ZhengWen(ClimberWin) *****/

/*****MCU : LPC2103F 外部11.0592M晶振 ****/

/*****Compile Date : 2010/02/12 *****/

/*****Edition Info : V1.0*****/

/********************************************************************/

//编译环境 KEIL for ARM

//功能:串口波特率9600 能够中断接收串口数据,并且加1后通过串口返回数据。

#include <LPC21xx.H>

#define uchar unsigned char

#define uint unsigned int

#define baudrate 9600 //设置波特率

#define PE (U0LSR&0x40)//定义串口数据发送忙碌与否,PE=1忙碌;PE=0;不忙绿

#define Fosc(11059200)//晶振频率,10MHz~25MHz,应当与实际一至

#define Fcclk(Fosc * 6) //66.3552 系统频率,必须为Fosc的整数倍(1~32),且<=70MHZ

#define Fcco(Fcclk * 4) //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz

#define Fpclk(Fcclk / 4) * 1 //016.5888,VPB时钟频率,只能为(Fcclk / 4)的1 ~ 4倍

void UART0_INT(void); //串口初始化

void UART0_SendByte(unsigned char data); //串口发送字节

void UART0_SendStr(unsigned char const *str);//串口发送字符串

void __irq UART0_IRQ(void); //串口中断接收程序

void PLL_Init(void); //系统时钟配置程序

void delayms();

void delayms(unsigned int count)

{

unsigned int i,j;

for(i=0;i<count;i++)

for(j=0;j<120;j++);

}

void PLL_Init(void)

{

/* 设置系统各部分时钟 */

PLLCON = 1;

#if ((Fcclk / 4) / Fpclk) == 1

VPBDIV = 0;

#endif

#if ((Fcclk / 4) / Fpclk) == 2

VPBDIV = 2;

#endif

#if ((Fcclk / 4) / Fpclk) == 4

VPBDIV = 1;

#endif

#if (Fcco / Fcclk) == 2

PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);

#endif

#if (Fcco / Fcclk) == 4

PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);

#endif

#if (Fcco / Fcclk) == 8

PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);

#endif

#if (Fcco / Fcclk) == 16

PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);

#endif

PLLFEED = 0xaa;

PLLFEED = 0x55;

while((PLLSTAT & (1 << 10)) == 0);

PLLCON = 3;

PLLFEED = 0xaa;

PLLFEED = 0x55;

}

/***********串口0初始化**********************/

void UART0_INT(void)

{ unsigned int U0DL;

PINSEL0 |= 0x00000005; //设置I/O连接到UART0

PINSEL1 |= 0x00000000;

U0IER=0x00000001; //使能UART0接收中断

U0LCR = 0x83; // DLAB = 1,可设置波特率;无奇偶校验 1位停止位 8位数据长度。

U0DL = (Fpclk/16)/baudrate;

U0DLM= U0DL/256; //高8位

U0DLL = U0DL%256; //低8位

U0LCR = 0x03; // DLAB = 0,设置好波特率;无奇偶校验 1位停止位 8位数据长度。

VICIntSelect=0x00; //中断选择为 IQR 模式

VICVectCntl5=(VICVectCntl5&0xffffffc0)|0x26;

VICVectAddr5=(unsigned int)UART0_IRQ;//选择中断入口地址的程序

VICIntEnClr=1<<6; //UART0中断不使能

}

/***********串口发送字节**********************/

void UART0_SendByte(unsigned char data)

{

U0THR = data; //发送数据

while( PE==0 ); //等待数据发送完毕 PE=1忙碌;PE=0;不忙绿

}

/***********串口发送字符串**********************/

void UART0_SendStr(unsigned char const *str)

{ while(1)

{ if( *str == '' ) break;

UART0_SendByte(*str++); //发送数据

}

}

/*************查询法串口接收字符********************/

unsigned char UART0_GetChar(void)

{

while (!(U0LSR & 0x01));

return (U0RBR);

}

/***********UART0中断接收程序***********/

void __irq UART0_IRQ(void)

{

if((U0IIR&0x0e)==0x04) //判断进入的是否为UART0接收中断

{

while (!(U0LSR & 0x01));//等待数据接收完毕

U0THR=U0RBR+1; //将接收到的串口数据+1后再传给串口

while( PE==0 ); //等待数据发送完毕 PE=1忙碌;PE=0;不忙绿

}

else

{;}

VICVectAddr=0x00; //向量地址寄存器,IRQ中断发生时,IRQ服务程序跳转到该寄存器读出的值,结束后置零

}

int main(void)

{

delayms(50000);

PLL_Init();//系统时钟配置,必须设置

UART0_INT(); //串口初始化

delayms(60000);

UART0_SendStr("LPC2103 UART0_IRQ Test"); //向串口发送字符串

VICIntEnable=1<<6; //UART0中断使能

while(1);

}

————————————————转自小文电子设计

Electronic Design By ClimberWin

提醒:《ARM7学习---LPC2103 UART0中断接收》最后刷新时间 2024-03-14 01:13:31,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《ARM7学习---LPC2103 UART0中断接收》该内容的真实性请自行鉴别。