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

📄 main.c

📁 可以在三星的ARM处理器s3c44b0上移植的bootLoader源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************/
//
// 44B0X Initilazation routine
// Modified by Strong Embeded Studio
//         www.8800.org
// If there are any concerns on the code
// go to www.8800.org for discussion
//
/****************************************************************************/

//***************************************************************************
#include <stdio.h>
#include <stdarg.h>
#include "inc\44b.h"
#include "inc\option.h"

//***************************************************************************
#define U32 unsigned int
#define U16 unsigned short
#define S32 int
#define S16 short int
#define U8  unsigned char
#define S8  char

//***************************************************************************
#define MVAL_USED (0)  
#define MVAL    (13)    
#define INVCLK    (0) 
#define INVFRAME  (0) 
#define INVLINE   (0)   
#define CLKVAL_SL (8)   //VCLK=MCLK/(CLKVAL*2)    (CLKVAL >= 2)
#define M5D(n) ((n) & 0x1fffff)
unsigned char Bmp[9600];    //

//***************************************************************************
//以下是实时时钟控制器初始化和运行所用到的:
#define RTC_YEAR0   (0x03)    //年
#define RTC_MONTH0    (0x02)    //月
#define RTC_DAY0    (0x0e)    //日
#define RTC_DATE0   (0x06)    //星期SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
#define RTC_HOUR0   (0x08)    //小时
#define RTC_MIN0    (0x08)    //分
#define RTC_SEC0    (0x08)    //秒

#define RTC_YEAR1   (0x03)  
#define RTC_MONTH1    (0x03)  
#define RTC_DAY1    (0x0e)    
#define RTC_DATE1   (0x06)    //SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
#define RTC_HOUR1   (0x08)    
#define RTC_MIN1    (0x08)    
#define RTC_SEC1    (0x08)    
//***************************************************************************

/****************************************************************************
Fout = (8 + M_DIV) * Fin / [ (2+P_DIV) * (2^S_DIV) ]
****************************************************************************/
void ChangePllValue(int mdiv,int pdiv,int sdiv)
{
    rPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;
}
//***************************************************************************

/****************************************************************************
【功能说明】通用延时函数,延时time个100us
****************************************************************************/
static int delayLoopCount = 400;
void Delay(int time)
{
  int i,adjust=0;
  if(time==0)
  {
    time=200;
    adjust=1;
    delayLoopCount=400;
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
    rWTDAT=0xffff;
    rWTCNT=0xffff;   
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);
  }
  for(;time>0;time--)
    for(i=0;i<delayLoopCount;i++);
  if(adjust==1)
  {
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
    i=0xffff-rWTCNT;
    delayLoopCount=8000000/(i*64);
  }
}
//***************************************************************************

/****************************************************************************
【功能说明】IO端口功能、方向设定
****************************************************************************/
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 = 0x3ff;	
	rPDATA = 0xfff;

	// 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 = 0xfff;
    
         //改动 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	*/
	/*	NC		NC		Uart1	Uart1	NC		NC		NC		NC	*/
	/*   01		01		11		11		01		01		01		01	*/

	/*  PC7		6		5		4		3		2		1		0	*/
	/*   o		o		o		o		o		o		o		o	*/
	/*   NC		NC		NC		NC		SMCALE	SMCCLE	SMCCE	SMCRB*/
	/*   01		01		01		01		01		01		01		01	*/
	rPDATC = 0x0000;	//All IO is low
	rPCONC = 0x5f555555;	
	rPUPC  = 0x3000;	//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		01		*/
	rPDATE	= 0x157;
	rPCONE	= 0x5568;	
	rPUPE	= 0xff;
	
	//PORT F GROUP
	/*  Bit8		7		6		5		 4		3		2		1		0		*/   
	/*  IISCLK	IISDI	IISDO	IISLRCK	Input	Input	Input	IICSDA	IICSCL	*/
	/*	100		010		010		001		00		01		01		10		10		*/
	rPDATF = 0x0;
	rPCONF = 0x22445a;
	rPUPF  = 0x1d3;

	//PORT G GROUP
	/*  BIT7		6		5		4		3		2		1		0	 */
	/*	INT7		INT6		INT5		INT4		INT3		INT2		INT1		INT0	*/
	/*    S3		S4		S5		S6		NIC		EXT		IDE		USB	*/
	/*      11      11      11      11      11      11      11      11       */
	rPDATG = 0xff;
	rPCONG = 0xFFFF;
	rPUPG  = 0x00;	//should be enabled  

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

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

	/*所有的外部硬件中断为低电平触发*/
	rEXTINT=0x0040;
}
//***************************************************************************

/****************************************************************************
【功能说明】四个LED 点亮/熄灭状态设置(LedStatus低四位电平高低对应着四个LED亮/熄)
****************************************************************************/
void Led_Display(int LedStatus)
{
  //改动 by yang 2003.5
  if((LedStatus&0x01)==0x01)    //PE7状态设置
    rPDATC=rPDATC&0x1f7;
  else
    rPDATC=rPDATC|0x8;
  
  if((LedStatus&0x02)==0x02)    //PE6状态设置
    rPDATC=rPDATC&0x1fb;
  else

    rPDATC=rPDATC|0x4;

  if((LedStatus&0x04)==0x04)    //PE5状态设置
    rPDATC=rPDATC&0x1fd;
  else
    rPDATC=rPDATC|0x2;

  if((LedStatus&0x08)==0x08)    //PE4状态设置
    rPDATC=rPDATC&0x1fe;
  else
    rPDATC=rPDATC|0x1;
}
//***************************************************************************

/****************************************************************************
【功能说明】LED来回闪烁显示 
****************************************************************************/
void Led_Disp(void)
{
  Led_Display(0x08);    //LED点亮/熄灭状态设置
  Delay(1000);    //延时若干个100us
  Led_Display(0x04);    //LED点亮/熄灭状态设置
  Delay(1000);    //延时若干个100us
  Led_Display(0x02);    //LED点亮/熄灭状态设置
  Delay(1000);    //延时若干个100us
  Led_Display(0x01);    //LED点亮/熄灭状态设置
  Delay(1000);    //延时若干个100us
  Led_Display(0x02);    //LED点亮/熄灭状态设置
  Delay(100);   //延时若干个100us
  Led_Display(0x04);    //LED点亮/熄灭状态设置
  Delay(1000);    //延时若干个100us
  Led_Display(0x08);    //LED点亮/熄灭状态设置
  Delay(1000);    //延时若干个100us
}
//***************************************************************************

/****************************************************************************
【功能说明】蜂鸣器鸣叫time个100us
****************************************************************************/
void Beep(unsigned int time)
{
  //改动 by yang  2003.5
  rPDATE = (rPDATE | 0x020);
  Delay(time);    //延时若干个100us
  rPDATE = (rPDATE & 0x1df);
}
//***************************************************************************

/****************************************************************************
【功能说明】检测四个按键,有任何一个按键按下就让蜂鸣器鸣叫,否则不鸣叫
****************************************************************************/
void Key_Speaker(void)
{
  //改动 by yang 2003.05
  unsigned int m ;
  m = rPDATG;
  if((m & 0xf0) < 0xf0) {rPDATE = (rPDATE | 0x020);}
  else  {rPDATE = (rPDATE & 0x1df);}
}
//***************************************************************************

/****************************************************************************
【功能说明】中断初始化
****************************************************************************/
void Isr_Init(void)
{
  rINTCON=0x5;        //Non-vectored,IRQ enable,FIQ disable //
  rINTMOD=0x0;        //All=IRQ mode//
  rINTMSK=~(BIT_GLOBAL);  //Default value=0x7ffffff//
}
//***************************************************************************

/****************************************************************************
【功能说明】异步串行口0初始化
****************************************************************************/
void Uart0_Init(int mclk,int baud)
{
    if(mclk == 0)
  mclk = MCLK;

    rUFCON0 = 0x0;     //禁止使用FIFO
    rUMCON0 = 0x0;     //禁止使用FIFO
    rULCON0 = 0x3;     //正常无奇偶校验,一个停止位,8个数据位
    rUCON0 = 0x245;    
   
   //改动 by yang 2003.5
    //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
    rUBRDIV0 = ( (int)(mclk/16./baud + 0.5) -1 );
    //UBRDIVn = ((int)(MCLK/16/baud + 0.5) -1)  波特率与系统主时钟计算公式
  Delay(1);   //延时若干个100us
}
//***************************************************************************

/****************************************************************************
【功能说明】异步串行口1初始化
****************************************************************************/
void Uart1_Init(int mclk,int baud)
{
    if(mclk == 0)
  mclk = MCLK;

    rUFCON1 = 0x0;     //禁止使用FIFO
    rUMCON1 = 0x0;     //禁止使用FIFO
    rULCON1 = 0x3;     //正常无奇偶校验,一个停止位,8个数据位
    rUCON1 = 0x245;
   
   //38400,
   //改动 by yang 2003.5
    //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
    rUBRDIV1 = ( (int)(mclk/16./baud + 0.5) -1 );
    //UBRDIVn = ((int)(MCLK/16/baud + 0.5) -1)  波特率与系统主时钟计算公式
  Delay(1);   //延时若干个100us
}
//***************************************************************************

/****************************************************************************
【功能说明】从串行口收取一个字符,ch为0从UART0收取,ch为1从UART1收取
****************************************************************************/
char Uart_Getch(U8 ch)
{
    if(ch == 0)
    {     
    while(!(rUTRSTAT0 & 0x1));    //等待直到接受到一个数据
    return rURXH0;
    }
    else
    {
    while(!(rUTRSTAT1 & 0x1));    //等待直到接受到一个数据
    return  rURXH1;
    }
}
//***************************************************************************

/****************************************************************************
【功能说明】检查串行口是否收到字符并返回,ch为0从UART0收取,ch为1从UART1收取
****************************************************************************/
char Uart_GetKey(U8 ch)
{
    if(ch == 0)
    {     
    if(rUTRSTAT0 & 0x1)   //如果收到字符就返回该字符
          return rURXH0;
    else  return 0;   //如果没有收到字符就返回0
    }
    else
    {
    if(rUTRSTAT1 & 0x1)   //如果收到字符就返回该字符
        return rURXH1;
    else  return 0;   //如果没有收到字符就返回0
    }
}
//***************************************************************************

/****************************************************************************
【功能说明】向串行口发送一个数据,ch为0向UART0发送,ch为1向UART1发送
****************************************************************************/
void Uart_SendByte(U8 ch,int data)
{
  if(ch == 0)
  {
    if(data == '\n')
    {
      while(!(rUTRSTAT0 & 0x2));
      
      //改动延时时间1--10
      Delay(10);    //由于超级终端反应较慢,有一个微小延迟
      WrUTXH0('\r');
    }
    while(!(rUTRSTAT0 & 0x2));    //等待知道THR变空
    //改动延时时间1--10
    Delay(10);
    rUTXH0 = data;
    }
  else
  {
    if(data == '\n')
    {
      while(!(rUTRSTAT1 & 0x2));
      //改动延时时间1--10
      Delay(10);    //由于超级终端反应较慢,有一个微小延迟
      rUTXH1 = '\r';
    }
    while(!(rUTRSTAT1 & 0x2));    //等待知道THR变空
    //改动延时时间1--10
    Delay(10);
    rUTXH1 = data;
    } 
}   
//***************************************************************************

/****************************************************************************
【功能说明】向串行口发送一个字符串,ch为0向UART0发送,ch为1向UART1发送
****************************************************************************/
void Uart_SendString(U8 ch,char *pt)
{
    while(*pt)    Uart_SendByte(ch,*pt++);
}
//***************************************************************************

/****************************************************************************
【功能说明】以标准格式printf向串行口发送一个字符串
ch为0向UART0发送,ch为1向UART1发送。(如果不用vsprintf代码会减小很多!)
****************************************************************************/
void Uart_Printf(U8 ch,char *fmt,...)

⌨️ 快捷键说明

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