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

📄 main.c

📁 DM643x Bootloader Flash烧写程序Flash=S29GL512N
💻 C
字号:
/*
 *  Copyright 2007 
 *  All rights reserved. 
 *
 */

/*
 *  DM643x Bootloader Flash烧写程序
 *	Flash=S29GL512N
 */

#include "stdio.h"
#include "evmdm6437.h"

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  main( )                                                                 *
 *                                                                          *
 * ------------------------------------------------------------------------ */
void initemifcs2(void);

void EraseWholeChip();
void WriteFlash(Uint8 *src, Uint32 dst, Uint32 length);
void ReadFlash(Uint32 addr, Uint8* retval, Uint32 length);
void EraseOneSector(Uint32 addr);

#define FLASH_START			0x42000000
#define FLASH_SECTOR2		0x42020000
#define FLASH_SECTOR7		0x4201C000 //0x42000000|(0x07<<14) //用CS2片选
#define FLASH_SIZE			0x20000
#define FLASH_ADR_555		(FLASH_START|0x55555)
#define FLASH_ADR_AAA		(FLASH_START|0xAAAAA)
#define FLASH_KEY_AA		0xAA
#define FLASH_KEY_55		0x55
#define FLASH_KEY_80		0x80
#define FLASH_KEY_10        0x10
#define FLASH_KEY_A0		0xA0
#define FLASH_KEY_30		0x30


void main( void )
{
    Uint32 i;
    initemifcs2();

	//EraseOneSector(FLASH_START);//Flash不为空,可以擦除第1段
	//EraseOneSector(FLASH_SECTOR2);//装不下时擦除第2段
    i++;//断点1等待,并装载数据进来
    //
    WriteFlash((Uint8 *)0x81000000,FLASH_START,0x007CB);
											//改这个长度
	i++;//断点2等待5S
    //ReadFlash(FLASH_START,inbuff,TESTLEN);
    //i++;//断点等待5S
	
}

void initemifcs2(void)
{
    //时钟默认为倍频后的1/6,默认时:EMIF=cpu clock/6=594MHz/6=99MHz
    Uint32 emif_max_timeout = 0
        | ( 0  << 31 )      // Select Strobe    [ Normal ]
        | ( 0  << 30 )      // Extended Wait    [ Disabled ]
        | ( 15 << 26 )      // Write Setup      [ 151.5 ns ]
        | ( 63 << 20 )      // Write Strobe     [ 313.1 ns ]原来31
        | ( 7  << 17 )      // Write Hold       [  70.7 ns ]
        | ( 15 << 13 )      // Read Setup       [ 151.5 ns ]
        | ( 63 << 7 )       // Read Strobe      [ 313.1 ns ]原来31
        | ( 7  << 4 )       // Read Hold        [  70.7 ns ]
        | ( 3  << 2 )       // Turn Around      [  30.3 ns ]
        | ( 0  << 0 )       // Bus Size         [ 8-bit Bus ]
        ;
    AEMIF_A1CR = emif_max_timeout;
    AEMIF_NANDFCR &= ~( 1 << 0 );       // NAND Flash [ OFF ]
}


//擦除整片
void EraseWholeChip()//
{

    *(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_AA;
    *(Uint8 *)FLASH_ADR_555 = FLASH_KEY_55;
    *(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_80;
    *(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_AA;
    *(Uint8 *)FLASH_ADR_555 = FLASH_KEY_55;
    *(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_10;
	_wait(0xffffff);
}
//擦除一个段,需要加上DSP基地址
void EraseOneSector(Uint32 addr)
{
	*(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_AA;
    *(Uint8 *)FLASH_ADR_555 = FLASH_KEY_55;
    *(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_80;
    *(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_AA;
    *(Uint8 *)FLASH_ADR_555 = FLASH_KEY_55;
    *(Uint8 *)addr			= FLASH_KEY_30;//sector擦除命令
	_wait(0xffffff);

}
//把长度为length、起始地址为src的数据,烧到起始地址为dst的flash中
void WriteFlash(Uint8 *src, Uint32 dst, Uint32 length)
{
    Uint8 *psrc, *pdst;
    Uint32 i;

    if (length<=0)return;
	length<<=2;
    /* Establish source and destination */
    psrc = src;
    pdst = (Uint8 *)dst;
    for (i = 0; i < length; i++)
    {
        // Program one 8-bit word
        *(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_AA;
        *(Uint8 *)FLASH_ADR_555 = FLASH_KEY_55;
        *(Uint8 *)FLASH_ADR_AAA = FLASH_KEY_A0;
        *pdst = *psrc;
        // Wait for operation to complete
        //timeout=-1;
        while (1)
        {
            if (*pdst == *psrc) break;
        }
        asm(" nop 9");
        pdst++;
        psrc++;
    }
}

void ReadFlash(Uint32 addr, Uint8* retval, Uint32 length)
{
    Uint32 i=0;
    for(i=0;i<length;i++)retval[i]=*(Uint8*)(addr+i);
}

⌨️ 快捷键说明

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