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

📄 44blib.c.bak

📁 入门试验代码
💻 BAK
字号:
/************************************************
 * NAME    : 44BLIB.C				*
 * Version : 17.APR.00				*
 ************************************************/
#include "..\inc\44b.h"
#include "..\inc\44blib.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




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);  // 1M/64,Watch-dog,nRESET,interrupt disable
	rWTDAT=0xffff;
	rWTCNT=0xffff;	 
	rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); // 1M/64,Watch-dog enable,nRESET,interrupt disable 
    }
    for(;time>0;time--)
	for(i=0;i<delayLoopCount;i++);
    if(adjust==1)
    {
	rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
	i=0xffff-rWTCNT;   //  1count/16us?????????
	delayLoopCount=8000000/(i*64);	//400*100/(i*64/200)   
    }
}

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

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
//    rULCON0=0x7;     //Normal,No parity,2 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=0x7;     //Normal,No parity,2 stop,8 bit
    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)
{
	int data1;
	data1=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(data1);
    }
    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=data1;
    }	
}		


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


//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 **********************/
//		 -g--		a: data0	b: data1		
//	       a/_b_/f		c: data2	d: data3	dp: data4
//	       c/_d_/e dp	e: data5	f: data6	g: data7
void Led_Display(int LedStatus)
{

	if((LedStatus&0x01)==0x01)		//PE7状态设置
		{	rPDATC=rPDATC&0xfffD;
			Delay(50);
		}
	else
		{	rPDATC=rPDATC|0x02;
			Delay(50);
		}
	
	if((LedStatus&0x02)==0x02)		//PE6状态设置
		{
			rPDATC=rPDATC&0xfffB;
			Delay(50);
		}
	else
		{
			rPDATC=rPDATC|0x04;
			Delay(50);
		}

	if((LedStatus&0x04)==0x04)		//PE5状态设置
		{
			rPDATC=rPDATC&0xfff7;
			Delay(50);
		}
	else
		{
			rPDATC=rPDATC|0x08;
			Delay(50);
		}

	//if((LedStatus&0x08)==0x08)		//PE4状态设置
	//	rPDATC=rPDATC&0x1ef;
	//else
	//	rPDATC=rPDATC|0x10;
//    Uart_Printf("\n keyboard is %d\n\n",data);
}

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


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

void * malloc(unsigned nbyte) 
{
    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; 			    
}
/************************* 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);
}

/****************************************************************************
【功能说明】蜂鸣器鸣叫time个100us
****************************************************************************/
void Beep(unsigned int time)
{
	rPDATE = (rPDATE | 0x08);
	Delay(time);		//延时若干个100us
	rPDATE = (rPDATE & 0x1f7);
}
//***************************************************************************
/****************************************************************************
【功能说明】定时器初始化,让PE7、6、5、4输出PWM信号
****************************************************************************/
void Timer_Pwm(void)
{
	rPCONE = 0xaa6b;		
	//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1、0 RXD0 TXD0 FOUT
	rPUPE |= 0xf0;		//TOUT4、3、2、1、0设置成不上拉,其他引脚上拉

	rTCFG0 = 0x23f3f3f;		//死区长度为2;    Prescaler0/1/2=3f,3f,3f
	//定时器输入时钟频率计算公式 = MCLK/{prescaler+1}/{divider value}
	rTCFG1 = 0x0;		// Interrupt; Devider value = 1/2
	//定时器时钟 = (MCLK/prescaler+1)/2

	rTCNTB0 = 20000;		//决定TOUT 0引脚PWM输出信号的频率
	rTCNTB1 = 32000;		//决定TOUT 1引脚PWM输出信号的频率
	rTCNTB2 = 43000;		//决定TOUT 2引脚PWM输出信号的频率
	rTCNTB3 = 53000;		//决定TOUT 3引脚PWM输出信号的频率
	rTCNTB4 = 64000;		//决定TOUT 4引脚PWM输出信号的频率

	rTCMPB0 = 12000;		//决定TOUT 0引脚PWM输出高电平的信号宽度(rTCMPB0<rTCNTB0)
	rTCMPB1 = 18000;		//决定TOUT 1引脚PWM输出高电平的信号宽度(rTCMPB1<rTCNTB1)
	rTCMPB2 = 25000;		//决定TOUT 2引脚PWM输出高电平的信号宽度(rTCMPB2<rTCNTB2)
	rTCMPB3 = 28000;		//决定TOUT 3引脚PWM输出高电平的信号宽度(rTCMPB3<rTCNTB3)
	rTCMPB4 = 36000;		//决定TOUT 4引脚PWM输出高电平的信号宽度(rTCMPB4<rTCNTB4)

//	rTCON = 0xaaaa0a;		//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
//	rTCON = 0x999909;		//开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
//	rTCON = 0xeeee0e;		//自动重装,输出取反打开,更新TCNTBn、TCMPBn,死区控制器关闭
//	rTCON = 0xdddd0d;		//开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
//	rTCON = 0xaaaa1a;		//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器打开
//	rTCON = 0x999919;		//开始PWM输出(使用死区控制器,上升沿会变得平滑,适用于功率器件控制)

	//Delay(7500);		//延时若干个100us
	rTCON = 0xaaaa0a;		//自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
	rTCON = 0x999900;		//停止蜂鸣器的叫声
//	rTCON = 0x0;		//停止定时器
	rPCONE = 0xaa6b;		//
	//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1 OUTPUT RXD0 TXD0 FOUT
}

/*****************************************************************************************
<Author:>	Sun		<Creat time:>	6/21/2005

【功能说明】A/D转换器初始化
******************************************************************************************/
void ADC_Start(void)
{
	rCLKCON=0x07ff8;	//时钟控制寄存器,使能MCLK作为ADC时钟源
	rADCCON=0x1|(0<<2);	//启用A/D转换
	Delay(100);			//等待一定时间使ADC的参考电压稳定下来		
	rADCPSR=0x20;		//设置时钟预分频值
	
}
/*****************************************************************************************
<Author:>	Sun		<Creat time:>	6/21/2005

【功能说明】读取A/D转换数值子程序
【参数说明】int ch 采样通道
【返回类型】int 转换结果
******************************************************************************************/
int ReadAdc(int ch)
{
	//ADCCON
	/*	Bit 6			5			4		3		2		1			0			*/
	/*		0: 正在转换	0;正常模式	输入选择000~111			0:允许读	0:无操作	*/
	/*		1;转换结束	1:睡眠模式							1:禁止读	1:启动转换	*/
	
	int i;
	static int prevCh = -1;			// 静态变量,第一次进入该程序是,ADC通道一定不为-1,因此必须等待信号建立
									// 以后进入该程序时,该语句赋值被忽略,preCh的值为上一次转换的通道号 
	if(prevCh!=ch)					// 若当前的转换通道不是上一次转换的通道,等待信号建立 								
	{	
		rADCCON=0x0|(ch<<2);		//设置采样通道
		for(i=0;i<150;i++);  		//等待最小15us
		
	}
	
	rADCCON=0x1|(ch<<2);       		//启动A/D转换
	
	while(rADCCON & 0x1);     		//To avoid The frist FLAG error case
									//(The START bit is cleared in one ADC clock)
	while(! (rADCCON & 0x40));	//A/D转换是否结束?
		
	for(i=0;i<rADCPSR;i++);	//To avoid the second FLAG error case
			
	prevCh=ch;			// 将此时的通道号,作为相对下一次转换的上一次转换通道号 

	
	//Uart_Printf("ADCPSR=%03xh   ",rADCPSR);
	return rADCDAT;					//返回转换结果
}
/*****************************************************************************************
 <Author:>	Sun		<Creat time:>	6/21/2005
 
【功能说明】信号调理板控制程序
【参数说明】int parameter	选择138控制的门和采样保持器
【返回类型】0
******************************************************************************************/
int IOCtrl(int parameter)
{
	int a;	//138输入选择
	int b;	//138输入选择
	int c;	//138输入选择
	int data;
	int temp;
	
	switch ( parameter )						//通过parameter来确定138的三根选择线a,b,c
	{
		case 1:	c=0;	b=0;	a=0;	break;	//"DGTL_IN"
								
		case 2:	c=0;	b=0;	a=1;	break;	//"Switch_IN"
								
		case 3:	c=0;	b=1;	a=0;	break;	//"DGTL_OUT"
								
		case 4:	c=0;	b=1;	a=1;	break;	//"Switch_OUT"
								
		case 5:	c=1;	b=0;	a=0;	break;	//"S/H1"
								
		case 6:	c=1;	b=0;	a=1;	break;	//"S/H2"
		
		case 7:	c=1;	b=1;	a=0;	break;	//"S/H3"
		
		case 8:	c=1;	b=1;	a=1;	break;	//"S/H4"
	}
	
	//PORT F GROUP
	/*  Bit	8		7		6		5		 4		3		2		1		0		*/   
	/*  	IISCLK	IISDI	IISDO	IISLRCK	Output	Output	Output	IICSDA	IICSCL	*/
	/*		111		111		111		111		00		00		00		11		11		*/
	//11 1111 1111 1100 0000 1111 b=3FFC0FX;
	
	temp=(rPCONF & 0x3FFC0F);
	//PORT F GROUP
	/*  Bit	8		7		6		5		 4		3		2		1		0		*/   
	/*  	IISCLK	IISDI	IISDO	IISLRCK	Output	Output	Output	IICSDA	IICSCL	*/
	/*		000		000		000		000		01		01		01		00		00		*/
	//01 0101 0000 b=150X;
	
	rPCONF=temp+0x150;
	
	//PORT F GROUP
	/*  Bit	8		7		6		5		4		3		2		1		0		*/   
	/*		1		1		1		1		0		0		0		1		1		*/
	//111100011b=483d; a(bit2)2^2; b(bit4)2^4; c(bit3)2^3
	data=483;  

	temp=(rPDATF & data);
	
	data=b*16+c*8+a*4;
	
	rPDATF=temp+data;
	
	
	return 0;
}	
/*****************************************************************************************
<Author:>	Sun		<Creat time:>	6/18/2005

【功能说明】信号调理板数据总线输入输出控制
【参数说明】char IO		in & out
【返回类型

⌨️ 快捷键说明

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