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

📄 44blib.c

📁 TPSN时间同步算法
💻 C
字号:
/************************************************
 * NAME    : 44BLIB.C				*
 * Version : 17.APR.00				*
 ************************************************/

//  Revision History 
//  Delay()

#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
#include "..\inc\option.h"

#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#define STACKSIZE    0xa00 //SVC satck size(do not use user stack)
#define HEAPEND     (_ISR_STARTADDRESS-STACKSIZE-0x500) // = 0xc7ff000
	//SVC Stack Area:0xc(e)7ff000-0xc(e)7ffaff

extern char Image$$RW$$Limit[];

void *mallocPt=Image$$RW$$Limit;


/************************* SYSTEM *************************/
static int delayLoopCount=400;

void Delay(int time)
// time=0: adjust the Delay function by WatchDog timer.
// time>0: the number of loop time
// 100us resolution.
{
    int i,adjust=0;
    if(time==0)
    {
	time=200;
	adjust=1;
	delayLoopCount=400;
	rWTCON=((MCLK/1000000-1)<<8)|(2<<3);    //MCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
	rWTDAT=0xffff;//for first update
	rWTCNT=0xffff;//resolution=64us	@any MCLK 
	rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
    }
    for(;time>0;time--)
	for(i=0;i<delayLoopCount;i++);
    if(adjust==1)
    {
	rWTCON=((MCLK/1000000-1)<<8)|(2<<3);//Watch-dog timer stop
	i=0xffff-rWTCNT;		//1count->64us, 200*400 cycle runtime = 64*i us
	delayLoopCount=8000000/(i*64);	//200*400:64*i=1*x:100 -> x=80000*100/(64*i)   
    }
}

/************************* PORTS ****************************/


void Port_Init(void)
{
  //  PORT A GROUP
  /*  BIT   9   8   7   6   5   4   3   2   1   0 */
  /*  A24   A23 A22 A21 A20 A19 A18 A17 A16 A0  */        
  /*  0   1 1 1 1 1 1 1 1 1 */
  rPCONA = 0x0ff; 
  rPDATA = 0x0ff;

  // PORT B GROUP
  /*  BIT 10  9   8   7   6   5   4   3   2   1   0   */
  /*  /CS5  /CS4  /CS3  /CS2  /CS1  nWBE3 nWBE2 /SRAS /SCAS SCLK  SCKE  */
  /*  EXT   NIC   USB   IDE   SMC   NC    NC    Sdram Sdram Sdram Sdram */
  /*      0,        0,   0,   0,    1,    0,       0,     1,    1,    1,   1          */
  rPDATB = 0x7ff;
  rPCONB = 0x7ff;

         //改动 by yang 2003.5
  //PORT C GROUP
  //BUSWIDTH=16                         */
  /*  PC15   14    13    12    11    10    9     8 */
  /*  o      o     RXD1  TXD1  o     o     o     o */
  /*  CTS0   RTS0  Uart1 Uart1 gLed  rLed  NC    NC  */
  /*  11     11    11    11    01    01    01    00  */

  /*  PC7   6     5     4     3     2     1     0 */
  /*   o    o     o     o     o     o     o     o */
  /*   NC   NC    NC    NC    IO    IO    IO    IO*/
  /*   01   01    01    01    01    01    01    01  */
  rPDATC = 0x0C00;  //All IO is low
  rPCONC = 0xff545555;  
  rPUPC  = 0xFC00;  //PULL UP RESISTOR should be enabled to I/O

  //PORT D GROUP
  /*  PORT D GROUP(I/O OR LCD)                    */
  /*  BIT7    6   5   4   3   2   1   0 */
  /*      VF    VM    VLINE VCLK  VD3   VD2   VD1   VD0 */
  /*     01   01    01    01    01    01    01    01  */
  rPDATD= 0x55;
  rPCOND= 0xaaaa; 
  rPUPD = 0x00;
  //These pins must be set only after CPU's internal LCD controller is enable
///////////////////////////////////////////////////// 
  //PORT E GROUP 
  /*  Bit 8   7   6   5   4   3   2   1   0   */
  /*    ENDLAN  LED3  LED2  LED1  LED0  BEEP  RXD0  TXD0  CLKOUT  */ 
  /*      00    01    01    01    01    01    10    10    00    */
  rPDATE  = 0x157;
  rPCONE  = 0x5528; 
  rPUPE = 0xff;
  
 //PORT F GROUP
  /*  Bit8    7   6   5    4    3   2   1   0   */   
  /*  IISCLK  IISDI IISDO IISLRCK Input Input Input IICSDA  IICSCL  */
  /*  100   100   100   100   00    01    01    10    10    */
  rPDATF = 0x0;
  rPCONF = 0x24915a;
  rPUPF  = 0x1E3;

  //PORT G GROUP
  /*  BIT7    6         5       4       3       2       1       0  */
  /*  INT7    OUT    INT5    INT4     INT3    INT2    INT1     INT0  */
  /*    S3    S4      S5      S6       SW2     SW1     FIFO     Eth */
  /*    11    01      11      11       11      11      11       11   */
  rPDATG = 0xFF;
  rPCONG = 0xDFFF;
  rPUPG  = 0x00;  //should be enabled pull up resistor 

  rSPUCR=0x7;  //D15-D0 pull-up disable

  /*定义非Cache区*/
  rNCACHBE0 = 0xc0002000; 
}



/************************* UART ****************************/

static int whichUart=0;

void Uart_Init(int mclk,int baud)
{
    int i;
    if(mclk==0)
	mclk=MCLK;
    rUFCON0=0x0;     //FIFO disable
    rUFCON1=0x0;
    rUMCON0=0x0;
    rUMCON1=0x0;
//UART0
    rULCON0=0x3;     //Normal,No parity,1 stop,8 bit
    rUCON0=0x245;    //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
    rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );
//UART1
    rULCON1=0x3;
    rUCON1=0x245;
    rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );

    for(i=0;i<100;i++);
}


void Uart_Select(int ch)
{
    whichUart=ch;
}


void Uart_TxEmpty(int ch)
{
    if(ch==0)
	while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
    else
    	while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
}


char Uart_Getch(void)
{
    if(whichUart==0)
    {	    
	while(!(rUTRSTAT0 & 0x1)); //Receive data read
	return RdURXH0();
    }
    else
    {
	while(!(rUTRSTAT1 & 0x1)); //Receive data ready
	return	rURXH1;
    }
}


char Uart_GetKey(void)
{
    if(whichUart==0)
    {	    
	if(rUTRSTAT0 & 0x1)    //Receive data ready
    	    return RdURXH0();
	else
	    return 0;
    }
    else
    {
	if(rUTRSTAT1 & 0x1)    //Receive data ready
	    return rURXH1;
	else
	    return 0;
    }
}


void Uart_GetString(char *string)
{
    char *string2=string;
    char c;
    while((c=Uart_Getch())!='\r')
    {
	if(c=='\b')
	{
	    if(	(int)string2 < (int)string )
	    {
		Uart_Printf("\b \b");
		string--;
	    }
	}
	else 
	{
	    *string++=c;
	    //Uart_SendByte(c);
	}
    }
    *string='\0';
    //Uart_SendByte('\n');
}


int Uart_GetIntNum(void)
{
    char str[30];
    char *string=str;
    int base=10;
    int minus=0;
    int lastIndex;
    int result=0;
    int i;
    
    Uart_GetString(string);
    
    if(string[0]=='-')
    {
        minus=1;
        string++;
    }
    
    if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
    {
	base=16;
	string+=2;
    }
    
    lastIndex=strlen(string)-1;
    if( string[lastIndex]=='h' || string[lastIndex]=='H' )
    {
	base=16;
	string[lastIndex]=0;
	lastIndex--;
    }

    if(base==10)
    {
	result=atoi(string);
	result=minus ? (-1*result):result;
    }
    else
    {
	for(i=0;i<=lastIndex;i++)
	{
    	    if(isalpha(string[i]))
	    {
		if(isupper(string[i]))
		    result=(result<<4)+string[i]-'A'+10;
		else
		    result=(result<<4)+string[i]-'a'+10;
	    }
	    else
	    {
		result=(result<<4)+string[i]-'0';
	    }
	}
	result=minus ? (-1*result):result;
    }
    return result;
}


void Uart_SendByte(int data)
{
    if(whichUart==0)
    {
	if(data=='\n')
	{
	    while(!(rUTRSTAT0 & 0x2));
	    Delay(10);	//because the slow response of hyper_terminal 
	    WrUTXH0('\r');
	}
	while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
	Delay(10);
	WrUTXH0(data);
    }
    else
    {
	if(data=='\n')
	{
    	    while(!(rUTRSTAT1 & 0x2));
	    Delay(10);	//because the slow response of hyper_terminal 
	    rUTXH1='\r';
	}
	while(!(rUTRSTAT1 & 0x2));  //Wait until THR is empty.
	Delay(10);
	rUTXH1=data;
    }	
}		


void Uart_SendString(char *pt)
{
    while(*pt)
	Uart_SendByte(*pt++);
}

void Uart_Sendbuf(unsigned char *buf,int length)
{
  unsigned char i;
  for(i=0; i<length; i++)
       Uart_SendByte(buf[i]);
  //USART_Transmit(13);//CR
  //USART_Transmit(10);//LF
}

//if you don't use vsprintf(), the code size is reduced very much.
void Uart_Printf(char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(string);
    va_end(ap);
}


/******************** S3C44B0X EV. BOARD LED **********************/

void Led_Display(int data)
{
    rPDATB=(rPDATB & 0x1ff) | ((data & 0x3)<<9);
}

/************************* Timer ********************************/

void Timer_Start(int divider)  //0:16us,1:32us 2:64us 3:128us
{
    rWTCON=((MCLK/1000000-1)<<8)|(divider<<3);
    rWTDAT=0xffff;
    rWTCNT=0xffff;   

    // 1/16/(65+1),nRESET & interrupt  disable
    rWTCON=((MCLK/1000000-1)<<8)|(divider<<3)|(1<<5);	
}


int Timer_Stop(void)
{
//    int i;
    rWTCON=((MCLK/1000000-1)<<8);
    return (0xffff-rWTCNT);
}


/************************* PLL ********************************/
void ChangePllValue(int mdiv,int pdiv,int sdiv)
{
    rPLLCON=(mdiv<<12)|(pdiv<<4)|sdiv;
}


/************************* General Library **********************/

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;
}


void Cache_Flush(void)
{
    int i,saveSyscfg;
    
    saveSyscfg=rSYSCFG;

    rSYSCFG=SYSCFG_0KB; 		      
    for(i=0x10004000;i<0x10004800;i+=16)    
    {					   
	*((int *)i)=0x0;		   
    }
    rSYSCFG=saveSyscfg; 			    
}

⌨️ 快捷键说明

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