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

📄 main.c.bak

📁 汽车仪表板开发
💻 BAK
字号:
//====LPC2132 串口演示==========================================================
/*
  同样是"基于硬件FIFO和缓冲队列的"串口收发演示,EASYARM2132调试通过
  如有调不通的,请发Email给wsg@bbn.cn, 请提宝贵意见相互交流.    
                                                        一个ARM初学者  
*/
//====加载包含文件==============================================================
#include <stdio.h>
#include <string.h>
#include "config.h"

//====常量定义==================================================================
#define BTL0  115200                //串口0波特率

#define U0_RBL  2048                //串口0接收缓冲长度  
#define U0_WBL  2048                //串口0发送缓冲长度  


//====全局变量定义==============================================================
//--串口0缓冲队列
uint8  U0_RBuf[U0_RBL];             //串口0接收缓冲区
uint16 U0_RPw=0,U0_RPr=0;           //串口0接收存、取指针
uint8  U0_WBuf[U0_WBL];             //串口0发送缓冲区
uint16 U0_WPw=0,U0_WPr=0;           //串口0发送存、取指针
uint8  U0_WS=1;                     //串口0发送空标志,1=可直接发送


//====中断函数实现代码==========================================================
//--串口0 收发中断
void __irq IRQ_UART0 (void)
{
    uint8  IIR,xc;
    uint16 w;
    while (((IIR=U0IIR)&0x01)==0)
    {
      switch (IIR & 0x0e)
      {
        case 0x02:             // 发送中断
         for (xc=0; xc<15; xc++)  //一次最多可发15字符
         {
          if (U0_WPw==U0_WPr) 
           {
            U0_WS=1; //中断发送缓冲已空
            break;
           }
           else  
           {
            U0THR=U0_WBuf[U0_WPr++];
            if (U0_WPr>=U0_WBL) U0_WPr=0; 
           }
         }
        break;
        
        case 0x04:             // 接收中断
        case 0x0c:
         xc=U0RBR;
         w=U0_RPw;
         U0_RPw++; if (U0_RPw>=U0_RBL) U0_RPw=0;
         if (U0_RPw==U0_RPr) U0_RPw=w;    //接收缓冲区满
           else  U0_RBuf[w]=xc;
        break;
        
        case 0x06:             // 线状态中断
         xc=U0LSR;             // 清除出错中断
         xc=U0RBR;             // 读出出错字符并放弃 
        break;
        
        default:
        break;
      }
    }
	VICVectAddr = 0x00;			// 通知VIC中断处理结束							
}


//====以下,目标板用户初始化子程序================================================
void TargetInit(void)
{
   uint32	x;
 //--目标板管脚连接 (根据应用不同也许需要改动)
   PINSEL0 = 0x30E5D555;
   PINSEL1 = 0x15580000; 
 //--初始化串口0
   U0LCR = 0x80;                    // DLAB位置1
   #if ((((Fpclk>>4)*10)/BTL0)%10) <= 5
    x = (Fpclk>>4)/BTL0;
   #else
    x = ((Fpclk>>4)/BTL0)+1;
   #endif       
   U0DLM = x>>8;
   U0DLL = x&0xff;
   U0LCR = 0x03;                    // 00001011 8位数据位,1位停止位
   U0FCR = 0x07;
   U0IER = 0x07;
 //--设置VIC,初始化中断入口
   VICIntSelect = 0x00;		            //所有通道设置为IRQ中断
   VICVectCntl1 = (0x20 | 0x06);		//设置串口0中断在通道1
   VICVectAddr1 = (uint32)IRQ_UART0;	//设置通道1中断服务程序地址
   VICIntEnable = (1<<0x06);            //使能上述中断
 //--允许IRQ中断
   IRQEnable();
}
//===通用子程序代码=================================================================
// 挂接printf函数用
int	fputc( int c, FILE *f )
{
   uint16 w;
    
   if (U0_WS==1)
   {
     U0THR = (uint32)c;
     U0_WS=0;
     return ((uint32)c);
   } else
   {
     w=U0_WPw;
     U0_WPw++;
     if (U0_WPw>=U0_WBL) U0_WPw=0;
     if (U0_WPw==U0_WPr)    //缓冲区满
     { 
       U0_WPw=w;
       return(-1);
     } else
     {
       U0_WBuf[w]=c;
       return((uint32)c);
     }
   }
}

//====以下,演示主程序===================================================
int main (void)
 {
   uint8  myBUF[2048];
   uint16 myP=2046;
   uint8  x;
   uint8  *p;
   
   printf("\r\n俗话说:\r\n能把简单事情搞复杂的是教授");
   printf("\r\n能把复杂事情搞简单的是农民");
   printf("\r\n言归正转,演示开始:《倒背如流》");
   printf("\r\n村夫玩耍的规则是:");
   printf("\r\n你送出一串西文字符以0x0d结束,看谁给你倒着送回来的快");
   
   while(1)
   {
    while (U0_RPw!=U0_RPr) //接收缓冲队列有字符
    { 
      x=U0_RBuf[U0_RPr++]; if (U0_RPr>=U0_RBL) U0_RPr=0; //取一个字符
      myBUF[myP--]=x;
      if (x==0x0d)
      {
        myBUF[2047]=0; p=&myBUF[myP+1];
        printf("%s",p);
        myP=2046;
      }
    }
   }
    return 0;
 }

//====程序结束=================================================================

⌨️ 快捷键说明

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