亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? uart0.c

?? 基于ARM7處理器的中斷與串口在ucos下切換的演示程序
?? C
字號:
/* ----------------------------------------------------
   模塊名: Uart0.c:
   描  述: 串口0接口函數  
--------------------------------------------------------*/
#include "config.h"


#define USE_SEMAPHORE_RX   1       /* 打開后不穩定問題解決 */

static OS_EVENT *Uart0TxSem;

#if USE_SEMAPHORE_RX
static OS_EVENT *Uart0RxSem;
#else
volatile uint8   inbufsign;          /* 接收緩沖區非空標志-有=1 */
#endif

uint32 errorcount0[10] = {0,0,0,0,0,0,0,0,0,0};

volatile char  Uart0RxBuf[LenRxBuf0];
volatile int  rxHead0;         /* 收發緩沖區讀寫指針 */
volatile int  rxTail0;
volatile int   nUart0RxLen;

volatile char  Uart0TxBuf[LenTxBuf0]; /* 收發緩沖區實體 */
volatile int  txHead0;         /* 收發緩沖區讀寫指針 */
volatile int  txTail0;
volatile int  nUart0TxLen;	

//OS_STK uart0Stack[64];
extern OS_STK  taskUartStack[];

void uart0RecvTask(void* para );


void UART0_data_transfer(void*);

/*------------------------------------------------------------
** 函數名稱: UART0_Ini
** 功能描述: 初始化串口0。設置其工作模式及波特率。
** 輸   入: set  模式設置(UARTMODE數據結構)
** 輸   出: 無
** 返    回: 0-成功設置        
------------------------------------------------------------*/
uint8  UART0_Ini(UARTMODE *set)
{  
	uint32  bak;

    VICIntEnClr = 1 << 6; // 禁止uart0中斷
    
    /* 參數過濾 */
    if((0 == set->baudrate)||(set->baudrate > 115200) ) return(0);
    if((set->datab < 5)||(set->datab > 8) ) return(0);
    if((0 == set->stopb)||(set->stopb > 2) ) return(0);
    if( set->parity > 2 ) return(0);

    /* 設置I/O連接到UART0 */
    PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05;

    /* 設置串口波特率 */
    U0LCR = 0x80;                    // DLAB位置1
    bak   = (FPCLK>>4)/set->baudrate;
    U0DLM = bak>>8;
    U0DLL = bak&0xff;
    
    /* 設置串口模式 */
    bak = set->datab - 5;            // 設置字長度
    if(2 == set->stopb) bak |= 0x04; // 判斷是否為2位停止位  
    if(0 != set->parity) 
    {
		if(set->parity == 1)
		{
            bak |= 0x08;             // 設置為奇校驗
		}
		else
		{
			bak |= 0x18;             // 設置為偶校驗
		}
    }
	
    U0LCR = bak;

    //U0FCR = 0x01;                    // 每接收到一個字符就產生一次中斷
    //U0FCR = 0x41;					 // 4 個中斷
	//U0FCR = 0x81;						// 收到8字節產生一次中斷
	U0FCR = 0xc1;						// 收到14字節產生一次中斷
    
    U0IER = 0x03;                    // 允許RBR和THRE中斷,即收發中斷
    
    /* 初始化串口所用到的全局變量 */   
    //inTxBuf=TxBuf;outTxBuf=TxBuf;
    //inRxBuf=RxBuf;outRxBuf=RxBuf;
	nUart0RxLen = 0;
    rxHead0 = 0;
    rxTail0 = 0;

	nUart0TxLen = 0;
    txHead0 = 0;
    txTail0 = 0;
    memset((char *)Uart0TxBuf, 0, sizeof(Uart0TxBuf) );
	
    Uart0TxSem = OSSemCreate(1);     // 信號量用于發送緩沖區滿后等待發送

#if USE_SEMAPHORE_RX
    Uart0RxSem = OSSemCreate(0);     // 信號量用于等待串口接收字符中斷
#else
    inbufsign = 0;
#endif
    
    //VICIntEnable = 1 << 6;           // 允許uart0中斷
    OSTaskCreate( uart0RecvTask, NULL, &taskUartStack[TASK_UART_STK_SIZE-2], TASK_UART_PRIO);
    
    return 0;
}

//
// 向硬件發送一個字節
//
void uart0PhySend(void)
{
	//char c;
	//if(FALSE==uart0_rts_judge())
	//	return;
	
    if( nUart0TxLen )
	{      	
		if( txHead0 == LenTxBuf0)
		{
			txHead0 = 0;
		}
		
		OS_ENTER_CRITICAL();
		if( LSR_TEMT & U0LSR )
		{
			U0THR = Uart0TxBuf[txHead0++] ;
			nUart0TxLen--;
		}
	    OS_EXIT_CRITICAL();	
	}
    
    // 設置UART0的CTS為有效
    
}

//
// 從物理層接收, 調用時記得關中斷
//
void uart0PhyRecv(void)
{
	//int i;
	char c;
	
	//
	// 因為LPC2106的DMA不可能超過16個
	//
	//for( i = 0; i < 16; i++ )
	while(1)
	{
		if( U0LSR & LSR_RDR )	// 有數據
		{
			c = U0RBR;

			OS_ENTER_CRITICAL();
			if( nUart0RxLen < LenRxBuf0 )
			{
				if( rxTail0 >= LenRxBuf0)
				{
					rxTail0 = 0;
				}
				Uart0RxBuf[rxTail0++] = c;
				nUart0RxLen++;
			}
		    OS_EXIT_CRITICAL();	
		}
		else
			break;
	}

	
	
}
/*------------------------------------------------------------
** 函數名稱: Uart0_Exception
** 功能描述: 串口UART0中斷函數。
** 輸   入: 無
** 輸   出: 無
** 返    回: 無  
------------------------------------------------------------*/
void   Uart0_Exception(void)
{
    uint8 Uart0Int;// temp;
    //char tempdata;
    //char state;
    //int  i;
      
    if(((Uart0Int = U0IIR)&0x01) == 0)
    {
        switch(Uart0Int & 0x0e)
        {
            case 0x02:            /* 發送中斷處理 */
            {
                //OSSemPost(Uart0TxSem);
                uart0PhySend();
                errorcount0[0]++;
            }
            break;

            case 0x04:            /* 接收中斷處理 */
            {
				uart0PhyRecv();
				if(nUart0RxLen!=1)
					//OSUntimeout(UART0_data_transfer, NULL);
				//OSTimeout(UART0_data_transfer, NULL, 1);				
                errorcount0[1]++;
            }     
            break;
            
            case 0x06:            /* 串口接收線路狀態錯誤中斷 */
            {
                Uart0Int = U0LSR; /* 一定要進行該操作,用以清除中斷標志,否則串口會死掉! */       
                errorcount0[2]++;
            }
            break;
            
            case 0x0c:            /* 串口字符超時指示(CTI)中斷 */
            {
            	uart0PhyRecv();

				//OSUntimeout(UART0_data_transfer, NULL);
            	UART0_data_transfer((void*)0 );
                errorcount0[3]++;
            }
            break;
            
            default:
                Uart0Int = U0LSR;
                errorcount0[4]++;
            break;
        }
    }
    
    VICVectAddr = 0x00;                          // 中斷處理結束
}               

/*------------------------------------------------------------
** 函數名稱: PutChar
** 功能描述: 從UART0往外發送一字節
** 輸   入: 待發送數據
** 輸   出: 無
** 返    回: 待發送數據 
------------------------------------------------------------*/
char PutChar(char c)
{
	UART0_PutData( &c, 1 );
    return c;
}


/*------------------------------------------------------------
** 函數名稱: UART0_PutData
** 功能描述: 從UART0往外發送一指定長度字符串,
** 輸   入: str 待發送數據
**           len 發送數據長度
** 輸   出: 無
** 返    回: 無 
------------------------------------------------------------*/
int UART0_PutData(char *str, int len)
{
	int i;
	int nTempLen;
	//int nNeedToSend = FALSE;

	if( nUart0TxLen >= LenTxBuf0 )
		return 0;

//	led_data_set(); /* 點燈 */
	
    OS_ENTER_CRITICAL();

	//if( 0 == nUart0TxLen ) 
	//	nNeedToSend = TRUE;
	
	nTempLen = min(len, LenTxBuf0 - nUart0TxLen );
	for( i = 0; i < nTempLen; i++ )
	{
		if( txTail0 == LenTxBuf0 )
			txTail0 = 0;
		Uart0TxBuf[txTail0++] = str[i];
		nUart0TxLen ++;
	}

	//if( nNeedToSend == TRUE )
	//	uart0PhySend();
	
    OS_EXIT_CRITICAL();
    return nTempLen;
}


/*------------------------------------------------------------
** 函數名稱: output
** 功能描述: 從UART0串口發送一字符串
** 輸   入: buf 待發送數據
** 輸   出: 無
** 返    回: 無
------------------------------------------------------------*/
void output(char* buf)
{
	OutString(buf);
}

/*------------------------------------------------------------
** 函數名稱: output
** 功能描述: 從UART0串口發送一字符串
** 輸   入: buf 待發送數據
** 輸   出: 無
** 返    回: 無
------------------------------------------------------------*/
void OutString(char* buf)
{
	UART0_PutData( buf, strlen(buf) );
}

	

/* 修改為用來處理 AT指令的函數 這個處理速度不是很快,可以這樣處理 */
void UART0_data_transfer(void* p)
{	
	OSSemPost(Uart0RxSem);	
}


// 第二個輸入參數暫時沒用
int uart0_read_data(char* buffer, int limit, int timeout)
{	
	int 	templen;
	//UBYTE   err;
	int     i;

	/*if( !nUart0RxLen )
	{
		OSSemPend( Uart0RxSem, timeout, &err);
		if( err != OS_NO_ERR )
			return 0;
	}
	*/
	OS_ENTER_CRITICAL();
	templen = min(limit, nUart0RxLen);
	for( i = 0; i < templen; i++ )
	{
		if( rxHead0 == LenRxBuf0 )
			rxHead0 = 0;
		buffer[i] = Uart0RxBuf[rxHead0++];
		nUart0RxLen--;
	}
	OS_EXIT_CRITICAL();
	
     
	if(templen)
//		led_data_set(); /* 有數據才點燈 */
;
	return templen;	
	
}

//
// 讀取一個字節
// 
char GetChar( int timeout )
{
	char c;
	int  times = 0;
	int  i;

	#if 0
		if( uart0_read_data( &c, 1, timeout ) )
			return c;
		else
			return -1;

	#else
		if(timeout==0)
		{
			while(1)
			{
				if( uart0_read_data( &c, 1, timeout ) )
					return c;
				else
					delay(10);
			}
		}
		else
		{
			times = timeout / 10;
			for( i = 0; i < times; i++ )
			{
				if( uart0_read_data( &c, 1, timeout ) )
					return c;
				else
					delay(10);
			}
		}

		return (char) -1;
	#endif

	
	
}

int rsRead(char * buf, int len, int timeout)
{
	return uart0_read_data( buf, len, timeout);
}

void rsWrite(char * buf, int len)
{
	UART0_PutData( buf, len );
}


//
// UART receive task 
//
void uart0RecvTask(void* para )
{
	while(1)
	{	
		uart0PhyRecv();
		uart0PhySend();
		uart1PhyRecv();
		uart1PhySend();
	}
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品噜噜噜噜久久久久久久久试看| 色婷婷久久久亚洲一区二区三区 | 麻豆精品精品国产自在97香蕉| 欧美日韩高清在线| 天堂成人国产精品一区| 日韩欧美电影一二三| 久久精品国产在热久久| 国产亚洲欧美激情| 色悠悠亚洲一区二区| 午夜精彩视频在线观看不卡| 日韩女同互慰一区二区| 国产69精品久久久久毛片| 亚洲欧美日韩中文播放| 欧美日本在线播放| 国产精品资源站在线| 亚洲成人777| 久久人人97超碰com| 91色porny在线视频| 日本午夜精品一区二区三区电影| 久久色在线观看| 91成人免费在线| 美国av一区二区| 国产精品美女一区二区三区| 欧美日韩精品二区第二页| 国产一区二区精品久久99| 亚洲另类春色校园小说| 日韩精品一区二区在线| 一本大道久久精品懂色aⅴ| 麻豆专区一区二区三区四区五区| 国产欧美日韩在线| 欧美福利一区二区| 成人在线视频一区二区| 日本少妇一区二区| 中文字幕日韩一区二区| 日韩女优制服丝袜电影| 色综合久久综合网97色综合| 国产真实乱子伦精品视频| 一区二区三区欧美视频| 国产欧美精品一区| 欧美一区二区三区人| 91麻豆精品一区二区三区| 精品一区二区三区在线观看国产| 亚洲女人****多毛耸耸8| 26uuu国产在线精品一区二区| 在线视频中文字幕一区二区| 国产91精品入口| 精品一区二区三区蜜桃| 亚洲成a天堂v人片| 亚洲免费视频中文字幕| 国产精品亲子伦对白| 精品国产1区2区3区| 欧美日韩一区不卡| 色欧美片视频在线观看在线视频| 国产精品乡下勾搭老头1| 日本一道高清亚洲日美韩| 一区二区三区欧美在线观看| 中文字幕在线播放不卡一区| 久久蜜桃香蕉精品一区二区三区| 欧美一区二区三区成人| 欧美丝袜第三区| 在线精品视频小说1| 亚洲同性同志一二三专区| 黄色日韩三级电影| 一区二区三区**美女毛片| 欧美精品日韩综合在线| 午夜欧美大尺度福利影院在线看 | 久久成人18免费观看| 久久品道一品道久久精品| 99在线精品一区二区三区| 亚洲成人第一页| 久久亚洲二区三区| 高清成人在线观看| 精品一区二区影视| 麻豆91在线观看| 美女一区二区在线观看| 热久久免费视频| 久久99精品国产| 国产一区二区调教| 国产福利一区在线观看| 国产电影一区二区三区| 粉嫩一区二区三区性色av| 成人免费福利片| 91麻豆精品一区二区三区| 日本韩国欧美一区| 欧美亚洲自拍偷拍| 337p亚洲精品色噜噜狠狠| 制服丝袜国产精品| 欧美精品一区二区高清在线观看| 2021中文字幕一区亚洲| 国产日韩精品一区二区三区| 国产精品久久久久影院亚瑟| 亚洲视频在线一区| 日韩综合一区二区| 国产呦精品一区二区三区网站| 国产乱人伦偷精品视频不卡 | 国产欧美日韩三区| 国产精品国产自产拍高清av王其| 亚洲精品你懂的| 天天av天天翘天天综合网| 麻豆精品一区二区综合av| 国产一区二区三区在线观看精品 | 欧美一区二区三级| 精品国产乱码久久久久久浪潮| 久久精品一区四区| 亚洲免费成人av| 青椒成人免费视频| 北岛玲一区二区三区四区 | 91精品在线麻豆| 精品国产伦一区二区三区观看体验 | 中文字幕在线免费不卡| 亚洲综合区在线| 久久99精品国产.久久久久久| 成人av电影在线网| 欧美一级免费大片| 国产精品久久夜| 丝袜诱惑亚洲看片| 国产乱码精品一区二区三| 在线观看欧美黄色| 国产欧美一区二区三区在线老狼| 亚洲一二三区不卡| 欧美一区午夜精品| 国产精品嫩草影院com| 青青草国产精品97视觉盛宴| www.在线成人| 欧美xxxxxxxxx| 亚洲伊人色欲综合网| 国产精品中文字幕一区二区三区| 色999日韩国产欧美一区二区| 久久综合色播五月| 亚洲韩国一区二区三区| 国产激情精品久久久第一区二区 | 亚洲乱码一区二区三区在线观看| 蜜桃av一区二区在线观看| 91丝袜高跟美女视频| 久久影院视频免费| 日韩精品色哟哟| 91久久线看在观草草青青| 国产人伦精品一区二区| 玖玖九九国产精品| 欧美色涩在线第一页| 亚洲色图制服诱惑| 国产91在线看| 久久久久久影视| 麻豆精品国产91久久久久久| 欧美日韩精品免费| 亚洲国产日韩a在线播放性色| www.色综合.com| 国产精品日韩精品欧美在线| 国产真实乱对白精彩久久| 欧美一级在线免费| 日本女优在线视频一区二区| 欧洲一区二区三区在线| 亚洲乱码国产乱码精品精的特点| 成人综合在线网站| 欧美国产激情二区三区| 国产精品1区2区3区在线观看| 26uuu色噜噜精品一区| 激情久久五月天| 久久综合99re88久久爱| 国产曰批免费观看久久久| 精品999在线播放| 国产一二三精品| 久久亚洲精品国产精品紫薇| 国产麻豆精品一区二区| 久久久99精品免费观看不卡| 国产一区二区三区久久久| 精品国产乱码久久久久久夜甘婷婷 | 一道本成人在线| 亚洲精品乱码久久久久| 国产清纯在线一区二区www| 国产一区三区三区| 国产丝袜美腿一区二区三区| 国产精品18久久久久| 久久免费电影网| 成人动漫av在线| 一区二区三区中文在线观看| 91久久免费观看| 偷拍亚洲欧洲综合| 日韩一区二区免费视频| 国产一区高清在线| 中文字幕国产一区二区| 91小宝寻花一区二区三区| 亚洲激情男女视频| 日韩一区二区三区视频在线观看| 蜜臀精品久久久久久蜜臀| 久久久精品国产免费观看同学| 成人爽a毛片一区二区免费| 亚洲精品高清在线| 欧美一区二区福利视频| 国产激情一区二区三区| 亚洲欧洲日韩av| 7777精品伊人久久久大香线蕉超级流畅| 亚洲444eee在线观看| 久久综合国产精品| 色综合视频在线观看| 日韩av电影免费观看高清完整版| 欧美r级电影在线观看| 成人av资源在线观看| 天堂va蜜桃一区二区三区 | 中文字幕不卡一区|