Процессор lcp2478 c ядром ARM7TDMI-S. Пытаюсь сделать загрузчик для обновления ПО из программы используя команды IAP.
Этап подготовки возвращает результат выполнено. На этапе стирания - зависает. Причем не из-за while: он просто не возвращается в программу после вызова IAP-команды. Если пропустить этап стирания, то команда CopyRAMtoFLASH возвращает 0x0D (13 в десятичном). В UserManual возвращаемых значений всего 11 начиная с 0. Реально ничего в flash не записывается. В какую сторону копать?
#define USER_APPLICATION_START_SECTOR 8
#define USER_APPLICATION_END_SECTOR 27
...
int main(void){
...
while (IAP_PrepareSector(USER_APPLICATION_START_SECTOR, USER_APPLICATION_END_SECTOR));
while (IAP_EraseSector (USER_APPLICATION_START_SECTOR, USER_APPLICATION_END_SECTOR));
...
while (IAP_PrepareSector(USER_APPLICATION_START_SECTOR, USER_APPLICATION_END_SECTOR));
a = IAP_CopyRAM_ToFlash(iap_flash_address, (uint32_t) TerminalBuffer(UART_0), BINARY_DATA_BLOCK_SIZE);
buf[0] = a/10 + '0';
buf[1] = a%10 + '0';
TerminalOutput(UART_0, buf,2);
...
}
...
uint32_t IAP_CopyRAM_ToFlash (const uint32_t destination, const uint32_t source, const uint32_t length)
{
char exmpl[300] = {0};
command[0] = IAP_CMD_COPY_RAM_TO_FLASH;
command[1] = destination;
command[2] = source;
command[3] = length;
command[4] = IAP_CLK / 1000; // Fcclk in KHz
IAP_ENTRY(command, result);
return result[0];
}
uint32_t IAP_EraseSector (const uint32_t start_sector, const uint32_t end_sector)
{
if (start_sector > end_sector)
return IAP_RESULT_INVALD_PARAM;
command[0] = IAP_CMD_ERASE_SECTOR;
command[1] = start_sector;
command[2] = end_sector;
command[3] = IAP_CLK / 1000;
IAP_ENTRY(command, result);
return result[0];
}
uint32_t IAP_PrepareSector (const uint32_t start_sector, const uint32_t end_sector)
{
if (start_sector > end_sector)
return IAP_RESULT_INVALD_PARAM;
command[0] = IAP_CMD_PREPARE_SECTOR;
command[1] = start_sector;
command[2] = end_sector;
IAP_ENTRY(command, result);
return result[0];
}