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

📄 romprg.c

📁 用来给ARM烧写程序的程序,可以把编译链接好的机器码烧写到ARM里面(三星的S3C44B0x),其它的ARm处理器也可以参考.
💻 C
字号:
#include "option.h"
#include "44b.h"
#include "romdef.h"
#include "def.h"
#include "stdio.h"
#include "stdlib.h"

#define LED_PORTC10 	(1<<10)
#define LED_PORTC11		(1<<11)
#define _WR(ulADDR,usDATA)	*((INT16U *)(ulADDR<<1))=(INT16U)usDATA		//the addr should be shifted
#define _RD(ulADDR)		(*((INT16U *)(ulADDR<<1)))	
#define _RESET()		_WR(0x0,0xf0f0)		
//#define BADDR2WADDR(ulADDR)	(ulADDR>>1)		

void LedDisp(int LedStatus);
void PortInit(void);
INT8U SST39VF160_ChipProg(INT32U ulRomAddr, INT32U ulRamAddr, INT32U ulRomSize);

//*****************************************
//		ARM烧写主程序
//*****************************************
void Main(void)
{	
	rSYSCFG=CACHECFG;
	PortInit();
	SST39VF160_ChipProg(0x0,0x0c200000,RomSize);
	LedDisp(0x03);
	while(1);
}

//*****************************************
//		ARM端口初始化
//*****************************************
void PortInit(void)
{
	//	PORTC GROUP 
	//	LED2->PC11   LED1->PC10	
	// 	15   		14    	13 		12  		11 		10 		9 		8		7		6		5		4		3		2		1		0		
	//  	INPUT	INTPUT	RXD1 	TXD1 	OUTPUT	OUTPUT	OUTPUT	OUTPUT	VD4		VD5		VD6		VD7		OUTPUT	OUTPUT	OUTPUT	INPUT										*/ 
	//  	00		00		11		11		01		01		01		01		11		11		11		11		01		01		01		00		
	rPDATC = 0xffff;		//All IO is high
	rPCONC = 0x0f55ff54;	
	rPUPC  = 0x3000;		//PULL UP RESISTOR should be enabled to I/O
}

//*****************************************
//		发光二极管显示程序
//*****************************************
void LedDisp(int LedStatus)
{
	if((LedStatus&0x01)==0x01)
		rPDATC &= (~LED_PORTC10);	//LED ON
	else
		rPDATC |= LED_PORTC10;		//LED OFF
	
	if((LedStatus&0x02)==0x02)
		rPDATC &=(~LED_PORTC11);	//LED ON
	else
		rPDATC |=LED_PORTC11;		//LED OFF
}


//*****************************************
//		检验SST39VF160指定地址的内容
//*****************************************
INT8U CheckBlank(INT32U ulRomAddr,INT32U ulRomSize) 
{
	INT32U i;
	for (i=ulRomAddr;i<(ulRomAddr+ulRomSize);i+=4)
	{
		if(*((volatile INT32U *)i)!=0xffffffff)
			return 0;
	}
	return 1;	//every cell is 0xffffffff
}

//*****************************************
//		验证SST39VF160 和SDRAM 指定地址的内容
//*****************************************
INT8U Verify(INT32U ulRomAddr,INT32U ulRamAddr,INT32U ulRomSize)
{
	INT32U i;
	for (i=0x0;i<ulRomSize;i+=4)
	{
		if(*((volatile INT32U *)(i+ulRomAddr))!=*((volatile INT32U *)(i+ulRamAddr)))
			return 0;	//the data is ROM and RAM is different!
	}	
	return 1;
}

//*****************************************
//		等待BIT6 toggle
//*****************************************
INT8U _WAIT(void) //Check if the bit6 toggle ends.
{
	volatile INT16U flashStatus,old;
	old=*((volatile INT16U *)0x0);

	while(1)
	{
		flashStatus=*((volatile INT16U *)0x0);
		if( (old&0x1000) == (flashStatus&0x1000) )
			break;
		old=flashStatus;
	}
	return 1;
}

//*****************************************
//		获取SST39VF160 版本号
//*****************************************
INT32U SST39VF160_CheckId(void)
{
	INT16U usManId,usDevId;

	_RESET();
    
	_WR(SeqAddr1,SeqCom1);
	_WR(SeqAddr2,SeqCom2);
	_WR(SeqAddr1,SoftIdEntry);
	usManId=_RD(ManuIdAddr);
	usDevId=_RD(DevIdAddr);

	_RESET(); 
    
	return ((usManId<<16)+usDevId);
}

//*****************************************
//		向SST39VF160 指定地址写数据

⌨️ 快捷键说明

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