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

📄 2440lib.c

📁 s3c2440 串口接收模块设计。开发环境在ADS1.2。
💻 C
📖 第 1 页 / 共 2 页
字号:


//**************************[ UPLL ]*******************************
void ChangeUPllValue(int mdiv,int pdiv,int sdiv)
{
    rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}


//*************************[ General Library ]**********************
#if !USE_MAIN
void * malloc(unsigned nbyte) 
//Very simple; Use malloc() & free() like Stack
//void *mallocPt=Image$$RW$$Limit;
{
    void *returnPt = mallocPt;

    mallocPt = (int *)mallocPt+nbyte/4+((nbyte%4)>0); //To align 4byte

    if( (int)mallocPt > HEAPEND )
    {
        mallocPt = returnPt;
        return NULL;
    }
    return returnPt;
}

//-------------------------------------------------------------------
void free(void *pt)
{
    mallocPt = pt;
}
#endif


 void ChangeSromParameter(char bank, char minacc)  // only for Tacc
{
    int acc;

    //1000000/(hclk/1000000.)=Unit Period(ns)*1000
    acc = (int)(minacc*(HCLK/1000000.)/1000+0.5);	

    if(acc<=1)
		acc=0;    	
    else if(acc==2)
	 	acc=1;
    else if(acc==3)
	 	acc=2;
    else if(acc==4)
	 	acc=3;
    else if((5<acc)&&(acc<=6))
   		acc=4;
    else if((7<acc)&&(acc<=8))
	 	acc=5;
    else if((9<acc)&&(acc<=10))
   		acc=6;	
    else if(11<acc)
	 	acc=7;
	
    switch(bank)
    {
	  case 0 : rBANKCON0 |= (acc<<8); break;
	  case 1 : rBANKCON1 |= (acc<<8); break;
	  case 2 : rBANKCON2 |= (acc<<8); break;
	  case 3 : rBANKCON3 |= (acc<<8); break;
	  case 4 : rBANKCON4 |= (acc<<8); break;
	  case 5 : rBANKCON5 |= (acc<<8); break;
    }	
}


// each timing parameter's unit is nano second..
void ChangeSdramParameter(char bank_num, int minrc, int minrcd, int minrp, int refresh, int col_addr, int cl, char banksize)
{
    int rc, rcd, rp, rcnt, scan;

    //1000000/(hclk/1000000.)=Unit Period(ns)*1000
    rc = (int)(minrc*(HCLK/1000000.)/1000+0.5)-4;
    rcd = (int)(minrcd*(HCLK/1000000.)/1000+0.5)-2;
    rp = (int)(minrp*(HCLK/1000000.)/1000+0.5)-2;
	rcnt = (int)(2048+1-(HCLK/1000000.)*(refresh/1000.)+0.5);
	scan = col_addr-8;

	if (rc<0) rc=0; if (rc>3) rc = 3;
	if (rcd<0) rcd=0; if (rcd>2) rcd = 2;
	if (rp<0) rp=0; if (rp>2) rp = 2;
	if (cl==1) cl = 0;	
	switch(banksize)
	{
	case 2 : banksize = 4; break;
	case 4 : banksize = 5; break;
	case 8 : banksize = 6; break;
	case 16 : banksize = 7; break;
	case 32 : banksize = 0; break;
	case 64 : banksize = 1; break;
	default : banksize = 2; break; // 128MB/128MB
	}

//	Uart_Printf("rc=%d, rcd=%d, rp=%d, rcnt=%d, scan=%d, cl=%d, banksize=%d\n", rc, rcd, rp, rcnt, scan, cl, banksize);
	
    switch(bank_num)
    {
    case 0:
    case 6:
	default:
		rBANKCON6 = ( rBANKCON6 & ~((3<<15)|(0xf<<0)) ) | (3<<15)|(rcd<<2)|(scan); // SDRAM, Trcd, column address number
		rMRSRB6 = (rMRSRB6 & ~(3<<4)) | (cl<<4);
	break;
	case 1:
    case 7: // bank 7
		rBANKCON7 = ( rBANKCON7 & ~((3<<15)|(0xf<<0)) ) | (3<<15)|(rcd<<2)|(scan); // SDRAM, Trcd, column address number
		rMRSRB7 = (rMRSRB7 & ~(3<<4)) | (cl<<4);
	break;
    }	
	rREFRESH = (rREFRESH & ~(0x3f<<18)) | (1<<23)|(0<<22)|(rp<<20)|(rc<<18)|(rcnt); // refresh enable, auto refresh, Trp, Trc, Refresh counter
	rBANKSIZE = (rBANKSIZE & ~(7<<0)) | (banksize); // SCLK power save mode, 128/128 bank
	
}

void Max1718_Set(int voltage)
{

     int vtg;
	//////////////////////////////////////////////
	//   D4    D3  D2   D1     D0
	//	0	 1	0 	0	 0		// 1.35V
	//	0	 1	0 	0	 1		// 1.30V
	//	0	 1	0 	1	 0		// 1.25V
	//	0	 1	0 	1	 1		// 1.20V
	//	0	 1	1 	0	 0		// 1.15V
	//	0	 1	1 	0	 1		// 1.10V
	//	0	 1	1 	1	 0		// 1.05V
	//	0	 1	1 	1	 1		// 1.00V
	//	1	 0	0 	0	 1		// 0.95V
	//	1	 0	0 	1	 1		// 0.90V
	//	1	 0	1 	0	 1		// 0.85V
	//	1	 0	1 	1	 1		// 0.80V
	
    vtg=voltage;
	rGPBCON = (rGPBCON&~((3<<20) |(3<<16) |(3<<14))) | (1<<20) | (1<<16) | (1<<14);
	// GPB7, 8, 10 : Output
	rGPFCON=(rGPFCON&~(0xff<<8))|(0x55<<8);  // GPF4~7: Output , shared with LED4~7

     switch (vtg)
	{
	case 135:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
	      rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(0<<5)|(0<<4);	//D3~0
	      break;

	
	case 130:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(0<<5)|(1<<4); //D3~0
		 break;
       
	case 125:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(1<<5)|(0<<4); //D3~0
		break;

	case 120:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(1<<5)|(1<<4); //D3~0
		 break;

	case 115:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(1<<6)|(0<<5)|(0<<4); //D3~0
		 break;

	case 110:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(1<<6)|(0<<5)|(1<<4); //D3~0
		 break;

	case 105:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(1<<6)|(1<<5)|(0<<4); //D3~0
		 break;

	case 100:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(1<<6)|(1<<5)|(1<<4); //D3~0
		break;

	case 95:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(1<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(0<<7)|(0<<6)|(0<<5)|(1<<4); //D3~0
		 break;

	case 90:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(1<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(0<<7)|(0<<6)|(1<<5)|(1<<4); //D3~0
		 break;

	case 85:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(1<<7);	//D4
		rGPFDAT=(rGPFDAT&~(0xf<<4))|(0<<7)|(1<<6)|(0<<5)|(1<<4); //D3~0
		 break;

      	case 80:
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(1<<7);	//D4
	       rGPFDAT=(rGPFDAT&~(0xf<<4))|(0<<7)|(1<<6)|(1<<5)|(1<<4); //D3~0
		 break;

       default:	// 1.2V
		 rGPBDAT=(rGPBDAT&~(1<<7)) |(0<<7);	//D4
		 rGPFDAT=(rGPFDAT&~(0xf<<4))|(1<<7)|(0<<6)|(1<<5)|(1<<4); //D3~0
		 break;

		
	}
		 
	rGPBDAT&=~(1<<8);   //Latch enable
	rGPBDAT|=(1<<10);   //Output enable
	rGPBDAT|=(1<<8);	 //Latch disable

}


// Write the argument of the function in hexadecimal to the serial
// port. If you want "0x" in front of it, you'll have to add it
// yourself.
void Uart_SendHex(void *addr, VAR_TYPE type){
	char	c, uHex, lHex, *s;

	// for little endian.
	/////////////for (s=(char *)(addr+(type/8)-1); (U32)s>=(U32)addr; s--){

		c = *s;

		// get upper 4 bit and lower 4 bit.
		uHex = ((c>>4)&0x0f);
		lHex = ((c>>0)&0x0f);

		// upper and lower 4 bit to '0'~'9', 'A'~'F'.
		if (uHex<10) uHex+='0';
		else         uHex+='A'-10;
		if (lHex<10) lHex+='0';
		else         lHex+='A'-10;

		Uart_SendByte(uHex);
		Uart_SendByte(lHex);
	////////////}
}


// Write the argument of the function in decimal to the serial port.
// We just assume that each argument is positive (i.e. unsigned). */
void Uart_SendDec(const U32 d){
	int leading_zero = 1;
	U32 divisor, result, remainder;

	remainder = d;

	for (divisor=1000000000; divisor>0; divisor/=10){
		result = remainder/divisor;
		remainder %= divisor;

		if(result != 0 || divisor == 1) leading_zero = 0;
		if(leading_zero == 0) Uart_SendByte((char)(result) + '0');
	}
}


// Write a block of data to the serial port. Similar to
// SerialOutputString(), but this function just writes the number of
// characters indicated by bufsize and doesn't look at termination
// characters.
void Uart_SendBlock(const char *buf, int bufsize){
	while(bufsize--) Uart_SendByte(*buf++);
}


⌨️ 快捷键说明

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