📄 main.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 + -