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

📄 flash_prg.c

📁 SEED6416系列FLASH(SSTVF400A)烧写程序代码
💻 C
字号:
/*****************************************************************************
	FILENAME:	FLASH_PRG.C
	DESIGNER:	戴展波
	DATE:		2004/11/10
******************************************************************************/

#include <stdio.h>
#include <csl.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_emifb.h>
#include <csl_irq.h>
#include "flash.h"
#include "flash_timer.h"

static EMIFB_Config MyEmifbConfig = 
{
	EMIFB_GBLCTL_RMK
	(
		EMIFB_GBLCTL_EK2RATE_FULLCLK,	//1 X EMIF input clock
		EMIFB_GBLCTL_EK2HZ_CLK,		//eclkout2 continue output during hold
		EMIFB_GBLCTL_EK2EN_ENABLE,	//eclkout2 enable output
		EMIFB_GBLCTL_BRMODE_MRSTATUS,	//bus request is memory access or refresh pending/in progress
		EMIFB_GBLCTL_NOHOLD_ENABLE,
		EMIFB_GBLCTL_EK1HZ_CLK,		//eclkout1 continue output during hold
		EMIFB_GBLCTL_EK1EN_ENABLE	//eclkout1 enable output
	),
	0x22a28a22,
	0xffffff0f,
//	0x20a0c402,
	0x22a28a22,
	0x22a28a22,
	EMIFB_SDCTL_DEFAULT,
	EMIFB_SDTIM_DEFAULT,
	EMIFB_SDEXT_DEFAULT,
	0x00000002,
	0x00000002,
	0x00000002,
	0x00000002
};

unsigned int boot_addr = 0x64000000;
Uint32 k;

extern far void vectors();

void main()
{
	unsigned int i;
	//初始化CSL
	CSL_init();
	//配置EMIFA
	EMIFB_config(&MyEmifbConfig);
	//设置中断矢量表地址
	IRQ_setVecs(vectors);
	//NMI使能
    	IRQ_nmiEnable();
    	//开总中断
    	IRQ_globalEnable();
    	//整片擦除
    	flash_erase(0,0x10);
    	for(i = 0; i < 0xffff; i++);
    	//在地址0x64000000处写BOOT
    	for(i = 0; i < BOOT_SECTION_SIZE; i++)
    	{
    		flash_writes(boot_addr++,*((unsigned char *)(BOOT_SECTION_ADDRESS+i)));
    	}
    	//在地址0x64000400处写ENTRY_POINT
    	flash_writes(boot_addr++,ENTRY_POINT>>24);
    	flash_writes(boot_addr++,ENTRY_POINT>>16);
    	flash_writes(boot_addr++,ENTRY_POINT>>8);
    	flash_writes(boot_addr++,ENTRY_POINT);
    	
    	//cinit段长度
    	flash_writes(boot_addr++,CINIT_SECTION_SIZE>>24);
    	flash_writes(boot_addr++,CINIT_SECTION_SIZE>>16);
    	flash_writes(boot_addr++,CINIT_SECTION_SIZE>>8);
    	flash_writes(boot_addr++,CINIT_SECTION_SIZE);
    	
    	//cinit段在RAM中的地址
    	flash_writes(boot_addr++,CINIT_SECTION_ADDRESS>>24);
    	flash_writes(boot_addr++,CINIT_SECTION_ADDRESS>>16);
    	flash_writes(boot_addr++,CINIT_SECTION_ADDRESS>>8);
    	flash_writes(boot_addr++,CINIT_SECTION_ADDRESS);
    	
    	//cinit段的数据
    	for(i = 0; i < CINIT_SECTION_SIZE; i++)
    	{
    		flash_writes(boot_addr++,*((unsigned char *)(CINIT_SECTION_ADDRESS+i)));
    	}
    	
    /*	//text段长度
    	flash_writes(boot_addr++,TEXT_SECTION_SIZE>>24);
    	flash_writes(boot_addr++,TEXT_SECTION_SIZE>>16);
    	flash_writes(boot_addr++,TEXT_SECTION_SIZE>>8);
    	flash_writes(boot_addr++,TEXT_SECTION_SIZE);
    	
    	//cinit段在RAM中的地址
    	flash_writes(boot_addr++,TEXT_SECTION_ADDRESS>>24);
    	flash_writes(boot_addr++,TEXT_SECTION_ADDRESS>>16);
    	flash_writes(boot_addr++,TEXT_SECTION_ADDRESS>>8);
    	flash_writes(boot_addr++,TEXT_SECTION_ADDRESS);
    	
    	//cinit段的数据
    	for(i = 0; i < TEXT_SECTION_SIZE; i++)
    	{
    		flash_writes(boot_addr++,*((unsigned char *)(TEXT_SECTION_ADDRESS+i)));
    	}*/
    	
    	//table end
    	for(i = 0; i < 3; i++)
    	{
    		flash_writes(boot_addr++,TABLE_END>>24);
    		flash_writes(boot_addr++,TABLE_END>>16);
    		flash_writes(boot_addr++,TABLE_END>>8);
    		flash_writes(boot_addr++,TABLE_END);
    	}

    	//从0x64000000地址开始,读出长度为0x1000的数据到DATA
	//flash_readm(0x64000000,&data[0],0x1000);
	for(;;)
	{
		printf("flash program is over!");
		exit();
	}
	
}

Uint32 flash_erase(Uint32 addr,unsigned char type)
{
	Uint32 i,j;
	*FLASH_5555 = FLASH_UL1;	//first
	*FLASH_2AAA = FLASH_UL2;	//second
	*FLASH_5555 = FLASH_UL3;	//third
	*FLASH_5555 = FLASH_UL4;
	*FLASH_2AAA = FLASH_UL5;
	switch(type)
	{
		case 0x50:		//block erase
			*(unsigned char *)addr = type;
			while((*(unsigned char *)addr & 0x80) != 0x80);
			for(i = 0; i < BLOCK_SIZE; i++)
			{
				if(*(unsigned char *)(addr + i) != 0xffff)
				{
					j = 0;
					break;
				}
			}
			j = 1;
			break;
		
		case 0x30:		//sector erase
			*(unsigned char *)addr = type;
			while((*(unsigned char *)addr & 0x80) != 0x80);
			for(i = 0; i < SECTOR_SIZE; i++)
			{
				if(*(unsigned char *)(addr + i) != 0xffff)
				{
					j = 0;
					break;
				}
			}
			j = 1;
			break;
			
		case 0x10:		//chip erase
			*FLASH_5555 = type;
			while((*FLASH_5555 & 0x80) != 0x80);
			for(i = 0; i < CHIP_SIZE; i++)
			{
				if(*(unsigned char *)(addr + i) != 0xffff)
				{
					j = 0;
					break;
				}
			}
			j = 1;
			break;
		
		default:
			break;
	}
	return (j);
}

void flash_writes(Uint32 addr,unsigned char data)
{
	*FLASH_5555 = FLASH_UL1;
	*FLASH_2AAA = FLASH_UL2;
	*FLASH_5555 = FLASH_PROGRAM;
	*(unsigned char *)addr = data;
	while(*(unsigned char *)addr != data);
}

void flash_writem(Uint32 addr,unsigned char *ptr,unsigned int length)
{
	Uint32 i;
	for(i  = 0; i < length; i++)
	{
		flash_writes(addr+i,*(ptr+i));
		//for(k = 0; k < 0xfff; k++);
	}
}

Uint32 flash_reads(Uint32 addr)
{
	return (*(unsigned char *)addr);
}

void flash_readm(Uint32 addr,unsigned char *ptr,unsigned int length)
{
	Uint32 i;
	for(i = 0; i < length; i++)
	{
		*(ptr + i) = flash_reads(addr+i);
	}
}

⌨️ 快捷键说明

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