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

发布者:星际穿越最新更新时间:2016-09-06 来源: eefocus关键字: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
#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  中断接收 引用地址:ARM7学习---LPC2103 UART0中断接收

上一篇:ARM7学习---LPC2103 Time0定时器练习
下一篇:ARM7学习---按键测试程序(LPC2103 IO0PIN)

推荐阅读最新更新时间:2024-03-16 15:08

IAR For AVR 串口中断接收
应用芯片: AT Mega16 晶振: 7.3728MHz 代码文件: uart_int.c |_________DELAY.H ############################################## DELAY.H : #ifndef __IAR_DELAY_H #define __IAR_DELAY_H #include intrinsics.h #define XTAL 7.3728 //可定义为你所用的晶振频率(单位Mhz) #define delay_us(x) __delay_cycles ( (unsigned long
[单片机]
S3C2440——使用URAT0中断方式发送和接收字符串
设置中断向量表 ;文件ASM_Interrupt.s ;(1)设置中断向量表 Mode_USR EQU 0x50 ;IRQ中断开放,FIQ中断关闭 Mode_FIQ EQU 0xD1 ;关闭IRQ、FIQ中断 Mode_IRQ EQU 0xD2 ;关闭IRQ、FIQ中断 Mode_SVC EQU 0xD3 ;关闭IRQ、FIQ中断 GET 2440Reg_addr.inc AREA MyCode, CODE,READONLY IMPORT Uart_Init IMPORT INT_UART0 ENTRY ;设置中断向量表 B
[单片机]
STM32F429串口IDLE中断+DMA接收串口数据
#define Rec_GPS_DATA_Unfinish 0; #define Rec_GPS_DATA_Finish 1; extern unsigned char GPS_DATA ; extern unsigned char Rec_GPS_DATA_Flag; int main(void)//主函数 { SysTick_Init(); NVIC_Configuration(); Debug_USART_Config(); macUART4_Config(); DMA_Config(); while(1) { if(Rec_GPS_DATA_Flag) {
[单片机]
LPC2131 UART0 操作流程
1、操作流程: 2、初始化 # define UART_BPS 115200 //串口通信波特率 void UART_Init(void) { uint16 Fdiv; PINSEL0 = 0x00000005; //UARTO的TxD0,RxD0对应P0.0,P0.1,将这两个引脚设置为UART功能 U0LCR =0x83; //设置格式,8位字符,并使能访问除数锁存器,DLAB=1 Fdiv= (Fpclk/16)/UART_BPS; //设置波特率 U0DLM = Fdiv/256; U0DLL = Fdiv%256
[单片机]
LPC2131 <font color='red'>UART0</font> 操作流程
关于STM32串口调试RS485时自动进入接收中断
先说一下软硬件: 硬件:主控stm32c8t6、485芯片为隔离型芯片ADM2483,调试工具是usb转485接到PC端。 软件:采用库函数开发,开发工具为IAR 7.10,485接的是stm32的串口1(收发都是用中断方式),半双工模式, 协议是MODBUS RTU。 先说明本人是菜鸟,在不断得学习中,欢迎指出错误。 最近在调试RS485时发现一个问题,如果在串口初始化时就使能了发送中断和接收的话,那么在发送一个字节后就会自动进入接收中断。可能是收发的机制没有定好,所以后面采用的方式是在初始化时使能了接收中断,关闭发送中断,在需要发送数据的时候再开启发送中断,发送的时候关闭接收中断,发送完一帧再使能接收中断。这样就可以完整地发送
[单片机]
LPC2103之外部中断寄存器
External interrupt inputs Page18 LPC2101/02/03最多包含了三个外部中断输入作为可选择的管脚功能。管脚进行组合后,外部事件可以处理成三个独立的中断信号。外部中断输入能够可选择的用于将处理器从低功耗模式下唤醒。 此外,10个捕获输入没有可选择的将器件从低功耗模式唤醒功能,但也能够被用于外部中断。 Register description 有四个寄存器涉及外部中断 寄存器 描述 访问 复位值 地址 EXTINT 外部中断标志寄存器,包括中断标志位EINT0,EINT1,EINT2,EINT3 R/W 0 0xE01
[单片机]
USART模块接收中断的问题处理
问题描述: 在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下: void uart_config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate); USART_InitStructure.USART_WordLength =
[单片机]
USART模块<font color='red'>接收</font><font color='red'>中断</font>的问题处理
ADS_LPC2103开发板I2C测试试验
#include config.h //相关头文件 #define C02MasterAddr 0xa0//C02的器件地址 #define C02SlaveAddr 0 //读写数据的起始地址 #define LED (1 19)//LED IO口号 #define LED2 (1 20) #define AA (1 2)//I2CONSET的各位定义 #define SI (1 3) #define STO (1 4) #define STA (1 5) #define I2EN (1 6) #define WRMode 0 //写模式 #define RDMode 1 //读模式 #def
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved