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

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

?? st16c554.c

?? s3c2410下st16c554應用的源程序(利用總線進行4串口擴展)
?? C
字號:
#include "st16c554d.h"
#include "2410addr.h"
#include "2410lib.h"
#include <string.h>

struct
{
	int sizes;
	unsigned char bufs[512];
}port_buffers[4];

void s3c2410_init_memory_control()
{
	//no need to set BWSCON, use default:8-bits bus,no wait,
	rBWSCON = rBWSCON & 0xff00f00f;
	
	rBANKCON1 = (B_Tacs << Tacs_Offset) | (B_Tcos << Tcos_Offset) | (B_Tacc <<Tacc_Offset) | (B_Tcoh << Tcoh_Offset) | (B_Tcah <<Tcah_Offset) | (B_Tacp << Tacp_Offset) | (B_PMC << PMC_Offset);
	rBANKCON2 = (B_Tacs << Tacs_Offset) | (B_Tcos << Tcos_Offset) | (B_Tacc <<Tacc_Offset) | (B_Tcoh << Tcoh_Offset) | (B_Tcah <<Tcah_Offset) | (B_Tacp << Tacp_Offset) | (B_PMC << PMC_Offset);
	rBANKCON4 = (B_Tacs << Tacs_Offset) | (B_Tcos << Tcos_Offset) | (B_Tacc <<Tacc_Offset) | (B_Tcoh << Tcoh_Offset) | (B_Tcah <<Tcah_Offset) | (B_Tacp << Tacp_Offset) | (B_PMC << PMC_Offset);
	rBANKCON5 = (B_Tacs << Tacs_Offset) | (B_Tcos << Tcos_Offset) | (B_Tacc <<Tacc_Offset) | (B_Tcoh << Tcoh_Offset) | (B_Tcah <<Tcah_Offset) | (B_Tacp << Tacp_Offset) | (B_PMC << PMC_Offset);
}
void s3c2410_reset_CS_pin()
{
	//set CS1,2,4,5 as cs pins
	rGPACON = rGPACON | 0x1b000;
}

void s3c2410_init_interrupt()
{
	//set gpf 0,1,2,3 as eint
	rGPFCON = (rGPFCON | 0xaa) & 0xffffffaa;
	
	//set the signaling method as high
	rEXTINT0 = (rEXTINT0 | 0x1111) & 0xffff1111;
	
	//set the signaling method as low
	//rEXTINT0 = rEXTINT0 & 0xfffff000;
	
	//set the signaling method as rising edge
	//rEXTINT0 = (rEXTINT0 | 0x4444) & 0xffff4444;
}

void st16c554_reset_chip()	//set PB0 as output
{
	rGPBCON = (rGPBCON & 0xfffffffd) | 0x01;
	//set PB0 high
	rGPBDAT = rGPBDAT | 0x01;
	//keep PB0 high for 40 ns to reset st16c554
	Delay(1);
	//set PB0 low
	rGPBDAT= rGPBDAT & 0xfffffffe;
}

//dtr:0,1 - force DTR# pin output high,low
//rts:0,1 - force RTS# pin output high,low
//intOutput:0,1 - INT(a-d) output disable(three state),INT(a-d) output enable(active)
void st16c554d_set_mcr(int port, int dtr, int rts, int intOutput)
{
	unsigned char *portAddr;
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return;
	}
	portAddr += rST16C554D_MCR;
	*portAddr = dtr | (rts << 1) | (intOutput << 3);

	Uart_Printf("%x=%x  ",portAddr,*portAddr);
}

//fifi:0,1 - disable,enalbe
//resetRxFifo:0,1 - not reset,reset
//resetTxFifo:0,1 - not reset,reset
//dma:0,1 - normal,dma mode
//RxTrigger:0,1,2,3 - 1,4,8,14
void st16c554d_set_fcr(int port, int fifo, int resetRxFifo, int resetTxFifo, int dma, int rxTrigger)
{
	unsigned char *portAddr;
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return;
	}
	portAddr += rST16C554D_FCR;
	*portAddr = fifo | (resetRxFifo << 1) | (resetTxFifo << 2) | (dma << 3)	| (rxTrigger << 6);

}

//worldLength:0,1,2,3 - 5,6,7,8 
//stopBit:0,1,1 - 1(5,6,7,8 bits length),1-1/2(5 bits length),2(6,7,8 bits length)
//parity: 0,1,3,5,7 - none,odd,even,forced 1,forced 0
void st16c554d_set_line(int port, int wordLength, int stopBit, int parity)
{
	unsigned char *portAddr;
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return;
	}
	portAddr += rST16C554D_LCR;
	*portAddr = wordLength | (stopBit << 2) | (parity << 3);
	Uart_Printf("%x=%x  ",portAddr,*portAddr);
	
}

//baud 200,1200,2400,4800,9600,19200,38400,76800,115200,230400,460800
void st16c554d_set_band(int port, int baud)
{
	unsigned char *portAddr;
	unsigned char dll = 0, dlm = 0;
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return;
	}
	
	switch(baud)
	{
		case 200:
			dlm = 0x09;	
			break;		
		case 1200:
			dlm = 0x01;
			dll = 0x80;
			break;
		case 2400:
			dll = 0xc0;
			break;
		case 4800:
			dll = 0x60;
			break;
		case 9600:
			dll = 0x30;
			break;
		case 19200:
			dll = 0x18;
			break;
		case 38400:
			dll = 0x0c;
			break;
		case 76800:
			dll = 0x06;
			break;
		case 115200:
			dll = 0x04;
			break;
		case 230400:
			dll = 0x02;
			break;
		case 460800:
			dll = 0x01;
			break;
		default:
			return;
	}
	
	//enalbe baudrate divisor
	*(portAddr + rST16C554D_LCR) = *(portAddr + rST16C554D_LCR) | 0x80;
	//write to dll and dlm
	*(portAddr + rST16C554D_DLL) = dll;
	*(portAddr + rST16C554D_DLM) = dlm;
	//disable baudrate divsior
	*(portAddr + rST16C554D_LCR) = *(portAddr + rST16C554D_LCR) & 0x7f;
	
}

void st16c554d_enable_irq(int port)
{
	unsigned char *portAddr;
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return;
	}
	portAddr += rST16C554D_IER;
	*portAddr = 0x01;
}

void st16c554d_disable_irq(int port)
{
	unsigned char *portAddr;
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return;
	}
	portAddr += rST16C554D_IER;
	*portAddr = 0x0;
}

void __irq st16c554_port_a_rx(void)
{
	int maxcount = 256;
	Uart_Printf("eint 0 occur!\n");
	//disable interrupt
	rINTMSK = rINTMSK | 1;
	ClearPending(BIT_EINT0);
	while (maxcount--)
	{
		if ((*( Add_st16c554d_portA + rST16C554D_LSR) & 0x01) == 0)
			break;
		port_buffers[0].bufs[port_buffers[0].sizes++] = *Add_st16c554d_portA;
	}
	//enable interrupt
	rINTMSK = rINTMSK & 0xfffffffe;
}

void __irq st16c554_port_b_rx(void)
{

	int maxcount = 256;
	//disable interrupt
	Uart_Printf("eint 1 occur!\n");
	rINTMSK = rINTMSK | 2;
	ClearPending(BIT_EINT1);
	while (maxcount--)
	{
		if ((*( Add_st16c554d_portB + rST16C554D_LSR) & 0x01) == 0)
			break;
		port_buffers[1].bufs[port_buffers[1].sizes++] = *Add_st16c554d_portB;
	}
	//enable interrupt
	rINTMSK = rINTMSK & 0xfffffffd;
	
}
void __irq st16c554_port_c_rx(void)
{
	int maxcount = 256;
	Uart_Printf("eint 2 occur!\n");
	//disable interrupt
	rINTMSK = rINTMSK | 4;
	ClearPending(BIT_EINT2);
	while (maxcount--)
	{
		if ((*( Add_st16c554d_portC + rST16C554D_LSR) & 0x01) == 0)
			break;
		port_buffers[2].bufs[port_buffers[2].sizes++] = *Add_st16c554d_portC;
	}

	//enable interrupt
	rINTMSK = rINTMSK & 0xfffffffb;
}
void __irq st16c554_port_d_rx(void)
{
	int maxcount = 256;
	Uart_Printf("eint 3 occur!\n");
	//disable interrupt
	rINTMSK = rINTMSK | 8;
	ClearPending(BIT_EINT3);
	while (maxcount--)
	{
		if ((*( Add_st16c554d_portD + rST16C554D_LSR) & 0x01) == 0)
			break;
		port_buffers[3].bufs[port_buffers[3].sizes++] = *Add_st16c554d_portD;
	}
	//enable interrupt
	rINTMSK = rINTMSK & 0xfffffff7;
}

void s3c2410_set_intmod(int port)
{
	 
}


void s3c2410_enable_irq(int port)
{
	unsigned int mskvalue;
	switch(port)
	{
		case 1:
			mskvalue = 0xfffffffe;
			break;
		case 2:
			mskvalue = 0xfffffffd;
			break;
		case 3:
			mskvalue = 0xfffffffb;
			break;
		case 4:
			mskvalue = 0xfffffff7;
			break;
		default:
			return;
	}
	rINTMSK = rINTMSK & mskvalue;
}

void s3c2410_disable_irq(int port)
{
	unsigned int mskvalue;
	switch (port)
	{
		case 1:
			mskvalue = 1;
			break;
		case 2:
			mskvalue = 2;
			break;
		case 3:
			mskvalue = 4;
			break;
		case 4:
			mskvalue = 8;
			break;
		default:
			return;
	}
	
	rINTMSK = rINTMSK | mskvalue;
}

void st16c554d_send_char(int port, unsigned char ch)
{
	unsigned char *portAddr;
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return;
	}
	while (!(*(portAddr + rST16C554D_LSR) & 0x20));
	*portAddr = ch;
}

void st16c554d_write(int port, char *source, int sizes)
{
	int i = 0,j,k,m;
	unsigned char *portAddr;
	
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return;
	}	
	
	j = sizes / 16;
	k = sizes % 16;
	
	for (m = 0; m < j; m++)
	{
		while (!(*(portAddr + rST16C554D_LSR) & 0x20));
		for (m = 0; m < 16; m++)
			*portAddr = *(source + i++);
	}
	
	while (!(*(portAddr + rST16C554D_LSR) & 0x20));
	for (m = 0; m < k; m++)
	{
		*portAddr = *(source + i++);
	}
}

int st16c554d_read(int port, unsigned char *dest)
{
	unsigned char *portAddr;
	int maxcount = 0;
	
	switch(port)
	{
		case 1:
			portAddr = Add_st16c554d_portA;
			break;
		case 2:
			portAddr = Add_st16c554d_portB;
			break;
		case 3:
			portAddr = Add_st16c554d_portC;
			break;
		case 4:
			portAddr = Add_st16c554d_portD;
			break;
		default:
			return 0;
	}	
	
	while ((*(portAddr + rST16C554D_LSR ) & 0x01) && (maxcount < 256)) 
	{
		*(dest + maxcount++) = *portAddr;
	}	
	return maxcount;
}

void Test_St16c554d_Uart(void)
{
	int i;
	int counter[4] = {0, 0, 0, 0};
	char string[][100] = {"hello,this demo string come from port A",
					      "hello,this demo string come from port B",
					      "hello,this demo string come from port C",
					      "hello,this demo string come from port D"};
	
	Uart_Printf("Reset St16c554 Test!\n");
	
	s3c2410_reset_CS_pin();
	
	s3c2410_init_interrupt();
	
	st16c554_reset_chip();
	
	Uart_Printf("Init 1,2,4,5 memory control bank!\n");
	s3c2410_init_memory_control();

	for (i = 0; i < 4; i++)
	{
		//disable interrupt
		s3c2410_disable_irq(i+1);
		//have to clear pengding interrupt
		ClearPending((1<<i));
		
		st16c554d_disable_irq(i+1);
		
		//clear buffer
		port_buffers[i].sizes = 0;
		memset(port_buffers[i].bufs,0,512);
		
		//baud 50,300,600,1200,2400,4800,9600,19200,38400,57600,115200
		st16c554d_set_band(i+1, 115200);
		
		//set moden control register
		//DTR#=high, RTS#=high, INT(a-d) output enable(active)
		st16c554d_set_mcr(i + 1, 0, 0, 1);
		
		//set fifo control register
		//enable fifo mode, reset thr, reset rhr, not dma mode, trigger level=1
		st16c554d_set_fcr(i+1, 1, 1, 1, 0, 0);	
		
		//set line control resiter
		//8 databits, 1 stopbit, none parity
		st16c554d_set_line(i+1, 3, 0, 0);
		
		Uart_Printf("\n____________________________\n");
	
	}
	
	Uart_Printf("rGPACON=%x,rBWSCON=%x, rBANKCON1=%x, rBANKCON2=%x, rBANKCON4=%x, rBANKCON5=%x\n",rGPACON,rBWSCON,rBANKCON1,rBANKCON2,rBANKCON4,rBANKCON5);
	Uart_Printf("MCRA=%x, LCRA=%x\n",*(Add_st16c554d_portA+rST16C554D_MCR),*(Add_st16c554d_portA+rST16C554D_LCR));
	Uart_Printf("MCRB=%x, LCRB=%x\n",*(Add_st16c554d_portB+rST16C554D_MCR),*(Add_st16c554d_portB+rST16C554D_LCR));
	Uart_Printf("MCRC=%x, LCRC=%x\n",*(Add_st16c554d_portC+rST16C554D_MCR),*(Add_st16c554d_portC+rST16C554D_LCR));
	Uart_Printf("MCRD=%x, LCRD=%x\n",*(Add_st16c554d_portD+rST16C554D_MCR),*(Add_st16c554d_portD+rST16C554D_LCR));

	pISR_EINT0 = (unsigned)st16c554_port_a_rx;
	pISR_EINT1 = (unsigned)st16c554_port_b_rx;
	pISR_EINT2 = (unsigned)st16c554_port_c_rx;
	pISR_EINT3 = (unsigned)st16c554_port_d_rx;
	
	for (i = 0; i < 4; i++)
	{
		st16c554d_enable_irq(i+1);
		s3c2410_enable_irq(i+1);
	}
	
	
	Uart_Printf("enable all interrupt!\n");
	 
	
	 while(1)
	 {
	 	for(i = 0; i < 4; i++)
	 	{
	 		if (port_buffers[i].sizes)
	 		{
	 			port_buffers[i].bufs[port_buffers[i].sizes] = '\0';
	 			Uart_Printf("%s\n",port_buffers[i].bufs);
	 			port_buffers[i].sizes = 0;
	 			memset(port_buffers[i].bufs,0,512);
	 		}
	 		
	 		//port_buffers[i].sizes = st16c554d_read(i,port_buffers[i].bufs);
	 		//if (port_buffers[i].sizes)
	 		//{
	 		//	port_buffers[i].bufs[port_buffers[i].sizes] = '\0';
	 		//	Uart_Printf("%s\n", port_buffers[i].bufs);
	 		//}
	 		
	 		if (counter[i] > 5000000)
	 		{
	 			st16c554d_write(i + 1, string[i], strlen(string[i]));
	 			//Uart_Printf("%s", string[i]);
	 			counter[i] = 0;
	 		}
	 		else
	 			counter[i]++;
	 	}
	 }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
√…a在线天堂一区| 欧美视频自拍偷拍| 亚洲欧美另类小说视频| 欧美日韩卡一卡二| 粉嫩aⅴ一区二区三区四区 | 色88888久久久久久影院按摩 | 在线成人免费观看| 国产乱色国产精品免费视频| 亚洲伊人色欲综合网| 国产性色一区二区| 欧美人与禽zozo性伦| av欧美精品.com| 久久99久久精品欧美| 有码一区二区三区| 国产日韩欧美综合在线| 91精品国产综合久久久久久久| 成人av免费观看| 国产制服丝袜一区| 日韩影视精彩在线| 亚洲六月丁香色婷婷综合久久 | 亚洲图片欧美激情| 精品国产sm最大网站| 欧美日本乱大交xxxxx| 91在线小视频| 不卡区在线中文字幕| 国产综合色在线视频区| 男人的j进女人的j一区| 亚洲综合色婷婷| 亚洲黄色尤物视频| 中文字幕一区二区三区蜜月| 国产日韩欧美一区二区三区综合| 欧美一级片在线观看| 欧美日韩国产美女| 在线观看日韩毛片| 色偷偷一区二区三区| eeuss国产一区二区三区| 成人免费看片app下载| 国产剧情av麻豆香蕉精品| 久久精品噜噜噜成人88aⅴ| 五月婷婷综合激情| 午夜久久电影网| 香蕉久久一区二区不卡无毒影院 | 欧美日本视频在线| 欧美吞精做爰啪啪高潮| 在线视频综合导航| 欧美伊人久久久久久久久影院 | 国产精品一区二区黑丝| 国产一区二区三区精品欧美日韩一区二区三区| 日韩精品欧美成人高清一区二区| 亚洲一区二区三区四区在线观看| 亚洲综合精品久久| 午夜伦欧美伦电影理论片| 亚洲va在线va天堂| 日本在线播放一区二区三区| 日本va欧美va精品发布| 久久99精品国产麻豆不卡| 国内外成人在线| 国产寡妇亲子伦一区二区| 国产成人精品午夜视频免费| 成人福利视频在线看| 色综合久久中文综合久久97 | 欧美亚洲日本国产| 欧美日韩国产天堂| 精品国产免费一区二区三区四区| 久久久.com| 亚洲男人的天堂一区二区| 日韩精品一区二区三区在线| 欧美岛国在线观看| 久久伊99综合婷婷久久伊| 中文字幕精品—区二区四季| 成人欧美一区二区三区白人| 亚洲综合激情网| 美女在线视频一区| 成人免费黄色大片| 在线亚洲一区观看| 日韩欧美亚洲国产另类| 国产午夜精品在线观看| 一区二区三区影院| 捆绑调教一区二区三区| 成人黄色av电影| 精品视频免费在线| 久久久久久9999| 一区二区三区日本| 免费高清成人在线| 99久久综合精品| 欧美精品乱人伦久久久久久| 久久精品无码一区二区三区| 亚洲在线免费播放| 精品影院一区二区久久久| 91社区在线播放| 精品欧美一区二区在线观看| 欧美亚洲国产一区二区三区va| 欧美在线播放高清精品| 26uuu另类欧美| 亚洲精品视频在线看| 另类小说欧美激情| 色94色欧美sute亚洲线路一ni| 337p亚洲精品色噜噜| 中文字幕在线不卡视频| 日本不卡123| 91啪亚洲精品| 久久久五月婷婷| 亚洲永久精品国产| 成人免费看的视频| 欧美成人三级在线| 亚洲一卡二卡三卡四卡无卡久久| 国产一区二区三区视频在线播放| 欧美性感一类影片在线播放| 日本一区二区三区dvd视频在线| 午夜不卡av免费| 97se亚洲国产综合自在线| 久久久无码精品亚洲日韩按摩| 午夜精品久久久久| 91免费观看在线| 国产日韩av一区二区| 免费成人美女在线观看| 在线国产电影不卡| 国产精品久久精品日日| 国产麻豆9l精品三级站| 日韩片之四级片| 午夜日韩在线电影| 欧美视频在线观看一区二区| 国产精品久久久久久久久久久免费看| 久久成人免费日本黄色| 91.麻豆视频| 亚洲成人在线观看视频| 色婷婷av一区二区三区之一色屋| 欧美国产一区视频在线观看| 韩国三级中文字幕hd久久精品| 91麻豆精品国产91久久久久| 亚洲自拍欧美精品| 色激情天天射综合网| 亚洲三级免费观看| a4yy欧美一区二区三区| 国产精品美女久久久久久久久 | 972aa.com艺术欧美| 国产精品色在线| 大尺度一区二区| 国产农村妇女精品| 成人免费视频一区二区| 日本一区二区三区在线观看| 国产精品亚洲午夜一区二区三区| 久久人人超碰精品| 国产精品主播直播| 欧美激情在线看| av一本久道久久综合久久鬼色| 国产精品国产三级国产aⅴ中文| 成人av在线一区二区三区| 国产精品女人毛片| av一区二区三区黑人| 亚洲欧美一区二区三区国产精品 | 成人动漫视频在线| 国产精品国产三级国产普通话蜜臀| 成人av资源在线观看| 日韩一区中文字幕| 在线观看精品一区| 五月天网站亚洲| 欧美zozozo| 岛国av在线一区| 亚洲人成精品久久久久| 欧美性高清videossexo| 日本伊人色综合网| 久久精品夜色噜噜亚洲aⅴ| 粉嫩aⅴ一区二区三区四区| 亚洲欧美色图小说| 欧美日韩高清在线播放| 久久99精品久久久久婷婷| 国产欧美日产一区| 91麻豆福利精品推荐| 午夜国产精品影院在线观看| 精品福利一区二区三区| 成人av电影免费观看| 亚洲第一成人在线| 亚洲精品一区二区三区四区高清| 成人午夜视频在线| 亚洲第一成人在线| 久久久99精品免费观看不卡| 色诱视频网站一区| 琪琪久久久久日韩精品| 欧美激情在线一区二区| 欧美日韩三级一区| 国产精品影视在线观看| 亚洲九九爱视频| 日韩一区二区三区电影在线观看| 粉嫩aⅴ一区二区三区四区| 亚洲高清一区二区三区| 久久久精品tv| 欧美性xxxxxxxx| 国产成人综合网| 午夜不卡在线视频| 国产精品污污网站在线观看 | 欧美色成人综合| 国产乱码精品一区二区三区五月婷| 亚洲三级在线看| 26uuu精品一区二区三区四区在线| 色婷婷av一区二区三区大白胸| 久草热8精品视频在线观看| 一区二区在线观看免费| 久久久综合精品| 欧美久久久一区|