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

📄 44blib.c

📁 基于ARM应用的源码
💻 C
字号:
#include "44B.h"
#include "44BLib.h"
#include "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//

volatile unsigned char *downPt;
unsigned int fileSize;

//--------------------------------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------------------------------//
void Port_Init(void)
{
	//SMDK41100 B/D Status
    //LED D5  D6
    //	  PB9 PB10
    //S/W S4  S5 
    //	  PG5 PG4

    //CAUTION:Follow the configuration order for setting the ports. 
    // 1) setting value 
    // 2) setting control register 
    // 3) configure pull-up resistor.  
	     
    //16bit data bus configuration  
    //PORT A GROUP
    //ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0		      
    //     0,     0,	 1,     1,     1,     1,     1,	    1,     1,    1
    rPCONA=0xff;	

    //PORT B GROUP
    //OUT OUT nGCS3 nGCS2 nGCS1 nWBE3 nWBE2 nSRAS nSCAS SCLK SCKE
    //  1,  1,    1,	1,    1,    1,    1,	1,    1,   1,   1
    
    rPCONB=0x7ff;
    
    //PORT C GROUP
    rPCONC=0xffff0055;	
//    rPUPC=0xff1f;
    rPUPC=0x0;	//pull_up

    //PORT D GROUP
    //VFRAME VM VLINE VCLK VD3 VD2 VD1 VD0
    //    10,10,   10,	10, 10,	10, 10,	10  
    rPCOND=0x0;	
    rPUPD=0x0;

    //PORT E GROUP
    //PE0:FOUT, PE1:TxD0, PE2:RxD0, athers input
    //	    11        10,       10, 0    
    rPCONE=0x55a9;	
    rPUPE=0xff;	

    //PORT F GROUP
    //All input
    //    0x0
    rPCONF=0x10;
    rPUPF=0x3;
	rPDATF=0x0;
    rPDATF=0x4;
    rPDATF=0x0;
    rPDATF=0x4;
   
    //PORT G GROUP
    //All input
    //	  0x0

    rPCONG=0x00;
    rPUPG=0x00;	 
    
    rSPUCR=0x3;  //pull-up disable

    rEXTINT=0x22222222;  //All EINT[7:0] will be falling edge triggered.
}

/************************* UART ****************************/
static int whichUart=0;

void Uart_Init(int mclk,int baud)
{
    int i;
    if(mclk==0)
	mclk=MCLK;

//UART0
    rUFCON0=0x0;	// 不允许 FIFO 缓冲
    rUMCON0=0x0;
    rULCON0=0x03;	// 普通模式:无奇偶校验、1个停止位、8个数据位
    rUCON0=0x245;	// rx=edge,tx=level,禁止超时中断、允许RX错误中断,normal,interrupt or polling
    rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );
//UART1
    rUFCON1=0x0;
    rUMCON1=0x0;
    rULCON1=0x03;
    rUCON1=0x245;
    rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );

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

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

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

void Uart_SendByte(int data)
{
	if(whichUart==0)
    {
		while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
		Delay(10);
		WrUTXH0(data);
   	}
	else
    {
		while(!(rUTRSTAT1 & 0x2));  //Wait until THR is empty.
		Delay(10);
		rUTXH1=data;
    }		
}		
/******************** S3C44B0X EV. BOARD LED **********************/

void Led_Display(int LedStatus)
{
	if((LedStatus&0x01)==0x01)
		rPDATE=rPDATE&0x17f;
	else
		rPDATE=rPDATE|0x80;
	
	if((LedStatus&0x02)==0x02)
		rPDATE=rPDATE&0x1bf;
	else
		rPDATE=rPDATE|0x40;

	if((LedStatus&0x04)==0x04)
		rPDATE=rPDATE&0x1df;
	else
		rPDATE=rPDATE|0x20;

	if((LedStatus&0x08)==0x08)
		rPDATE=rPDATE&0x1ef;
	else
		rPDATE=rPDATE|0x10;
}

/************************* 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)
{
    rWTCON=((MCLK/1000000-1)<<8);
    return (0xffff-rWTCNT);
}

void Beep(int BeepStatus)
{
	if (BeepStatus==0)
		rPDATE=rPDATE|0x8;
	else
		rPDATE=rPDATE&0x1f7;

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

/************************* General Library **********************/
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 + -