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

📄 flash_prg.c

📁 dsp中的flash烧写
💻 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
};*/
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,//ce0
  //  0x20a0c402,
 // 0x1051c4B1,//ce0
 // 0xffffff0f,//ce1
//    0x1051c401,//ce1
 	0x20a0c402,//ce1
    0x1051c4B1,
	0x1051c4B1,//用到CE3
    EMIFB_SDCTL_DEFAULT,
    EMIFB_SDTIM_DEFAULT,
    EMIFB_SDEXT_DEFAULT,
  	0x00000002,
	0x00000002,
	0x00000002,
	0x00000002
/*	0x00000031,
	0x00000031,
	0x00000031,
	0x00000031 //用到CE3*/
};

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();
    	//整片擦除
    	C6416_FLASH_erase(C6416_FLASH_BASE,C6416_FLASH_PAGESIZE);
    	for(i = 0; i < 0xffff; i++);
    	//在地址0x64000000处写BOOT
    	for(i = 0; i < BOOT_SECTION_SIZE; i++)
    	{
    		C6416_FLASH_write(boot_addr++,*((unsigned char *)(BOOT_SECTION_ADDRESS+i)));
    	}
    	//在地址0x64000400处写ENTRY_POINT
    	C6416_FLASH_write(boot_addr++,ENTRY_POINT>>24);
    	C6416_FLASH_write(boot_addr++,ENTRY_POINT>>16);
    	C6416_FLASH_write(boot_addr++,ENTRY_POINT>>8);
    	C6416_FLASH_write(boot_addr++,ENTRY_POINT);
    	
    	//cinit段长度
    	C6416_FLASH_write(boot_addr++,CINIT_SECTION_SIZE>>24);
    	C6416_FLASH_write(boot_addr++,CINIT_SECTION_SIZE>>16);
    	C6416_FLASH_write(boot_addr++,CINIT_SECTION_SIZE>>8);
    	C6416_FLASH_write(boot_addr++,CINIT_SECTION_SIZE);
    	
    	//cinit段在RAM中的地址
    	C6416_FLASH_write(boot_addr++,CINIT_SECTION_ADDRESS>>24);
    	C6416_FLASH_write(boot_addr++,CINIT_SECTION_ADDRESS>>16);
    	C6416_FLASH_write(boot_addr++,CINIT_SECTION_ADDRESS>>8);
    	C6416_FLASH_write(boot_addr++,CINIT_SECTION_ADDRESS);
    	
    	//cinit段的数据
    	for(i = 0; i < CINIT_SECTION_SIZE; i++)
    	{
    		C6416_FLASH_write(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++)
    	{
    		C6416_FLASH_write(boot_addr++,TABLE_END>>24);
    		C6416_FLASH_write(boot_addr++,TABLE_END>>16);
    		C6416_FLASH_write(boot_addr++,TABLE_END>>8);
    		C6416_FLASH_write(boot_addr++,TABLE_END);
    	}

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

void C6416_FLASH_erase(Uint32 start, Uint32 length)
{
    Int16 i;
    Uint8 *pdata;
    Uint32 sector_base, end;
    
    /* Calculate extents of range to erase */
    end = start + length - 1;
    
    /* Walk through each sector, erase any sectors within range */
    sector_base = C6416_FLASH_BASE;
    for (i = 0; i < C6416_FLASH_SECTORS; i++)
    {
        if ((start <= sector_base) && (sector_end[i] <= end))
        {
            /* Start sector erase sequence */
            *((Uint8 *)C6416_FLASH_BASE) = 0xaa;
            *((Uint8 *)C6416_FLASH_BASE) = 0x55;
            *((Uint8 *)C6416_FLASH_BASE) = 0x80;
            *((Uint8 *)C6416_FLASH_BASE) = 0xaa;
            *((Uint8 *)C6416_FLASH_BASE) = 0x55;
            
            /* Start erase at sector address */
            pdata = (Uint8 *)sector_base;
            *pdata = 0x30;
            
            /* Wait for erase to complete */
            while (1)
            {
                if (*pdata & 0x80)
                {
                printf("ok\n");
                    break;
                }
             }       
            /* Put back in read mode */
            *((Uint8 *)C6416_FLASH_BASE) = 0xf0;                    
        }
        
        /* Advance to next sector */
        sector_base = sector_end[i] + 1;
    }
}

void C6416_FLASH_write(Uint32 addr,unsigned char data)
{
   *((Uint8 *)C6416_FLASH_BASE) = FLASH_UL1;
   *((Uint8 *)C6416_FLASH_BASE) = FLASH_UL2;
   *((Uint8 *)C6416_FLASH_BASE) = FLASH_PROGRAM;
   *(unsigned char *)addr = data;
	while(*(unsigned char *)addr != data);
}

⌨️ 快捷键说明

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