Цитата(GetSmart @ Jun 7 2006, 03:29)

Чую, прерывания разрешены и всё падает на ресет. Это если конечно writeflash() не кривая.
А в конце RAM зарезервированно 32 байта.
привожу свою процедуру flashWrite()
немного соптимизировал ее
1. стирание сектора включено в процедуру записи
2. массив данных во flash всегда начинается с начала сектораи размером не больше сектора
потом будет const RealByte ParamInEEPROM[2048] @ "EEPROM" = {.....}
т.е. 8K - ровно 1 сектор
Код
int flashWrite(void)
{
RealByte buffer[512/sizeof (long)];
int i,result;
__disable_interrupt();
flashParams[0] = 50; // prepare sector
flashParams[1] = 16; // start sector
flashParams[2] = 16; // end sector
iap_entry(flashParams,flashResult);
if (flashResult[0] != CMD_SUCCESS) {
__enable_interrupt();
return flashResult[0];
}
flashParams[0] = 52; // erase sector)
flashParams[1] = 16; // start sector
flashParams[2] = 16; // end sector
flashParams[3] = GetProcessorClockFreq()/1000; // cpu clock freq in KHz
iap_entry(flashParams,flashResult);
if (flashResult[0] != CMD_SUCCESS) {
__enable_interrupt();
return flashResult[0];
}
// prepare all sectors for programing
flashParams[0] = 50; // prepare sectors
flashParams[1] = 16; // start sector
flashParams[2] = 16; // last sector
iap_entry(flashParams,flashResult);
if (flashResult[0] != CMD_SUCCESS) {
__enable_interrupt();
return flashResult[0];
}
// загрузка буфера
for(i=0;i<512/sizeof (long);i++) buffer[i].i = 0xffffffff;
buffer[0].i = SensorMic.MicP1;
/* .......... */
/* здесь продолжается заполнятся массив */
/* .......... */
flashParams[0] = 51; // copy RAM to Flash
flashParams[1] = (unsigned long)ParamInEEPROM; // destination
flashParams[2] = (unsigned long)buffer; // source
flashParams[3] = 512; // byte count
flashParams[4] = GetProcessorClockFreq()/1000; // CCLK in KHz
iap_entry(flashParams,flashResult);
if (flashResult[0] != CMD_SUCCESS) {
__enable_interrupt();
return flashResult[0];
}
__enable_interrupt();
return CMD_SUCCESS;
}