删除外部FLASH [英] Erasing external FLASH

查看:335
本文介绍了删除外部FLASH的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用MCF51EM256飞思卡尔微控制器的工作,我已经在外部闪存的一些问题来存储数据,使之持久。

I'm working with a MCF51EM256 Freescale microcontroller and I've some problems to store data in the external flash memory to make it persistent.

我需要存储这个结构:

typedef struct {
  ui64_s Ea_ps; 
  ui64_s Ea_ng;  
  ui64_s Er_q1;
  ui64_s Er_q2;
  ui64_s Er_q3;
  ui64_s Er_q4;
  uint16 F_ea;
  uint16 F_er;
}Ws_EnergyAcc64;

其中:

typedef union{    
  uint64 v;
  uint32 p[2];  
} ui64_s;

typedef unsigned long long int uint64;
typedef unsigned long int uint32;
typedef unsigned short int uint16;

在为了做到这一点,我实现了这个功能:

In order to do this, I've implemented this function:

void Save_Flash_WsEnergyAcc(long addr, Ws_EnergyAcc64* Acc) {

  // WsEnergyAcc struct needs 56 bytes in Flash

  uint32 F_ea_32 = (uint32) Acc->F_ea;
  uint32 F_er_32 = (uint32) Acc->F_er;

  Flash_Erase(addr);
  Flash_Erase(addr + 4);
  Flash_Burst(addr, 2, Acc->Ea_ps.p);

  Flash_Erase(addr + 8);
  Flash_Erase(addr + 12);
  Flash_Burst(addr + 8, 2, Acc->Ea_ng.p);

  Flash_Erase(addr + 16);
  Flash_Erase(addr + 20);
  Flash_Burst(addr + 16, 2, Acc->Er_q1.p);

  Flash_Erase(addr + 24);
  Flash_Erase(addr + 28);
  Flash_Burst(addr + 24, 2, Acc->Er_q2.p);

  Flash_Erase(addr + 32);
  Flash_Erase(addr + 36);
  Flash_Burst(addr + 32, 2, Acc->Er_q3.p);

  Flash_Erase(addr + 40);
  Flash_Erase(addr + 44);
  Flash_Burst(addr + 40, 2, Acc->Er_q4.p);

  Flash_Erase(addr + 48);
  Flash_Burst(addr + 48, 2, &F_ea_32);

  Flash_Erase(addr + 52);
  Flash_Burst(addr + 52, 2, &F_er_32);

}

在哪里Flash_Burst和Flash_Erase

Where "Flash_Burst" and "Flash_Erase":

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

/* Macros to call the function using the different features */
#define Flash_Erase(Address) \
      Flash_Cmd((UINT32)Address, (UINT16)1, (UINT32*)CUSTOM_ROM_ADDRESS, FLASH_ERASE_CMD)

#define Flash_Burst(Address, Size, DataPtr) \
      Flash_Cmd((UINT32)Address, (UINT16)Size, (UINT32*)DataPtr, FLASH_BURST_CMD)

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);
}

我也定义的:

extern unsigned char __CUSTOM_ROM[];
extern unsigned char __CUSTOM_ROM_SIZE[];

#define CUSTOM_ROM_ADDRESS      (unsigned long int)__CUSTOM_ROM
#define CUSTOM_ROM_SIZE         (unsigned long int)__CUSTOM_ROM_SIZE

我不明白什么是CUSTOM_ROM_ADDRESS,并导致一个链接错误在我的项目:

I don't understand what is CUSTOM_ROM_ADDRESS, and it causes a link error in my project:

C:/Freescale/CW MCU    v10.6.4/MCU/ColdFire_Tools/Command_Line_Tools/mwldmcf|Linker|Error
>Undefined : "__CUSTOM_ROM"

我认为这可能是数据至极保存在删除地址,我trye​​d做这样的事情(而不是Flash_Erase(地址)):

I think it could be the data wich is stored in the erased address, and I tryed to do something like this (instead Flash_Erase(address)):

void EraseFlash(long addr) {

    uint32 eraseData = 0xFFFFFFFF;
    Flash_Cmd((uint32)addr, (uint16)1, (uint32*)&eraseData, 0x40);

}

它工作在Save_Flash_WsEnergyAcc的第一次执行,但我无法解释为什么它会阻止MCU的下一个时代。

It works in the first execution of "Save_Flash_WsEnergyAcc", but I cannot explain why it blocks the MCU the next times.

¿谁能告诉我,我做错了什么?
谢谢大家!

¿Can someone tell me what I'm doing wrong? Thank you all!

推荐答案

该MCF51EM256飞思卡尔微控制器只允许1024个字节擦除扇区快闪记忆体。

The MCF51EM256 Freescale microcontroller only allows erase flash memory by 1024 bytes sectors.

如果我打电话擦除我想写闪存MCU将被阻止每次运行。

If I call the Erase function each time I want to write the flash memory the MCU will be blocked.

这篇关于删除外部FLASH的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆