×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-19 发布时间:
|
花了差不多一天的时间在研究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;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 == '\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); 
}  

关键字:ARM7学习  LPC2103  UART0  中断接收

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址