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

📄 test.c

📁 由keil软件调试的串口中断程序[IRQ中断]
💻 C
字号:
/*********************
*  串口中断测试程序
*  www.mcu123.com
*  LPC214X KIT 
**********************/


#include <LPC214X.H>

/* System configuration: Fosc, Fcclk, Fcco, Fpclk must be defined */
/* Crystal frequence,10MHz~25MHz should be the same as actual status. */
#define Fosc	12000000

/* System frequence,should be (1~32)multiples of Fosc,and should be equal or 
less than 60MHz. */
#define Fcclk	(Fosc * 5)

/* CCO frequence,should be 2/4/8/16 multiples of Fcclk, ranged from 156MHz to 
320MHz. */
#define Fcco	(Fcclk * 4)

/* VPB clock frequence , must be 1/2/4 multiples of (Fcclk / 4). */
#define Fpclk	(Fcclk / 4) * 1


unsigned char rcv_buf[8];             // UART0数据接收缓冲区
unsigned char rcv_new;                // 接收新数据标志


/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/

void IRQ_UART0(void) __irq
{ 
 unsigned int  i;
 //i = 0;
 if( 0x04 == (U0IIR&0x0F) )
 {
  rcv_new = 1;                        // 设置接收到新的数据标志
  // IODIR = SPI_IOCON | LED1CON;
  for(i=0; i<8; i++)
  { 
   rcv_buf[i] = U0RBR;                // 读取FIFO的数据,并清除中断标志
  }
 }
 VICVectAddr = 0x00;                  // 中断处理结束
}               


/****************************************************************************
* 名称:SendByte()
* 功能:向串口发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void SendByte(unsigned char data)
{  
 U0THR = data;                        // 发送数据
 while( (U0LSR & 0x20)==0 );          // 等待数据发送
}


/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机,并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SendBuf(void)
{
 unsigned char  i;
 //i = 0;
 for(i=0; i<8; i++) 
 SendByte(rcv_buf[i]);
 i='\n';
 SendByte(i);
 //while( (U0LSR & 0x20)==0 );        // 等待数据发送
}               
        
                
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
unsigned char UART0_Init(unsigned int baud)
{  
 unsigned long bak;
 /* 参数过滤 */
 /*  if( (0==baud)||(baud>115200) ) return(0);
     if( (set.datab<5)||(set.datab>8) ) return(0);
     if( (0==set.stopb)||(set.stopb>2) ) return(0);
     if( set.parity>4 ) return(0);
 */
 /* 设置串口波特率 */
 U0LCR = 0x80;                        // DLAB位置1
 bak = (Fpclk / 16)/baud;
 U0DLM = bak / 256;
 U0DLL = bak % 256;
 U0LCR = 0x83;                        // 8 bits, no Parity, 1 Stop bit    
   
 U0LCR = 0x03;                        // DLAB = 0                        
// U0FCR = 0x07;		              // Enable and reset TX and RX FIFO. 

/* 设置串口模式 */
/*   bak = set.datab-5;               // 设置字长度
 if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
 if(0!=set.parity) set.parity = set.parity-1;
 bak |= set.parity;                   // 设置奇偶校验
 U0LCR = bak;
*/ 
 return(1);
}

int main(void)
{
	
 //unsigned char  i;   
 //UARTMODE  uart0_set;    

 PINSEL0 = 0x00000005;                // 设置I/O口状态,需要的I/O口连接到UART0
 PINSEL1 = 0x00000000;
 rcv_new = 0;                         // 设置接收标志位

 // uart0_set.datab = 8;              // 8位数据位
 // uart0_set.stopb = 1;              // 1位停止位
 // uart0_set.parity = 0;             // 无奇偶校验
 
 UART0_Init(115200);                  // 初始化串口模式
   
 U0FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
 //U0FCR = 0x00;                      // 关闭FIFO 设置触发为1字节
 U0IER = 0x01;                        // 允许RBR中断,即接收中断
  
 /*  设置中断允许  */
 VICIntSelect = 0x00000000;           // 设置所有通道为IRQ中断:FIQ、向量IRQ和非向量IRQ(优先级别)
 VICVectCntl0 = 0x26;                 // UART0中断通道分配到IRQ slot 0,即优先级最高
 VICVectAddr0 = (int)IRQ_UART0;       // 设置UART0向量地址
 VICIntEnable = 0x00000040;           // 使能UART0中断

 while(1) 
 {  
  if(1==rcv_new)
  { 
   SendBuf();                        // 将接收到的数据发送回主机
   rcv_new = 0;  
  }
 }
 //   return 0;
}


⌨️ 快捷键说明

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