您的位置 首页 编程

ARM7学习—LPC2103 UART0中止接纳

花了差不多一天的时间在研究LPC2103的串口中断接收程序,终于搞定了,从昨天晚上一直在看资料和调试,到今天中午又好好的研究了下,终于把…

花了差不多一天的时刻在研讨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
#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;ifor(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 == \0 ) 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);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/267184.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部