Цитата(HARMHARM @ Apr 3 2009, 11:25)

Хм, если у вас контроллер работает на 72 МГц, даже не знаю что и посоветовать...
Разве что проверить типы данных.
Приведите код...
Код скопировал из даташит. DISABLE/ENABLE INTs добавил только что, правда. Сейчас с ними проверяю.
Код
typedef void (*IAP)(unsigned int [],unsigned int[]);
#define IAP_LOCATION 0x7ffffff1
#define MAX_ERASE_ATTEMPT 10
int WriteToFlash(void * ptr, int Size) {
//
const IAP iap_entry = (IAP) IAP_LOCATION;
unsigned long command[5];
unsigned long result[3] = {0xFF,0xFF,0xFF};
for ( int EraseCount = 0; EraseCount < MAX_ERASE_ATTEMPT; EraseCount++ ) {
//========================================================
// Prepare Sector for Write
command[0] = 50;
command[1] = 0x1B;
command[2] = 0x1B;
DISABLE_INTERRUPTS;
iap_entry(command,result);
ENABLE_INTERRUPTS;
if ( result[0] != 0 )
return result[0];
//=========================================================
// Erase
uart1Puts("Erasing...\n\r");
DISABLE_INTERRUPTS;
command[0] = 52;
command[1] = 0x1B;
command[2] = 0x1B;
command[4] = 72000; //150000;
iap_entry(command,result);
ENABLE_INTERRUPTS;
if ( result[0] != 0 )
return result[0];
//=========================================================
// BlankCheck
command[0] = 53;
command[1] = 0x1B;
command[2] = 0x1B;
command[4] = 72000; // 150000;
iap_entry(command,result);
if ( result[0] == 0 )
break;
uart1Puts("Blank Check failed...\n\r");
};
if ( result[0] != 0 )
return result[0];
//=========================================================
// Prepare Sector for Write
command[0] = 50;
command[1] = 0x1B;
command[2] = 0x1B;
iap_entry(command,result);
if ( result[0] != 0 )
return result[0];
//=========================================================
// Copy RAM to FLASH
command[0] = 51;
command[1] = (unsigned long) PersistentData;
command[2] = (unsigned long) ptr;
command[3] = PersistBlockSize;
command[4] = 72000;
result[0] = result[1] = result[2] = 0xFF;
iap_entry(command,result);
return result[0];
};