2016-03-29 22 views
0

Bir MCF51EM256 Freescale mikro denetleyici ile çalışıyorum ve harici flaş belleği (0x20000 - 0x2FFFF) silmek için bazı sorunlarım var.Harici flash belleği silme (MCF51EM256 mikroişlemci)

Bu benim ana programdır:

void main(void) { 
    EnableInterrupts; 

    FlashInit(); 

    DisableInterrupts; 
    EraseFlash(0x020000); 
    EraseFlash(0x020800); 
    EraseFlash(0x020C00); 
    EnableInterrupts; 

    for(;;) { 
    __RESET_WATCHDOG(); /* feeds the dog */ 
    SetLED(2, 2);  // Toggle led if the program is running 
    } /* loop forever */ 
    /* please make sure that you never leave main */ 
} 

"EraseFlash()":

void EraseFlash(long addr){ 
    // The flash sector to erase is always 1 kB 

    long eraseValue = 0xFFFFFFFF; 
    Flash_Cmd((unsigned long)addr, 1, &eraseValue, 0x40); 
} 

Ve "Flash_Cmd()":

#define FLASH_MASS_ERASE_CMD 0x41 
#define FLASH_ERASE_CMD  0x40 
#define FLASH_PROGRAM_CMD  0x20 
#define FLASH_BURST_CMD  0x25 

UINT8 /*far*/ 
Flash_Cmd(UINT32 FlashAddress, 
     UINT16 FlashDataCounter, 
     UINT32 *pFlashDataPtr, 
     UINT8 FlashCommand) 
{ 
    /* Check to see if FACCERR or PVIOL is set */ 
    if (FSTAT &0x30) 
    {   
     /* Clear Flags if set*/ 
     FSTAT = 0x30; 
    } 

    if (FlashDataCounter) 
    { 
    do 
    { 
     /* Wait for the Last Busrt Command to complete */ 
     while(!(FSTAT&FSTAT_FCBEF_MASK)){};/*wait until termination*/ 

     /* Write Data into Flash*/ 
     (*((volatile unsigned long *)(FlashAddress))) = *pFlashDataPtr; 
     FlashAddress += 4; 
     pFlashDataPtr++; 

     /* Write Command */ 
     FCMD = FlashCommand; 

     /* Put FCBEF at 1 */ 
     FSTAT = FSTAT_FCBEF_MASK; 

     asm (NOP); 
     asm (NOP); 
     asm (NOP); 

     /* Check if Flash Access Error or Protection Violation Error are Set */ 
     if (FSTAT&0x30) 
     {  
      /* If so, finish the function returning 1 to indicate error */ 
      return (1); 
     } 

    }while (--FlashDataCounter); 
    } 
    /* wait for the last command to complete */ 
    while ((FSTAT&FSTAT_FCCF_MASK)==0){};/*wait until termination*/ 

    /* Return zero to indicate that the function executed OK */ 
    return (0); 
} 

Benim ulaşır asla ana (;;) döngüsü için, EraseFlash() 3 çağrısıyla engellenir.

Yalnızca iki veya daha az arama yaparsam çalışır. Örnek:

void main(void) { 
    EnableInterrupts; 

    Platform_GPIO_Init(); 
    FlashInit(); 

    DisableInterrupts; 
    EraseFlash(0x020000); 
    EraseFlash(0x020800); 
    EnableInterrupts; 

    for(;;) { 
    __RESET_WATCHDOG(); /* feeds the dog */ 
    SetLED(2, 2);  // Toggle led if the program is running 
    } /* loop forever */ 
    /* please make sure that you never leave main */ 
} 

birisi yanlış ne yapıyorum söyleyebilir misiniz? Ayrıca diğer flash bellek adresinde ve kesintileri ve devre dışı bırakılmadan denedim.

Düzenleme: fonksiyonunu anlamına Hem aramalar return 0,

teşekkür ederiz Tamam idam!

+0

[Bu] ile karşılaştırıldığında biraz daha farklı bir soru (http://stackoverflow.com/questions/36260611/erasing-external-flash) ama eminim cevap her ikisi için de aynı olacaktır. – Lundin

+0

Harici flaş bellekle ne demek istiyorsun? AFAIK bu rutinler onChip banka flaşı üzerinde çalışıyor. – LPs

cevap

0

Ben veri sayfasını kontrol ve benim flaş sürücünün başlığındaki FLASH_CLOCK değiştirdik:

(SYSTEM_CLOCK/200000)için (SYSTEM_CLOCK/400000)

önce:

Şimdi
#if (SYSTEM_CLOCK/2) > 12800000 /* 12.8 MHz */ 
    #define FLASH_CLOCK (UINT8)(((SYSTEM_CLOCK/3200000) -1) | 0x40) 
#else 
    #define FLASH_CLOCK (unsigned char)((SYSTEM_CLOCK/200000) -1)//<200KHz 
#endif 

:

#if (SYSTEM_CLOCK/2) > 12800000 /* 12.8 MHz */ 
    #define FLASH_CLOCK (UINT8)(((SYSTEM_CLOCK/3200000) -1) | 0x40) 
#else 
    #define FLASH_CLOCK (unsigned char)((SYSTEM_CLOCK/400000) -1)//<200KHz 
#endif 

Nihayet programım işe yarıyor.