笔者要介绍的方法与上述两个方法不同。根据SST39VF160的时序,编写一个搬运程序,注意与DSP的BOOT程序的区别,这里的搬运程序是将在CCS中打开的工程的内容原封不动的搬到FLASH中,如此完成FLASH的烧写。根据这个思想,需要编写两个工程:一个主程序工程(即用户应用程序,其中包括二次引导程序),一个搬运程序工程。搬移程序不能使用与主程序的程序空间和中断向量表重合的物理空间,以免覆盖。烧写时,同时打开主程序和搬移程序的PROJECT,先LOAD主程序,再LOAD搬移程序,然后执行搬移程序,烧写OK!
(分别编写project(项目本身用)和writer(烧写用)两个工程,并且通过CCS进行load后,就可以实现了。但是project的内容比较少,所以project和writer都可以放在RAM中,而我的问题在于project很大,RAM放不下project和writer,怎么办? )
该方法应该是最简单的方法,只要在搬运程序中合理的调用下面列出的子程序,即可完成FLASH的擦除与编程。
1)FLASH擦除子程序
FLASH编写之前,应对FLASH进行擦除,使其每个数据位恢复1状态,即全FF状态。 void erase_flash() {
*(unsigned volatile char*)FLASH_ADR1=0x00aa; *(unsigned volatile char*)FLASH_ADR2=0x0055; *(unsigned volatile char*)FLASH_ADR1=0x0080; *(unsigned volatile char*)FLASH_ADR1=0x00aa; *(unsigned volatile char*)FLASH_ADR2=0x0055; *(unsigned volatile char*)FLASH_ADR1=0x0010; delay();
}
这里FLASH_ADR1代表0x64005555、FLASH_ADR2代表0x64002AAA。
2) FLASH单字编程子程序
void Program_One_Word (BYTE SrcWord, BYTE *Dst) {
BYTE *DestBuf; BYTE *Temp; DestBuf = Dst;
Temp = (BYTE *)((WORD)FLASH_START+(0x5555)); *Temp = 0xAA;
Temp = (BYTE *)((WORD)FLASH_START+(0x2AAA)); *Temp = 0x55;
Temp = (BYTE *)((WORD)FLASH_START+(0x5555)); *Temp = 0xA0;
*DestBuf = SrcWord;
Check_Toggle_Ready(DestBuf); }
void Check_Toggle_Ready (BYTE *Dst) {
BYTE Loop = TRUE; BYTE PreData; BYTE CurrData;
unsigned long TimeOut = 0;
PreData = *Dst;
PreData = PreData & 0x4040;
while ((TimeOut< 0x07FFFFFF) && (Loop)) {
CurrData = *Dst;
CurrData = CurrData & 0x4040; if (PreData == CurrData) Loop = FALSE; PreData = CurrData; TimeOut++; }
}
合众达FLASH测试程序 erase,Writes/Writem,Read/Readm
#include
#include \
/********************************************************************************/
Uint16 Data_Buffer[0x1000]; Uint16 Temp_Buffer[0x1000]; Uint32 i;
extern far void vectors();
/********************************************************************************/ /********************************************************************************/ void main() {
CSL_init(); /* Initialize CSL, must when using. */
DEC6713_init(); /* Initialize DEC6713 board. */
IRQ_setVecs(vectors); /* Configure interrupt. */
IRQ_nmiEnable(); IRQ_globalEnable();
/* Erase flash memory. */
Flash_Erase(0x90000000,0x10); printf(\
/* Initialize data. */
for(i = 0; i < 0x1000; i++) {
Data_Buffer[i] = i; }
/* Write flash memory. */
Flash_Writem(0x90000000,&Data_Buffer[0],0x1000); printf(\
/* Read flash memory. */
Flash_Readm(0x90000000,&Temp_Buffer[0],0x1000); printf(\
/* Compare data. */
for(i=0;i<0x100;i++) {
if(Temp_Buffer[i] != Data_Buffer[i]) {
printf(\ } }
printf(\}
/********************************************************************************\\ \\* Flash function difine. *\\
\\********************************************************************************/ /********************************************************************************\\ \\* Flash erase function. *\\
\\********************************************************************************/ Uint32 Flash_Erase(Uint32 addr,Uint16 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 *(Uint16 *)addr = type;
while((*(Uint16 *)addr & 0x80) != 0x80); for(i = 0; i < BLOCK_SIZE; i++) {
if(*(Uint16 *)(addr + i) != 0xffff) {
j = 0; break; }