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

📄 main.c.bak

📁 此程序为16位Flash擦除烧写的程序实例,可以在51和avr下的c语言跑通
💻 BAK
字号:
//******************************************************
//Chinese Academy of Sciences, Institute of Automation
//File Name:	main.c
//Description: 	Write flash,32bits model
//Author:	JuGuang,Li
//Date:		2004-3-20
//******************************************************	
#include "Def.h"
#include "s3c4510b_add.h"

#define AM_WORD_COUNT	    (64*1024)/2

#define AM_START_ADDR          0x0000000		//0x1100000	    
#define AM_ADDR_UNLOCK1        0x555
#define AM_ADDR_UNLOCK2        0x2aa
#define AM_DATA_UNLOCK1        0xaaaa
#define AM_DATA_UNLOCK2        0x5555
#define AM_SETUP_WRITE         0xa0a0
#define AM_SETUP_ERASE         0x8080
#define AM_CHIP_ERASE          0x1010
#define AM_SECTOR_ERASE	    0x3030

#define AM_RESET		    0xf0f0

#define AM_SECTOR_ADDR_01      	0x0000000
#define AM_SECTOR_ADDR_02      	0x0004000
#define AM_SECTOR_ADDR_03      	0x0006000
#define AM_SECTOR_ADDR_04      	0x0008000
#define AM_SECTOR_ADDR_05      	0x0010000
void Delay(unsigned int);

void InitUART(int Port,int Baudrate);
void PrintUART(int port,char *s);
void Chip_Erase(void);

//******************************************************************************
//功能简述:	首先擦除Flash,然后做整片的空白检测,最后将待烧写的内容写入Flash
//的0x0地址,待写入的内容首先下载到0x500000处,写入文件的大小不超过AM_WORD_COUNT的
//定义。
//******************************************************************************
int Main()
{	

	
		
	volatile UINT16 *from_add,*to_add,*address;
	int i;
	InitUART(0,0x500);
	PrintUART(0,"*******************************************************************************\n\r");
	PrintUART(0,"*                                                                             *\n\r");
	PrintUART(0,"*                  Beijing Winsilicon Technology Co., Ltd                     *\n\r");
	PrintUART(0,"*                                                                             *\n\r");
	PrintUART(0,"*                         http://www.winsilicon.com                           *\n\r");
        PrintUART(0,"*                    Tel: (86-10) 62968004   62969543-26                      *\n\r");
       	PrintUART(0,"*******************************************************************************\n\r");
	PrintUART(0,"Flash Erase,Please Wait...\r\n");
	Chip_Erase();
	Delay(100);
	PrintUART(0,"Blank Check...");
CHKB1:	         	
	Delay(1);
        for(address=(volatile UINT16 *)AM_SECTOR_ADDR_01;address<(volatile UINT16 *)AM_SECTOR_ADDR_05;address++)
		{
		if(*address!=0xffff)
			{goto CHKB1;}
		}	
	PrintUART(0,",OK!\r\n\r\n\r\n");
	
	PrintUART(0,"Program to Flash,Please wait...\r\n");
	
	
	to_add= (UINT16 *)0x0;
	from_add=(UINT16 *)0x500000;
	for(i=0;i<AM_WORD_COUNT;i++)
		{*((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;       
		*((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
		*((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_SETUP_WRITE;     
  		*to_add++ =*from_add++ ;
		PrintUART(0,".");}
	PrintUART(0,"\r\n\r\nFlash Programe Sucessfully,Please reset system!!!\n");
	return 0;	
}


void PrintUART(int Port,char *s)
{
	if(Port==0)
		for(;*s!='\0';s++)
			{for(;(!(USTAT0&0x40)););
			UTXBUF0=*s;}
	if(Port==1)
		for(;*s!='\0';s++)
			{for(;(!(USTAT1&0x40)););
			UTXBUF1=*s;}			
}

void InitUART(int Port,int Baudrate)
{
	if(Port==0)
		{ULCON0=0x03;
		UCON0=0x09;
		UBRDIV0=Baudrate;   
		}
	if(Port==1)
		{ULCON1=0x03;
		UCON1=0x09;
		UBRDIV1=Baudrate;   
		}

}
//******************************************************************************
//功能简述:	发送整片Flash擦除命令。
//******************************************************************************
void Chip_Erase()
{
	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;       
	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_SETUP_ERASE;     
    	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;       
	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
  	*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_CHIP_ERASE;	
}

void Delay(unsigned int x)
{
	unsigned int i,j,k;
	for(i=0;i<=x;i++)
		for(j=0;j<0xff;j++)
			for(k=0;k<0xff;k++);
}

⌨️ 快捷键说明

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