Пытаюсь использовать для размещения констант флэш LPC1768 (ее там много, а ставить что-то снаружи не хочется), на базе примера EEPROM для LPC2368 слегка изменил код и подстроил его под свои нужды. На LPC2368 код работал без проблем. Сейчас возникают непонятные зависоны при стирании флэша (только при стирании, запись работает как часы). Вот мой код:
Код
#define IAP_LOCATION 0x1fff1ff1
#define EE1_SEC_L 14 //Flash sector where EEPROM begins (see UM for details)
#define EE1_SEC_H 14 //Flash sector where EEPROM ends (see UM for details)
#define EE1_ADDR_L 0x0000E000 //Must match the EE_SEC_L Flash sector start address
#define EE1_ADDR_H 0x0000EFFF //Must match the EE_SEC_H Flash sector end address
#define EE_CCLK 96000 //system clock cclk expressed in kHz (96MHz)
typedef void (*IAP)(unsigned int [],unsigned int[]);
IAP iap_entry;
TDWord EEPROM_Erase(void)
{
unsigned int command_iap[5];
unsigned int result_iap[3];
__disable_irq();
command_iap[0]=50; //prepare sectors from EE_SEC_L to EE_SEC_H for erase
command_iap[1]=EE1_SEC_L;
command_iap[2]=EE1_SEC_H;
iap_entry=(IAP) IAP_LOCATION;
iap_entry(command_iap,result_iap);
command_iap[0]=52; //erase sectors from EE_SEC_L to EE_SEC_H
command_iap[1]=EE1_SEC_L;
command_iap[2]=EE1_SEC_H;
command_iap[3]=EE_CCLK;
iap_entry=(IAP) IAP_LOCATION;
iap_entry(command_iap,result_iap);
command_iap[0]=53; //blankcheck sectors from EE_SEC_L to EE_SEC_H
command_iap[1]=EE1_SEC_L;
command_iap[2]=EE1_SEC_H;
iap_entry=(IAP) IAP_LOCATION;
iap_entry(command_iap,result_iap);
__enable_irq();
return result_iap[0];
}
#define EE1_SEC_L 14 //Flash sector where EEPROM begins (see UM for details)
#define EE1_SEC_H 14 //Flash sector where EEPROM ends (see UM for details)
#define EE1_ADDR_L 0x0000E000 //Must match the EE_SEC_L Flash sector start address
#define EE1_ADDR_H 0x0000EFFF //Must match the EE_SEC_H Flash sector end address
#define EE_CCLK 96000 //system clock cclk expressed in kHz (96MHz)
typedef void (*IAP)(unsigned int [],unsigned int[]);
IAP iap_entry;
TDWord EEPROM_Erase(void)
{
unsigned int command_iap[5];
unsigned int result_iap[3];
__disable_irq();
command_iap[0]=50; //prepare sectors from EE_SEC_L to EE_SEC_H for erase
command_iap[1]=EE1_SEC_L;
command_iap[2]=EE1_SEC_H;
iap_entry=(IAP) IAP_LOCATION;
iap_entry(command_iap,result_iap);
command_iap[0]=52; //erase sectors from EE_SEC_L to EE_SEC_H
command_iap[1]=EE1_SEC_L;
command_iap[2]=EE1_SEC_H;
command_iap[3]=EE_CCLK;
iap_entry=(IAP) IAP_LOCATION;
iap_entry(command_iap,result_iap);
command_iap[0]=53; //blankcheck sectors from EE_SEC_L to EE_SEC_H
command_iap[1]=EE1_SEC_L;
command_iap[2]=EE1_SEC_H;
iap_entry=(IAP) IAP_LOCATION;
iap_entry(command_iap,result_iap);
__enable_irq();
return result_iap[0];
}
При прохождении отладчиком не виснет, если же просто загрузить приложение, то виснет секунд на 30, потом работает нормально. Запись во флэш производится, что удивительно. Никто с подобным не сталкивался??
Заранее спасибо!!!