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

📄 uart.c

📁 程序展示了 ucos在EASYARM2200上的移植。并添加了多个设备在UCOS下的驱动UART:SPI:IIC:ZLG7290.当然还没有完全完成板上其它设备的驱动。由于限制
💻 C
字号:
#include "config.h"
#include "hc595.h"
extern OS_MEM   *memUart0Partition;
extern OS_EVENT *uart0RcvMsgQueue;
extern OS_EVENT *uart0Mbox;
extern uint8 rxCount;
/***

***/
uint8  initUart0(uint32 baud, UARTMODE set)
{  
   uint32  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>>4)/baud;
   U0DLM = bak>>8;
   U0DLL = bak&0xff;
   /* 设置串口模式 */
   bak = set.datab-5;                   // 设置字长度
   if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
   if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
   bak |= set.parity<<4;              	// 设置奇偶校验   
   U0LCR = bak;  
   return(1);
}
void  uart0SendBytes(uint8 *buffer)
{  
   INT8U  i;
   for(i=0; i<8; i++)
   U0THR=*(buffer+i);
      while( (U0LSR&0x20)==0 );         	// 等待数据发送
}
void uart0SendByte(uint8 toSend)
{
   U0THR=toSend;
   while((U0LSR&0X40)==0);
}
void uart0SendMultiBytes(uint8 *buffer,uint8 length)
{
   INT8U loop;
   U0FCR=0X00;
   for(loop=0;loop<length;loop++)
      {
         uart0SendByte(*(buffer+loop));
      }
   U0FCR=0X81;
}
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
****************************************************************************/
void   Uart0_Exception(void)
{  
   INT8U i;
	INT8U intSource;
	static INT8U *queuePoint;
	static INT8U *queuePointBack;
	INT8U err;
	INT8U counter=0;
	OS_ENTER_CRITICAL();                                        //以第三种方式进行中断屏蔽
	VICIntEnClr|=1<<INTINDEXUART0;
	intSource=U0IIR&0X0F;
	VICVectAddr = 0x00;	
	switch(intSource)
	{ 
	   case 0x02://THRE 中断
	      {
	         break;
	      }
	   case 0x04:                                            /***RDA FIF0 filled 因为设置的是8字节所以***/
		   {
		      queuePoint=OSMemGet(memUart0Partition,&err);
		      queuePointBack=queuePoint;
			   for(i=0;i<8;i++)
			      {				         
					   *queuePoint++=U0RBR;	                    
				   }
				//OSMboxPost(uart0Mbox,msg);
				OSQPost(uart0RcvMsgQueue,(void *)queuePointBack);
				//U0IER=0X00;
				break;
			}
		case 0x0c:                                           /***CTI***/
		   {
		      queuePoint=OSMemGet(memUart0Partition,&err);
		      queuePointBack=queuePoint;
		      queuePoint++;
			   while(U0LSR&0X01)                             //FIFO中存在有效数据
				   {
					   *queuePoint++=U0RBR;								    
					   counter++;   
				   }
				//OSMboxPost(uart0Mbox,msg);
				*(queuePoint-counter)=counter;
				OSQPost(uart0RcvMsgQueue,(void *)queuePointBack);
				//U0IER=0X00;
				break;
			}
	   case 0X06://RX线状态/错误;系统应该读取UOLSR以复位中断
	      {
	         intSource=U0IIR;
	         intSource=U0LSR;
	         break;
	      }
		default:break;
	}
    
   VICIntEnable|=1<<INTINDEXUART0;
   OS_EXIT_CRITICAL();
}



⌨️ 快捷键说明

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