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

📄 romprg.c

📁 armS3C44B0X引导启动和烧写的例子程序
💻 C
字号:
#include "option.h"
#include "44b.h"
#include "def.h"
//#include "romdef.h"
//#include "stdio.h"
//#include "stdlib.h"

#define FLASH_START_ADDR    0X0000
#define FLASH_ADDR_UNLOCK1  0X5555
#define FLASH_ADDR_UNLOCK2  0X2AAA
#define FLASH_DATA_UNLOCK1  0XAAAA
#define FLASH_DATA_UNLOCK2  0X5555
#define FLASH_DATA_WRITE    0XA0A0
#define FLASH_ERASE         0X8080
#define FLASH_ERASE_SECTOR  0X3030
#define FLASH_ERASE_BLOCK   0X5050
#define FLASH_ERASE_CHIP    0X1010
#define FLASH_SID_QUERY     0X9090
#define FLASH_CFI_QUERY     0X9898
#define FLASH_SID_EXIT      0XF0F0
#define FLASH_OP_TIMEOUT    0Xffff

#define LED_PORTC10 	(1<<10)
#define LED_PORTC11		(1<<11)	
#define RAM_ADDR 		0xc000000



void (*Run)(void) = (void (*)(void))RAM_ADDR;
void infoFlash(void);
int wait_flash_ready ( INT16U *address, INT16U data );
int writeFlash(INT16U *Address,INT16U Data);
int eraseSector(INT16U* SectorAddr);
int eraseChip(void);

void PortInit(void);
void LedDisp(int LedStatus);

//*****************************************
//		ARM引导程序
//*****************************************
void Main(void)
{	INT32U k ;
    INT16U *pdist,*psrc;
	rSYSCFG=CACHECFG;
	PortInit();	
	//CopyFromFlashToRam((INT32U*)0x10000, (INT32U*)0xc000000, 0x1F0000);	
	//Run();	//程序由内存引导运行
	//while(1);
	//edit by winglion,try led control

	//infoFlash();
	eraseChip();
	psrc=(INT16U *)0xc300000;
	//for(k=1;k<0x8001;k++)
	//   *ptr++=k;
	for(k=0;k<0x4000;k++)
	 *psrc++=0x0; //clear ram
	psrc=(INT16U *)0xc300000;
	pdist=(INT16U *)0x0;
	for(k=0;k<0x4000;k++)  //write 8 k ram to flash
    	writeFlash(pdist++,*psrc++);
	//eraseSector(0x0000);

	while(1)
		{
		    LedDisp(0);
			for(k=0;k<(200*1024);k++);
			LedDisp(2);	
			for(k=0;k<(200*1024);k++);//light one led afte finish
		}
}


//*****************************************
//		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
}

//*****************************************
//		查FLASH信息
//*****************************************
void infoFlash()
{
    int i,j;
    INT16U *pFlash;
    *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_SID_QUERY; 
    for(i=0;i<(2*1024);i++);//WAIT SOME 150 NS
    pFlash=FLASH_START_ADDR;
    i=0;j=0;
    i=(INT16U)*pFlash++;
    j=(INT16U)*pFlash; 	
    //exit soft id query mode
    *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_CFI_QUERY;
    pFlash=(INT16U *)(FLASH_START_ADDR+(0X2F)); 
   // i=(INT16U)*pFlash++;    
    *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
}
//*****************************************
//		擦除整个flash
//*****************************************
int eraseChip()
{
    *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_ERASE; 
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_ERASE_CHIP;
    if( wait_flash_ready((INT16U *)FLASH_START_ADDR,0xffff) )
      return 1;
    else return 0;
}
//*****************************************
//		erase one sector
//*****************************************
int eraseSector(INT16U* SectorAddr)
{
    *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_ERASE; 
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
    *SectorAddr=FLASH_ERASE_SECTOR;
    if(wait_flash_ready(SectorAddr,0xffff))
      return 1;
    else return 0;
}
//*****************************************
//		写falsh
//*****************************************
int writeFlash(INT16U *Address,INT16U Data)
{   *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
    *((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_WRITE; 
    *Address=Data;
    if(wait_flash_ready(Address,Data))
      return 1;
    else return 0;
}

//*****************************************
//		wait for operation finish
//*****************************************
int wait_flash_ready ( INT16U *address, INT16U data )
{
   static INT32U tmp;
   volatile INT16U *p;
   tmp =0xfff;
   p=address;
	while(((*p)&0x8080)!=(data&0x8080))
	{tmp--;
	 if (tmp==0x0)
	     return 1;  // timeout
	}
	return 0;
}

⌨️ 快捷键说明

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