擦除外部FLASH

我正在使用MCF51EM256飞思卡尔微控制器,我有一些问题要将数据存储在外部闪存中以使其持久化。

我需要存储这个结构:

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; 

为此,我实现了这个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”的位置:

 #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,它导致我的项目中出现链接错误:

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

我认为它可能是存储在擦除地址中的数据,我尝试做这样的事情(而不是Flash_Erase(地址)):

 void EraseFlash(long addr) { uint32 eraseData = 0xFFFFFFFF; Flash_Cmd((uint32)addr, (uint16)1, (uint32*)&eraseData, 0x40); } 

它在第一次执行“Save_Flash_WsEnergyAcc”时有效,但我无法解释为什么它会在下次阻塞MCU。

¿有人能告诉我我做错了什么吗? 谢谢你们!

MCF51EM256飞思卡尔微控制器仅允许1024字节扇区擦除闪存。

如果每次想要写入闪存时都调用擦除function,MCU将被阻止。